场景描述:
1. 连接Android手机,adb shell find xxxx,显示adb permission denied;
2. Google显示需要运行在root权限下,adb root,无错误输出,再次adb shell find xxxx,仍显示permission denied;
3. 发现手机未获取root权限,尝试root精灵和kingroot一键root均失败。
原因:
1. adb是Android SDK自带调试工具(相关介绍:Android developer);
2. adb默认以shell权限执行(非root),即使已获取手机及root权限,也需要显示切换 adb root;
若未获取root权限,显示切换当然也是没有用的;
3. adb 获取root权限的大前提:手机已root,目前依赖root工具,而root工具一般会有试用机型系统列表,列表外的手机无法实现root。
解析:
1. 为什么要root?
Android采用Linux内核;所以同Linux一致,无root权限将无法操作部分文件(如系统文件等)。
2. “把手机root一下”,这句话应该听说很多,究竟root一下代表什么呢?
用户对手机的权限一般是普通用户,手机厂商禁止用户获取root权限,root一下,即为将用户的shell权限提升为root权限。
3. 重中之重,root的通用原理是什么?
(提前注明:搜索的资料多为2013年或之前,具体提及破解细节只适用于当时Android版本,但猜想通用原理是一致的,整理之。)
关键的 "su" 参考:Android 系统 root 破解原理分析 + Android 的提权 (Root) 原理是什么?
- 在Linux中,执行su命令输入密码即可获取root权限;在Android中,有些手机封装系统会直接去除su命令,另外的也不是通过密码来验证,而是看用户原先权限。即如果你是root,那你可以通过su切换到别的用户,比如说shell,wifi,audio什么的。但如果你是root之外的其他用户,就不能切换回root了,会提示你permission denied。
- 在Linux中,存在一种特殊权限 s , 设置SUID(意思是,执行这个文件的用户暂时拥有文件拥有者的权限)。而su的拥有者即为root,所以普通用户运行su,即可获取到root权限。
- Android同理,由于手机厂商可能封装了其他性质的su,所以首先需要确认两点:1. Android手机中存在su命令;2. su命令拥有者为root,执行权限为s。
所以root的重点在于要想办法替换并执行su。
cp /data/tmp/su /system/bin/ #copy su 到/system/分区chown root:root su #su的所有者置成root chmod 4775 /system/bin/su #把su置成-rwsr-xr-
以上操作都需要root权限,至此陷入循环,常规途径无法破解。
非常规途径(adbd漏洞为例)参考:Android 系统 root 破解原理分析(续)
Android init进程以root权限启动,从而启动init.rc及其配置的系统服务(包括adbd),adbd在执行以下两句命令后变为shell权限
/* then switch user and group to "shell" */ setgid(AID_SHELL); setuid(AID_SHELL);
破解的方法,在于让这两句命令执行失败,切换为shell失败则保留为原始的root权限。
(但实际在Android4.2以后su命令的执行过程有修改,5.X之后也有变动,具体资料未梳理明了,暂保留以上)