在本机代码中获取android应用程序的根权限

在本机代码中获取android应用程序的根权限,android,android-ndk,root,Android,Android Ndk,Root,为了学习,我最近加入了一个android开发教程,并开发了自己的应用程序。我希望以适当的方式在代码中获得根权限。因此,不是通过调用/system/xbin/su而是通过使用类似seteuid(0)的东西。不幸的是,seteuid方法对我不起作用 我正在一个真实的设备上测试应用程序,我在这个设备上设置了根目录,启用了调试模式,我清楚地看到,当使用对/system/xbin/su的调用时,我的应用程序从系统请求根目录权限,这在seteuid和seteguid中不会发生(setuid和setguid也

为了学习,我最近加入了一个android开发教程,并开发了自己的应用程序。我希望以适当的方式在代码中获得根权限。因此,不是通过调用
/system/xbin/su
而是通过使用类似
seteuid(0)
的东西。不幸的是,seteuid方法对我不起作用

我正在一个真实的设备上测试应用程序,我在这个设备上设置了根目录,启用了调试模式,我清楚地看到,当使用对
/system/xbin/su
的调用时,我的应用程序从系统请求根目录权限,这在seteuid和seteguid中不会发生(setuid和setguid也不起作用,但我不希望它们这样做,因为它们只能降低权限)


请告诉我,在哪里可以找到合适的代码实现来请求根权限,就像顶级开发人员那样。可能是一些本机api调用?或者每个人都只是使用对
su
的调用来获得所需的访问权限?

这是Linux中提升权限的常用方法,即运行具有更高优先级的应用程序vileges而非登录用户——是在可执行文件(例如,chmod ug+s…)上设置SUID标志。这将使进程采用二进制文件所有者(通常为root)的身份,而不是登录用户的身份

在Android上,即使是在根设备上,也很难有效地做到这一点。首先,你将无法使用通常的(APK)机制安装应用程序,该机制包括具有SUID权限的二进制文件。其次,Android应用程序不是通常意义上的可执行文件——一个可执行文件可以处理所有应用程序的启动

不过,如果您想在命令行上进行实验,至少在某些文件系统位置,应该可以在二进制文件上设置SUID标志


如果你有一个有根的Android,那么很可能已经有了一些基础设施来控制权限提升。最有可能的是“su”命令会起作用(因为会有内核mods使其起作用),它将提供凭据或其他方式来控制哪些应用程序可以使用它。我相信,正如你所建议的,在根安卓上的应用程序中,调用“su”是提升权限的常用方式。然而,这充满了困难。有一个文档解释了“su”是如何使用的通常在有根的Android设备中实现,并就如何正确使用它提供一些指导。

以防发布我用Java解决问题的解决方案(此处不需要本机代码):


谢谢,我通过在应用程序中调用su进程解决了我的问题,因此基本上通过创建的“su”进程处理受保护的内容。它工作良好、稳定且快速。此外,我检查了android的su实现,尝试了一下,但失败了,可能是因为apt不像你说的那样是可执行的。好吧,无论如何,谢谢!
protected void hideRoot() throws IOException, InterruptedException {
    Process p = Runtime.getRuntime().exec("su");
    DataOutputStream dos = new DataOutputStream(p.getOutputStream());
    dos.writeBytes("mount -o remount,rw /system\n");
    dos.writeBytes("mv /system/xbin/su /system/xbin/suhidden\n");
    dos.writeBytes("exit\n");
    dos.flush();
    p.waitFor();
}