APK不用su的方式来获取ROOT权限

时间:2021-02-04 16:09:53

android启动过程 里有讲过,startSystemServer启动了zygote,也就是app_main.cppframeworks/base/cmds/app_main.cpp里的主函数。

但是在startSystemServer这个函数里有下面的代码

zygote    String args[] = {
            "--setuid=1000",
               .......
            "--capabilities=130104352,130104352",
 };
允许能力和有效能力分别为130104352,130104352

启动server通过Dalvik_dalvik_system_Zygote_forkAndSpecialize调到forkAndSpecializeCommon
最后用prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);和setCapabilities把能力设进去了

uid为1000, 对应system\core\include\private\android_filesystem_config.h里的AID_SYSTEM,即为system用户,具有framework中的system权限

所以zygote再创建的进程是不能分配root权限的。

如果zygote不用su的方式,如何fork一个具有root权限的进程呢?

再看ActivityManagerService.java中的startProcessLocked函数,

里面的工厂测试模式把uid设置为0想获取root权限,最终还是通过socket让zygote去fork进程,问题就来了,具有system权限的zygote,能创建root级的用户进程吗?

现在做个实验:修改startProcessLocked函数,尝试把某个应用(根据应用名字判断)的uid设置为0,看看该APK能否获得root权限,实际上和理论上一样,创建该进程失败,

分析失败的原因,是ZygoteConnection.java里判断了进程id,如果小于AID_SYSTEM(1000)则认为是非法,而zygote是具有root权限的唯一server,所以在判断的后面,根据传进来的包名(需要改动activityserver,否则传不进来),把uid和gid改为0即可

ZygoteConnection.java

 boolean runOnce() throws ZygoteInit.MethodAndArgsCaller

ActivityManagerService.java

 

http://www.cnblogs.com/innost/archive/2011/01/09/1931456.html