2013-05-17 3 views
3

Когда я пытаюсь запустить команду су из моей программы, которая имеет права системы, я получил эту ошибку вернулся на STDERR:Получение ошибки «UID 1000 не допускается су» на Runtime.exec («су»)

UID 1000 не допускается су

Я устанавливаю общий идентификатор пользователя для 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; 
} 

ответ

2

У вас есть стандарт/официальный андроид программы «Су», которое не предназначено, чтобы быть пригодным для этой цели, а не одно из чего-то вроде superuser.apk, который был чтобы это разрешить.

Вы не можете (из обычного стороннего приложения) установить общий UID привилегированному пользователю, например системе или даже полупривилегированному, например оболочке.

Возможно, ваше устройство еще не было изменено, чтобы разрешить root-доступ вообще.

+0

Хорошо, это возможно. По крайней мере, ADB является root. Вы можете получить UID SYSTEM или SHELL, установив для этого общий идентификатор пользователя и подписав APK с ключом и сертификатом производителя (не проблема для меня) – slash33

+0

slash33, ладно, я сделал все это и сделал adb установить, но все равно не может su. Он говорит, что uid 1000 не разрешено su. Может быть, мне нужно как-то установить в системную папку, а не только adb install? – djdance

+0

Конечно, вы не можете - ** Андроид специально разработан, чтобы позволить вам не становиться root на производственные сборки или позволять код приложения * когда-либо выполняться как таковой на * любой * сборке. Если вы хотите попытаться использовать некоторые дыры в области безопасности, вы можете попробовать посмотреть на xda-разработчиков, но это выходит за рамки * этого * веб-сайта, который касается * разработки программного обеспечения *. –

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

компиляции и установить его так:

макияж Судо .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, и никакой дополнительной безопасности не требуется.

Смежные вопросы