如何在安卓系统中检查root权限?

7

我创建了一个检查安卓手机是否已经root的方法,如下所示:

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()方法首次执行时,它能够完美地工作。但是当再次调用相同的方法时,超级用户会话仍然在运行。是否有任何方法可以在该方法执行后结束超级用户会话?


@antlersoft:你能否建议一种适合的方法来完成相同的任务? - Unnikrishnan
3
或许您对此感兴趣,这是一个名为 RootTools 的项目,您可以前往 http://code.google.com/p/roottools/ 了解更多信息。 - Badr Hari
@Badr Hari:感谢您的建议。 - Unnikrishnan
这不仅不可靠,而且在一个没有明确声明使用root权限来为用户做有益事情的应用程序中使用su进行检查很可能会导致用户将您的应用程序报告为恶意。即使他们没有报告,他们可能会使用一个su包装器来将您的应用程序列入黑名单,同时允许他们想要获得root访问权限的应用程序这样做 - 所以您可能错误地认为它没有被root,但实际上它不仅被root,而且以最常见的方式设置了root访问权限。 - Chris Stratton
你可能无法普遍地检测手机是否已经取得了root权限,但你可以通过请求并确认你的应用程序能否以root身份运行id命令来验证。例如,运行su -c id,验证命令是否成功执行并且输出包含uid=0,即root用户的UID。 - VPZ
显示剩余2条评论
5个回答

5

在硬件保护措施被软件漏洞攻击突破后,无法可靠地检测设备是否已经被root。

最多只能检测特定工具集的存在或扫描那些不应该出现的东西或文件中的更改情况,但这需要知道给定安装应该看起来像什么,并假定用于进行检查的操作系统功能未被修改以隐藏这些更改。

要可靠地扫描,必须确保受信任的代码运行在不受信任的代码之下;一个已经被root的设备就是这种保证已经被根本打破的设备,或者用户比开发人员更加受信任。


1

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

在您的应用级gradle构建文件中添加以下内容:

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

现在,

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

方法二:应用程序不需要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)

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权限,但是您应该可以通过运行su -c id命令请求并确认您的应用程序是否可以访问root,验证命令是否成功执行并且输出包含uid=0即root用户的UID。


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

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访问权限。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接