【问题标题】:How to obtain elevated privileges for Android app如何获得 Android 应用程序的提升权限
【发布时间】:2016-06-27 22:47:27
【问题描述】:

问题:

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

一些额外的细节:

  • 运行 Android API 18(无 SELinux)

我已经尝试过的事情:

1) 在java中使用su

来自this 的帖子,我曾尝试在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());
}

运行它给我:Error! Permission denied

4) 使用this 回答

使用 ExecuteAsRootBase 类我得到:Can't get root access or denied by user

5) 将应用置于/system/app

由于某种原因,这里仍然以u0_a38 运行!为了让它工作,我不得不手动将库.so 放在/system/libs 下。我还必须chmod 644 我的.apk 才能让它运行。我真的不明白为什么我没有在 root 下运行,因为当我在 apk/system/app 上使用 ls -l 时,它给了我:

-rw-r--r-- root     root      1270817 2000-01-01 01:42 com.my.app.apk

6) 将应用签名为系统应用(不在/system/app 中)

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

按照these 的说明,我能够签署并安装该应用程序。我从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 install 进行此安装,我还是继续扣动了扳机。我使用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!

所以我假设制造商提供的密钥可能不是正确的。我找到了他们here,这是制造商网站的链接。

This 可以追溯到一段时间,不确定它是否仍然相关。我很犹豫是否要删除文件的那部分,但我很可能很快就会尝试它。我看不出从packages.xml 中删除android.uid.***** 不会影响系统上已安装的应用程序。

结论:

除了用新密钥重建之外,还有什么可以做的吗?或者这几乎就是一切?

【问题讨论】:

    标签: java android permissions root


    【解决方案1】:

    我还不能发表评论,但我想知道您尝试在什么设备/操作系统上执行此操作。某些 4.4 后的 Android 版本将 SELinux 设置为 Enforcing 模式,这会阻止您似乎想要执行的某些操作。但是,如果您的设备已植根,听起来确实如此,您可以在命令行中运行 su setenforce 0,这会将 SeLinux 置于许可模式并有望解决您的问题。

    【讨论】:

    • 您是否尝试过以超级用户身份从命令行运行 chmod 命令,而不是从应用程序中运行?这是一个延伸,但您可能能够在您的应用尝试触摸它们之前从外部修改文件权限。
    • 是的,我有,而且有效。问题是当它在启动时运行或手动运行应用程序时,我需要在应用程序内执行此操作。我无法永久修改它们。如果我更改 init.rc 以便在启动时添加这些命令,则启动 img 将覆盖它。此外,它不会搜索在init.rc 之外启动时运行的其他脚本。
    • 啊,太恶心了。好吧,如果 java 中的 su 命令不起作用,我能做的最好的就是将您推荐给另一个 stackoverflow 页面:stackoverflow.com/questions/29750137/… 过去当我遇到类似问题时它对我有所帮助,而且只是轻微的修改以测试您之前的内容。
    • 如果这不起作用,您可以尝试找到一种通过 adb 永久修改文件权限的方法,这很棘手,我实际上不确定该怎么做,但我认为这个链接可能有帮助? stackoverflow.com/questions/13089694/… 但基本上通过重新安装驱动器,您可以覆盖默认权限。我不确定它是否会持续存在,或者它是否超出了您的任务范围。
    • 谢谢,我会检查idsu。至于安装和重新安装,我不得不使用它作为将我的 apk 移动到/system/app 的步骤。从adb root shell 修改文件权限不需要重新挂载,也不是持久性的。
    【解决方案2】:

    在我运行 Android 7.1.1 的 root 设备上,在 shell 上运行 su root setenforce 0 允许我的应用执行提升的特权操作,例如重启。

    【讨论】:

      猜你喜欢
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 2011-06-21
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      相关资源
      最近更新 更多