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

来源:互联网 发布:二维码生成算法 .net 编辑:程序博客网 时间:2024/05/16 06:53

http://blog.csdn.net/superkris/article/details/7763452


在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

0 0
原创粉丝点击