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

最も簡単なのは、次のように独自の nano "sudo" を作成することです。

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;
}

次のようにコンパイルしてインストールします。

make-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 に答える