这回说一下su程序和Superuser.apk是如何配合让APK运行时具有root权限的。看这篇文章之前,先看一下这一篇:
http://blog.csdn.net/a345017062/archive/2011/05/24/6441986.aspx
1、APK中调用su命令
2、su检索数据库(/data/data/com.koushikdutta.superuser/databases/superuser.sqlite),如果找到记录的话,说明当前进程已经被用户允许获取ROOT权限,则进行第4步。
3、如果没有检索到的话,su会通过am start命令打开Superuser.apk中的SuperuserRequestActivity:
sprintf(sysCmd, "am start -a android.intent.action.MAIN -n com.koushikdutta.superuser/com.koushikdutta.superuser.SuperuserRequestActivity --ei uid %d --ei pid %d > /dev/null", g_puid, ppid); if (system(sysCmd)) return executionFailure("am.");
然后进入循环等待,每隔一秒检索一次数据库是否有更新,等待的时间是10秒:
for (i = 0; i < 10; i++) { sleep(1); // 0 means waiting for user input // > 0 means yes/always // < 0 means no int checkResult = checkWhitelist(); ... ... }
而SuperuserRequestActivity会显示界面要求用户选择是否同意进程获取ROOT权限。用户同意的话,就会把当前进程ID加入数据库,并退出Activity。否则,跳到第5步。
4、su在数据库中检索到进程ID的话,说明当前进程已经被用户允许获取ROOT权限,则改变当前进程的用户ID和组ID:
if(setgid(gid) || setuid(uid)) return permissionDenied();
5、命令执行完毕,进程结束。
另外,安装在系统中的APK每次运行时所使用的进程ID号是固定的。