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的角度来看
在Linux中有这样的一个标志位-rw
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目录下,具体位置为:
看到su文件的权限为 -rwxr-xr-x,不是我们想要的
-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 之前即可;