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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值