Как проверить root-доступ в андроиде? - PullRequest
7 голосов
/ 18 июля 2011

Я создал способ проверки, рут-телефон рут или нет. Это делается следующим образом

public int checkrootcommand(String string) {
    // TODO Auto-generated method stub
    Process exec;
    try {

        exec = Runtime.getRuntime().exec(new String[]{"su","-c"});

        final OutputStreamWriter out = new OutputStreamWriter(exec.getOutputStream());
        out.write("exit");
        out.flush();

        Log.i(SUPER_USER_COMMAND, "su command executed successfully");
        return 0; // returns zero when the command is executed successfully
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }  
    return 1; //returns one when the command execution fails
}

Но проблема в том, что метод checkrootcommand () выполняется первым, он работает отлично, но при повторном вызове того же метода сеанс суперпользователя все еще выполняется. Есть ли способ завершить сеанс суперпользователя после выполнения метода ??

Ответы [ 4 ]

5 голосов
/ 18 июля 2011

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

В лучшем случае вы можете обнаружить наличие определенных наборов инструментов илисканировать вещи, которые не должны быть там, или изменения в файлах, которые есть - но для этого требуется знание того, как должна выглядеть данная установка, и предполагается, что функциональность ОС, которую вы используете для выполнения проверок, не была изменена дляскрыть изменения.

Для надежного сканирования необходимо убедиться, что доверенный код работает на более низком уровне, чем ненадежный код;укоренившееся устройство - это то, где эта гарантия была существенно нарушена, или когда конечному пользователю доверяют больше, чем вам, разработчику.

1 голос
/ 31 мая 2017

В вашем случае вы должны завершить процесс после его выполнения для работы, которая выполняется перед возвратом.Следующие изменения в вашем коде должны помочь:

public int checkrootcommand(String string) {
    // TODO Auto-generated method stub
    Process exec = null;
    try {

        exec = Runtime.getRuntime().exec(new String[]{"su","-c"});

        final OutputStreamWriter out = new OutputStreamWriter(exec.getOutputStream());
        out.write("exit");
        out.flush();

        Log.i(SUPER_USER_COMMAND, "su command executed successfully");
        return 0; // returns zero when the command is executed successfully
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        if (exec != null) {
            try {
                exec.destroy();
            } catch (Exception ignored) {
            }
        }
    }
    return 1; //returns one when the command execution fails
}

Возможно, вы не сможете универсально определить, является ли телефон рутованным или нет, но вы должны иметь возможность запросить, а затем подтвердить, что ваше приложение имеет доступ к root.запустив id от имени пользователя root, например, su -c id validate, если команда выполнена успешно и вывод содержит uid=0, т. е. идентификатор пользователя root .

0 голосов
/ 30 мая 2017

Метод 1: Приложение запрашивает доступ ROOT:

Добавьте это в свой файл сборки уровня приложения:

dependencies {
    compile 'eu.chainfire:libsuperuser:201501111220'
}

Сейчас,

System.out.println(Shell.Su.available());
//Outputs true if user-granted else false

Метод 2: Приложение не запрашивает ROOT:

boolean deviceisRooted() {
            String[] filespaths = {"/system/app/Superuser.apk","/sbin/su", "/system/bin/su","/system/xbin/su"};
            for (String xyz : filespaths) {
                if (new File(xyz).exists()) return true;
            }
            return false;
        }

System.out.prinln(deviceisRooted());

//Outputs true if device is ROOTED else false
//Doesn't asks user
//Also returns true IF NOT PROPERLY ROOTED (But ROOTED somehow)
0 голосов
/ 18 июля 2016

Используйте этот код:

Process executor = Runtime.getRuntime().exec("su -c ls /data/data");
executor.waitFor();
int iabd = executor.exitValue();
if(iabd != 0){ /*process exit value is not 0, so user is not root*/ }else{ /* user is root*/ }
...