在Android应用程序上提升权限

时间:2016-06-27 22:47:28

标签: java android permissions root

问题:

我需要在root设备上运行一些需要更高权限的命令。例如,我们可以说chmod 777或访问权限为--w-------的文件(如果权限为--w-----w-则表示app正在运行为其他组,则会有效)。

一些额外的细节:

  • 运行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下运行,因为我在ls -l apk /system/app使用了-rw-r--r-- root root 1270817 2000-01-01 01:42 com.my.app.apk 它给了我:

/system/app

6)将应用程序签名为系统应用程序(不在ps中)

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

按照these的说明,我可以签名并安装该应用。我从adb shell调用u0_a38来检查它是否以root身份运行,但发现它在android:sharedUserId="android.uid.shared"下运行。

注意:即使在签名后作为系统应用安装,我也无法使用Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]安装应用,因为它给了我:/system/app。因此,作为系统应用程序签名的应用程序会从清单中省略此行。

7)在ls -l

中放置已签名的系统应用

5 中的完全相同。

当我在/system/app输入-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) ,我知道它实际上是以:

运行
android:sharedUserId="android.uid.system"

8)无论错误如何设置adb install

所以即使我无法使用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! ,重新启动设备以让系统将其卸载。然后我在启动时遇到了这个错误:

android.uid.*****

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

This可以追溯到一段时间,不确定它是否仍然相关。我对删除该部分文件犹豫不决,但我很可能很快就会尝试删除。我不知道如何从packages.xml中移除$this->_defaultOrderBy = 'a.some_date'; $this->_defaultOrderWay = 'ASC'; 不会影响已安装在系统上的应用。

结论:

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

2 个答案:

答案 0 :(得分:0)

我无法发表评论,但我想知道您尝试执行此操作的设备/操作系统。一些4.4版本的Android在执行模式下有SELinux,这会阻止你似乎想做的一些操作。但是如果您的设备是root用户,听起来就是这样,您可以在命令行中运行su setenforce 0,这将使SeLinux处于许可模式并希望解决您的问题。

答案 1 :(得分:0)

在运行Android 7.1.1的root设备上,在shell上运行{ "kind": "youtube#videoListResponse", "etag": "\"...\"", "pageInfo": { "totalResults": 1, "resultsPerPage": 1 }, "items": [ { "kind": "youtube#video", "etag": "\"...\"", "id": "...", "snippet": { "publishedAt": "...", "channelId": "...", "title": "...", "description": "...", "thumbnails": { ... }, "channelTitle": "...", "tags": [ ... ], "categoryId": "...", "liveBroadcastContent": "...", "localized": { "title": "...", "description": "..." }, "defaultAudioLanguage": "..." } } ] } 允许我的应用执行提升的特权操作,例如重启。