4.2.2(Jelly Bean)上root的方法比较简单,调用su命令就可以获取到root权限并执行一些命令。但是在Android 4.3+到5.0,Google为这种root方法设置了层层障碍:
1. su命令源码中添加了uid检验,只允许shell/root用户进行调用
2. Zygote源码中添加了添加DropCapabilitiesBoundingSet屏蔽APP了setuid的功能
3. adb源码中添加了添加should_drop_privileges屏蔽adb了setuid的功能(对于userdebug/eng版本该函数未被调用)
4. 开启了SELinux安全模块,1,2条都满足情况下也会被中断su。
针对前三项的解决方法是按照以下diff文件进行修改代码并重新编译Android系统:
- su命令源码中添加了uid检验,只允许shell/root用户进行调用
- Zygote源码中添加了添加DropCapabilitiesBoundingSet屏蔽APP了setuid的功能
- adb源码中添加了添加should_drop_privileges屏蔽adb了setuid的功能(对于userdebug/eng版本该函数未被调用)
以上三项需要改动代码并重新编译Android系统。
1,2,3代码修改的diff文件:
设置SELinux权限为Permissive
我是尽量把事情简单化,这次这里讨论的是SELinux,其实现原理会比较复杂,我这里只是简单记录在Android 5.0 + Linux 3.4如何将SELinux降级,这么做的原因是实现:APP可以调用su命令最终实现运行一些命令。
SELinux常用状态有两个 和 ,后者会使APP无法调用su命令,前者可以。
1. 查询当前SELinux状态:
运行该命令后,会输出当前系统的SELinux权限 和 。
2. 在eng/userdebug版本 将SELinux 模式调整到Permissive mode
- 临时方案:运行如下命令(无需重启系统,即刻见效)
- 长久方案:在启动参数中添加
root不成功主要是因为没有改全这些项,有其中一项没有改好都会造成root不成功。这里把每项没有改好会造成的问题列出来以供参考。
安装运行 HelloRoot App,这是一个协助查看是否能获取root权限的小工具。
查看HelloRoot的Application user id
其中就是HelloRoot的Application user id了,这个id在下面步骤中会用到;
- 切换到用户下并运行命令
-
不正常的话会出现如下错误:
- 这个属于u0_a50对su无可执行权限,说明 中需要改的内容没有改或者是没有改成功。
- 这个属于su不允许su和shell以外的用户(比如u0_a50)调用,说明 中需要改的内容没有改或者是没有改成功。
点击CheckRoot按钮,判断App是否可以root,如果Log信息如下:
A. 出现这个问题是由于没有将SELinux关闭,需要按照以下方法查看
需要按照「设置SELinux权限为Permissive」进行设置。
B. 无法setuid的限制修改
和修改。