如何在android中检查root访问权限?

时间:2011-07-18 16:52:32

标签: android command root

我创建了一个检查Android手机是否已植根的方法。这完成如下

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()首先执行完美,但是当再次调用相同的方法时,超级用户会话仍在运行。有没有办法在执行方法后结束超级用户会话?

5 个答案:

答案 0 :(得分:5)

通过利用软件漏洞克服硬件保护的设备上检测到根本情况是不可靠的

充其量,您可以检测特定工具集的存在,或扫描不应存在的内容或文件中的更改 - 但需要了解给定安装应该是什么样的,并假设操作系统您用于进行检查的功能尚未修改以隐藏更改。

要进行可靠的扫描,您需要确保可信代码的运行级别低于不受信任的代码;根设备是一种从根本上打破了这种保证的设备,或者最终用户比开发人员更受信任的设备。

答案 1 :(得分:1)

在您的情况下,您应该在为返回之前完成的作业执行该过程后终止该过程。您的代码应该进行以下更改。

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身份运行身份来访问root,例如,su -c id验证命令是否已执行成功,输出包含uid=0,即 root 用户的uid。

答案 2 :(得分:0)

使用此代码:

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*/ }

答案 3 :(得分:0)

方法1:应用程序要求ROOT访问:

在您的应用级gradle构建文件中添加:

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)

答案 4 :(得分:0)

您可以通过终端命令来实现,也可以在应用程序中运行终端命令。

if [ ! -z "$(/system/bin/ps -A | grep -v grep | grep -c daemonsu)" ]; then echo "device is rooted"; else echo "device is not rooted"; fi

您的应用程序也不需要这种方式的root访问。