在本机代码中获取Android应用程序的root权限

时间:2017-09-01 20:57:11

标签: android android-ndk root

我最近跳进了一个Android开发教程并为了学习而做了我自己的应用程序。我希望以正确的方式在我的代码中获得root权限。所以不是通过调用/system/xbin/su而是使用类似seteuid(0)的内容。不幸的是,seteuid方法对我不起作用。

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

请建议在哪里寻找适当的代码实现来请求root权限,就像它会做一流的开发人员一样。也许一些原生的api电话?或者每个人都只是使用su来获取所需的访问权限吗?

2 个答案:

答案 0 :(得分:1)

以防万一我用Java解决问题的解决方案(这里不需要本机代码):

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();
}

答案 1 :(得分:0)

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

即使在root设备上,这在Android上有效也很棘手。首先,您无法使用包含具有SUID权限的二进制文件的常用(APK)机制来安装应用程序。其次,Android应用程序不是通常意义上的可执行文件 - 单个可执行文件处理所有应用程序的启动。

但是,如果你想在命令行上进行试验,应该可以在二进制文件上设置SUID标志,至少在某些文件系统位置。

如果你有一个有根的Android,那么很可能已经有一些基础设施来控制权限提升。最有可能的是" su"命令将起作用(因为将有内核模块使其工作),它将提供凭据或以其他方式控制哪些应用程序可以使用它。我相信,正如你的建议,打电话给" su"是在root用户Android上的应用程序中进行权限提升的常用方法。然而,它充满了困难。有一份文件https://su.chainfire.eu/解释了" su"通常在有根的Android设备中实现,并提供有关如何正确使用它的一些指导。