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

Getting root permissions on android app within native code

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

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

请就在哪里寻找正确的代码实现来请求 root 权限提出建议,就像一流的开发人员所做的那样。也许一些本地 api 调用?还是每个人都只是使用对 su 的调用来获得所需的访问权限?

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

这在 Android 上很难有效地完成,即使是在已获得 root 权限的设备上也是如此。首先,您将无法使用包含具有 SUID 权限的二进制文件的常用 (APK) 机制安装应用程序。其次,Android 应用程序不是通常意义上的可执行文件——一个可执行文件处理所有应用程序的启动。

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

如果您有 root Android,那么很可能已经有一些基础设施可以控制权限提升。 "su" 命令很可能会起作用(因为会有内核模组使其起作用),并且会通过凭据或其他方式提供它来控制哪些应用程序可以使用它。我相信,正如您所建议的那样,调用 "su" 是在 root Android 上的应用程序中进行权限提升的常用方法。然而,它充满了困难。有一份文档 https://su.chainfire.eu/ 解释了 "su" 通常如何在已获得 root 权限的 Android 设备中实施,并提供了一些有关如何正确使用它的指导。

以防万一发布我在 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();
}