如何获取Android应用程序的提升权限

7

问题:

我需要从一个已经root的设备上的应用程序运行一些需要更高权限的命令,比如说chmod 777或访问一个文件,其权限为--w-------(如果权限为--w-----w-,则可以工作,表示应用程序正在作为其他组运行)。

一些额外的细节:

  • 运行Android API 18(没有SELinux)

我已经尝试过的事情:

1) 从Java中使用su

这个帖子中,我尝试像下面这样在java中使用su

Process su = null;
try {
    su = Runtime.getRuntime().exec("su");
    su.getOutputStream().write("chmod 777 file\n".getBytes());
    su.getOutputStream().write("exit\n".getBytes());
    su.waitFor();
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (su != null) {
        su.destroy();
    }
}

没有任何错误被抛出,但是这个操作没有任何作用。 2) 从Java使用 setWritable() 方法:
boolean ret = file.setWritable(true, false);

这里,ret = false表示它失败了。 3) 使用RootTools库:
Command cmd = new Command(0, "chmod 202 /sys/class/gpio/export");
try {
    RootShell.getShell(true).add(cmd);
} catch (Exception e) {
    Log.d(TAG,e.getMessage());
}

运行此命令会出现:错误!权限被拒绝

4) 使用这个答案

使用类ExecuteAsRootBase会得到:无法获得root权限或被用户拒绝

5) 将应用程序放置在/system/app

由于某种原因,仍然在此处作为u0_a38运行!为了使其正常工作,我必须手动将库.so放置在/system/libs下。我还必须chmod 644我的.apk以允许它运行。我不太明白为什么我没有以root身份运行,因为当我在/system/app上使用ls -l查看我的apk时,它给了我:

-rw-r--r-- root     root      1270817 2000-01-01 01:42 com.my.app.apk
6) 将应用程序签署为系统应用程序(不在/system/app中)

这是我尝试的最后一件事。

按照这些说明,我能够签署并安装该应用程序。我从adb shell调用了ps以检查它是否是以root身份运行,结果发现它是在u0_a38下运行。

注意:即使在签名后将其安装为系统应用程序,我也无法使用android:sharedUserId="android.uid.shared"安装应用程序,因为它会给我返回:Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]。因此,签署为系统应用程序的应用程序已从清单中省略了此行。

7) 将已签名的系统应用程序放置在/system/app

5完全相同。

当我在/system/app中输入ls -l时,我得到:

-rw------- root root 1303459 2000-01-01 01:02 com.my.app.apk

然而,从应用程序内运行"id",我知道它实际上是以以下身份运行的:

uid=10038(u0_a38) gid=10038(u0_a38) groups=1015(sdcard_rw),1028(sdcard_r),50038(all_a38)
8) 设置android:sharedUserId="android.uid.system",无论是否出现错误

即使由于错误:Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE],我仍然决定继续安装。我使用adb push.apk文件放入/system/app中,然后手动将本地库添加到/system/libs中,重新启动设备以让系统卸载它。然后我在启动时遇到了这个错误:

W/PackageManager( 2652): Signature mismatch for shared user : SharedUserSetting{411d82d8 android.uid.system/1000}
D/PackageManager( 2652): No files in app dir /vendor/app
E/PackageManager( 2652): Package com.my.app has no signatures that match those in shared user android.uid.system; ignoring!

所以我假设制造商提供的密钥可能不正确。我在制造商网站找到了这里的密钥。

或者

这个是一段时间以前的内容,不确定现在是否仍然有用。我不想只是删除文件中的那部分,但很快我很可能会尝试这样做。我不知道从packages.xml中删除android.uid.*****不会对系统上已安装的应用产生影响。

结论:

除了使用新密钥重新构建,还有其他可以做的吗?还是这基本上就是全部内容了?

2个回答

0
在我的已root的Android 7.1.1设备上,通过在shell中运行su root setenforce 0命令,允许我的应用程序执行提升的特权操作,例如重新启动。

0

我还不能发表评论,但我想知道您正在尝试在哪个设备/操作系统上执行此操作。一些 Android 4.4 版本之后的系统处于强制执行模式下,其中会阻止您似乎想要执行的某些操作。但如果您已经获取了 root 权限,就可以在命令行中运行 su setenforce 0,将 SeLinux 设置为宽容模式,希望解决您的问题。


你尝试过在命令行中以超级用户身份运行chmod命令,而不是从应用程序内部运行吗?这很困难,但你可能能够在应用程序尝试访问这些文件之前,在外部修改文件权限。 - gabe3vino
是的,我已经做到了,并且它可以工作。问题是我需要在应用程序运行时从内部执行它,无论是在启动时还是手动运行应用程序时。我不能永久修改它们。如果我更改init.rc以便在启动时添加这些命令,则启动映像将覆盖它。此外,它不会搜索其他脚本以在init.rc之外的启动时运行。 - Stephan GM
谢谢,我将使用 su 检查 id。至于安装和重新挂载,我必须将其用作将我的 apk 移动到 /system/app 的步骤。从 adb root shell 修改文件权限不需要重新挂载,也不是永久性的。 - Stephan GM
在程序中调用“id”会返回uid=10038(u0_a38) gid=10038(u0_a38) groups=1015(sdcard_rw),1028(sdcard_r),50038(all_a38)。但是调用su "id"则没有任何返回。 - Stephan GM
当时我没有网站权限在OP的帖子下发表评论,但我想尝试帮助他们解决这个问题。当时我认为这应该是可以的,因为这个网站的宗旨就是讨论和帮助解决问题。我认为只有在我们能够将这个评论链移动到OP的帖子下面,并且一些有关解决问题的好的讨论已经进行了,删除这个“答案”帖子才是可以接受的。 - gabe3vino
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接