我正在调查在Java Android应用程序和/或自己的JNI中获取超级用户权限的可能方法。众所周知的答案似乎是,只能从那里运行“su”子shell和命令行命令,既不整洁也不实用。我愿意接受这个决议,但我仍然希望听到关于这个“假设”情景的意见。
通过java.com.android.server.am.ActivityManagerService
,java.android.os.Process
和dalvik_system_Zygote.cpp
文件附近的Android来源进行阅读,在我看来,在应用程序启动期间,会检查应用程序记录的UID和( )GID(s)和所有这些值通过套接字传递给Zygote。 Z随后挑选数据并将其传递给setuid()
fork()
之后的--setuid=0
--setgid=0
调用,无需进一步检查。因此,在我看来,如果更改了活动管理器路径,将{{1}}和{{1}}简单地传递给Zygote套接字应该会导致使用根UID运行我的活动。
这一切看起来都太简单了,我怀疑沿途会出现问题。不幸的是,对于像我这样没有经验的程序员实际去尝试,有太多的代码和新东西。有没有人这样走过,或者有什么明显的原因导致这不起作用?
答案 0 :(得分:2)
我想我刚刚找到了自己问题的答案。积分给@Chris Stratton,他指出我使用模拟器,并指出了这种情况会有多荒谬。
密钥位于我看不到的地方,在之间通过Zygote套接字发送命令和Zygote二进制文件本身。检查发生的地点是com.android.internal.os.ZygoteConnection
,方法applyUidSecurityPolicy
。如果调用者进程属于root,则可能确实要求生成的UID为零(或者其他任何事情)。普通用户也可以使用套接字,但要求新的UID或GID会产生ZygoteSecurityException
。