1: Android 设备被root 的含义是什么?

在linux中,登录系统后,需要输入用户名和密码,验证通过之后,用户登录shell,或得usserid和groupid,如果userid和groupid为root,表示此时的用户具备root权限;

      在android中,开发板被root了,即表示用户可以通过某种方式得到root权限,可以以root的身份操控板子;

     在android中,用户和板子打交道的途径有2中,一种是通过APK,另一种是adb命令;APK在运行时,会根据其签名和sharduserid分配不同的userid值,但是一般最高权限也就是system级别,目前没有看到到root级别的;另一种通过adb,在终端出入id,会显示userid和groupid信息;adb交互的方式适合开发人员,作为用户还是会喜欢apk的方式,希望运行的apk能被分配到root的userid;

2:用户如何得到root 权限,从APK的角度来看

sr-x-r-x,s是sticky bit,属于linux权限管理的知识,具体的可以查看举个具体例子来说明sticky bit的含义;

0 表示root,这里su的userid和groupid都为root;

这里sticky bit表示的含义是,su运行所在的进程,其userid 和groupid 为root;

    我们看到su的第三组权限为r-x,表示非root用户可以执行su文件;让su文件成功运行之后,su程序就是root用户,具备root权限,这样对su发送命令,就等价于作为root用户在做事情了;这样只要用户可以执行su文件就好;

    所以用户获取root 权限的步骤是:

    1:su的权限带有sticky bit;即su的权限为4755

    2:对su的源文件进行修改;将修改好,编译过的su文件push到system/xbin 目录下;

        修改方法,将if (myuid != AID_ROOT ) 如下图所示,屏蔽掉,因为如果是普通用户,是无法执行su文件的,中途会被return;


     简单的讲,用户可以获取root权限的本质,就是在板子上植入一个具备4755权限的”木马“su文件;

    

3: 在VT6078 上让普通APK获取root权限的实验过程;

     步骤一:在VT6078 中执行mount -o remount rw /; 使板子上的目录权限为可读可写;

     步骤二:将修改过的su文件push到板子中,命令为adb push su /system/xbin/

     步骤三:将/system/xbin/su 文件的权限修改为带sticky bit,命令为chmod 4755 /system/xbin/su

     步骤四:在板子上执行which su, 查看当前运行的su文件是不是为/system/xbin/su ,如果不是修改;

                  在VT6078的板子中,which su执行时,用的是/bin/su 文件。原因是


    /bin 排在/system/xbin前面;

                解决方案是将/bin/su 删除,因为/bin/su 是busybox的软连接;

    步骤五:写APK测试,看APK是否可以有root权限;

    主要代码如下:


   结果会在result字串中返回,例如调动该函数,传入的string为"adb devices", 通过log 打印result字串,如果成功,则log如下:


4:  如何不像第3部分那样,手动修改板子,让APK获取root权限?

    我们在第3部分看到了,在终端的手动操作,让APK获取root权限,这样做,如果是对客户,则是一个不成型的产品,那么如何让板子一启动之后就有这样的权限呢?

      先来看看要让APK在板子上获取root权限需要哪些条件

     条件一: 一个修改好的su文件  

     条件二:su文件的权限为4755

     条件三:在板子中/system/xbin/su 文件为首要执行文件;

      针对以上3个条件,我有2个修改思路

       思路一:针对以上3个条件,修改编译好之后out目录;

      我们知道刷到板子中的rom,在android源码中,都是来自编译好的out目录;那么修改out目录中对应的内容,最后大打包成rom,将rom放给客户即可;这样从客户的角度来看,是一个完全的产品;

      修改一:一个修改好的su文件--- 修改android 源码system/extras/su/su.c 文件,编译即可

      修改二:su 文件的权限为4755---  su,c 文件编译好之后,在out目录下,具体位置为: 

-rw s r-x-r-x, 通过命令chmod 4755 su 即可解决问题;

      修改三:删除/bin/su 文件,在板子中/bin/su文件对应的out目录的文件是

      我们只要将这个文件删除即可;

      将上面修改过的out目录在打包刷机即可,就不需要我们在板子运行之后,手动修改了;

       思路二:针对以上3个条件,修改Android源码,让APK在板子上可以获得root权限;

      从客户的角度来看,思路一可以解决问题,但是从研发人员的角度来看,没有根本的解决问题;能解决问题的还是源码,怎么解决?

      回答以下3个问题:

 条件一: 一个修改好的su文件  ,如何修改源码?

          很简单,修改 system/extras/su/su.c 文件即可;

      达到  条件二:su文件的权限为4755,如何修改源码?

          在Android中,关于文件以及目录的权限都定义在 system/core/include/private/android_filesystem_config.h目录中;将其中/system/xbin/su 的权限定义为004755即可;

       达到  条件三:在板子中/system/xbin/su 文件为首要执行文件,如何修改源码?

           在android中,PATH的定义在init.rc文件,中将/system/xbin/su 的定义放到/bin 之前即可;