Android 我可以让受精卵以root身份运行我的应用程序吗?

Android 我可以让受精卵以root身份运行我的应用程序吗?,android,root,Android,Root,我正在研究在Java Android应用程序和/或它自己的JNI中获得超级用户权限的可能方法。众所周知的答案似乎是,只能从那里运行“su”子shell和命令行命令,这既不整洁也不实用。我愿意接受这个决议,但我还是想听听大家对“如果”的看法 通过阅读java.com.Android.server.am.ActivityManagerService、java.Android.os.Process和dalvik_system_Zygote.cpp文件附近的Android源代码,在我看来,在应用程序启动

我正在研究在Java Android应用程序和/或它自己的JNI中获得超级用户权限的可能方法。众所周知的答案似乎是,只能从那里运行“su”子shell和命令行命令,这既不整洁也不实用。我愿意接受这个决议,但我还是想听听大家对“如果”的看法

通过阅读
java.com.Android.server.am.ActivityManagerService
java.Android.os.Process
dalvik_system_Zygote.cpp
文件附近的Android源代码,在我看来,在应用程序启动期间,应用程序记录会检查UID和(一系列)GID所有这些值都通过一个套接字传递给受精卵。Z随后拾取数据并将其传递到
setuid()
调用后的
fork()
中,无需进一步检查。因此,在我看来,如果活动管理器路径被改变,简单地将
--setuid=0
--setgid=0
传递到受精卵套接字应该会导致使用根UID运行我的活动


这一切似乎都太简单了,我怀疑在这个过程中会出现一些问题。不幸的是,对于像我这样没有经验的程序员来说,有太多的代码和新东西需要去尝试。有人这样做了吗,或者有什么明显的原因说明这不起作用吗?

我想我刚刚找到了我自己问题的答案。归功于@Chris Stratton,他向我指出了如何使用模拟器,并指出这种情况是多么荒谬


钥匙在一个我没有看的地方,在通过受精卵套接字发送命令和受精卵二进制本身之间。检查发生的点是
com.android.internal.os.ZygoteConnection
,方法
applyUidSecurityPolicy
。如果调用者进程属于root,那么可能确实会请求spawn的UID为零(或者其他任何东西)。普通用户也可以使用该套接字,但请求新的UID或GID会导致出现
ZygoteSecurityException

关于将应用程序作为root用户运行的问题,在emulator上试用如何?如果您不想重建Android(可能需要一段时间),您可以使用ActivityManager或Zygote上的(java或本机)调试器来更改通过套接字发送/接收的内容,以便进行实验。哦,我知道我不清楚。我当然不想为了这个目的重建Android。我的意思是绕过通过意图启动应用程序的便捷方式,直接从我自己的应用程序与受精卵通信。我的假设是活动管理器也没有根权限(或者我实际上不需要它们来使用套接字)。如果我在这一点上错了,请纠正我。我非常确定ActivityManager需要普通应用程序无法使用的权限,如果它实际上是告诉zygote以什么用户ID运行某个东西的话。或者你发现了一个在过去三年中没有人想到的巨大的安全漏洞,这虽然不是不可能,但似乎不太可能。