3

当我尝试从具有系统权限的程序中运行 su 命令时,我在 stderr 上返回了此错误:

uid 1000 不允许 su

我将共享 uid 设置为 android.uid.system 或 android.uid.shell 但它不会改变任何事情。该设备据称已植根。我真的不明白会发生什么。

这是代码:

private boolean runAsRoot(String cmd, File workdir) throws IOException {
    Log.i(LOG_TAG, "Execute command as root: " + cmd);
    Process p = Runtime.getRuntime().exec(new String[] {"su", "-c", cmd});
    if (p == null) {
        Log.e(LOG_TAG, "cannot create process for " + cmd);
        return false;
    }

    int exit = -1;
    try {
        exit = p.waitFor();

        InputStreamReader isr;
        if (exit == 0) {
            isr = new InputStreamReader(p.getInputStream());
        } else {
            isr = new InputStreamReader(p.getErrorStream());
        }

        BufferedReader br = new BufferedReader(isr);
        StringBuilder sb = new StringBuilder();

        String line;
        while ((line = br.readLine()) != null) {
            if (sb.length() > 0) {
                sb.append('\n');
            }
            sb.append(line);
        }

        String string = sb.toString();

        Log.l(LOG_TAG, exit == 0 ? Level.INFO : Level.SEVERE, string);

    } catch (InterruptedException e) {
        Log.e(LOG_TAG, e);
    }

    return exit == 0;
}
4

2 回答 2

3

最简单的方法是像这样构建自己的纳米“sudo”:

须藤.c

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main(int argc, char *argv[], char *envp[]) {
    int i;
    int n = 1;
    for (i = 1; i < argc; i++) {
        n += strlen(argv[i]) + 1;
    }
    char buf[n + 2];
    char* p = buf;
    for (i = 1; i < argc; i++) {
        strcpy(p, argv[i]);
        p += strlen(argv[i]);
        *p++ = i == argc - 1 ? 0 : ' ';
    }
    *p++ = 0;
    char* a[] = {"/system/bin/sh", "-c", buf, NULL};
    execve("/system/bin/sh", a, envp);
    fprintf(stderr, "sudo: /system/bin/sh  error:%s\n", strerror(errno));
    return 1;
}

像这样编译和安装它:

使-sudo.sh

export NDK_ROOT=~/<path to android-ndk>
export GCC=$NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc
export SYS_ROOT=$NDK_ROOT/platforms/android-17/arch-arm
$GCC --sysroot $SYS_ROOT ./sudo.c -o ./sudo
adb root
adb shell "mount -o rw,remount /system"
adb shell "rm /system/xbin/sudo"
adb push  sudo /system/xbin/
adb shell "chmod 06755 /system/xbin/sudo"
adb shell "ls -l /system/xbin/sudo"
adb remount
rm ./sudo

警告: 这是一种简单但危险的方法,因为没有 sudoers 文件或任何其他黑/白列表允许所有其他应用程序使用 sudo。它对我有用,因为我的应用程序是嵌入式 Android 上唯一的应用程序,不需要额外的安全性。

于 2014-06-05T00:32:08.370 回答
3

您有一个标准/官方的 android 'su' 程序,它不打算用于此目的,而不是来自像 superuser.apk 之类的已修改以允许此目的的程序。

您不能(从普通的第 3 方应用程序)将共享 UID 设置为特权用户,例如系统,甚至是半特权用户,例如 shell。

您的设备可能尚未经过修改以完全允许 ​​root 访问。

于 2013-05-17T15:30:21.927 回答