zoukankan      html  css  js  c++  java
  • 【转】Android检查手机是否被root

    目前来说Android平台并没有提供能够root检查的工具。但是我们可以通过两种方式来判断

    • 手机里面是否有su文件
    • 这个su文件是不是能够执行

    但是这两种检查方式都存在缺点。
    第一种存在误测和漏测的情况,比如su没有放到常规路径下,就容易漏掉,但是这种情况是有办法尽量规避(或者说减小误差)的,比喻运行which检查,或者遍历shell中所有的环境变量的PATH;还有一种情况是手机没有root但是存在su文件,这种情况一般出现在手机曾经被root过,但是又进行了系统还原操作。
    而第二种,有可能检查不准确,或者会有弹窗提示用户是否要授予root权限。

    一、 检查手机是否存在su文件

    private static boolean checkSuFile() {
            Process process = null;
            try {
                //   /system/xbin/which 或者  /system/bin/which
                process = Runtime.getRuntime().exec(new String[]{"which", "su"});
                BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
                if (in.readLine() != null) return true;
                return false;
            } catch (Throwable t) {
                return false;
            } finally {
                if (process != null) process.destroy();
            }
        }
    
        private static File checkRootFile() {
            File file = null;
            String[] paths = {"/sbin/su", "/system/bin/su", "/system/xbin/su", "/data/local/xbin/su", "/data/local/bin/su", "/system/sd/xbin/su",
                    "/system/bin/failsafe/su", "/data/local/su"};
            for (String path : paths) {
                file = new File(path);
                if (file.exists()) return file;
            }
            return file;
        }
    

      

    二、检查su文件是否可运行

    先看一种基于Linux的文件权限检查,看文件是否有可执行权限,这种只能检查这个文件是不是个可执行文件,比如没有root的华为Meta9手机 adb shell 下执行效果如下:

    shell@hwmt7:/system/bin $ ls -l su

    -rwxr-xr-x root shell 71428 2016-08-26 18:40 su

    上面的x表示有可执行权限。虽然如此,但是在华为Meta9上,adb shell中运行su还是会报错:error: only position independent executables (PIE) are supported. 并不知道为啥。java检查代码如下:

    /**
         * Author: liuqiang
         * Time: 2017-08-18 14:54
         * Description:基于Linux的权限检查
         * 检查su文件是否有x或者s权限
         * @param filePath su 文件的路径,比如/system/bin/su 或者/system/xbin/su
         */
        private static boolean isCanExecute(String filePath) {
            java.lang.Process process = null;
            try {
                process = Runtime.getRuntime().exec("ls -l " + filePath);
                BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
                String str = in.readLine();
                if (str != null && str.length() >= 4) {
                    char flag = str.charAt(3);
                    if (flag == 's' || flag == 'x') {
                        Runtime.getRuntime().exec("su ");
                        return true;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (process != null) {
                    process.destroy();
                }
            }
            return false;
        }

    还有一种方式就是尝试执行一下这个su文件,如果能执行成功,说明确实root了,如果执行不成功,那么理论上来说没有root。但是这个没有root只是理论上的,比如上这个手机安装了root授权管理软件,一旦请求root权限,就会弹窗提示用户是否给其授权。如果用户点击拒绝授权,那么运行到的效果,判断出来还是为非root。一般这样的root授权管理apk有:/system/app/SuperSU/SuperSU.apk 等。

    效果图:

     
    屏幕快照 2017-08-18 15.08.46.png

    Android中java测试代码如下:

    /**
         * Author: liuqiang
         * Time: 2017-08-17 18:57
         * Description: 这种方式会弹窗,如果用户点击拒绝授权那么判断依然是没有root
         */
        private static boolean checkRootExecutable() {
    
            Process process = null;
            DataOutputStream os = null;
            try {
                process = Runtime.getRuntime().exec("su");
                os = new DataOutputStream(process.getOutputStream());
                os.writeBytes("exit
    ");
                os.flush();
                int exitValue = process.waitFor();
                if (exitValue == 0) {
                    return true;
                } else {
                    return false;
                }
            } catch (Exception e) {
                Log.d("*** DEBUG ***", "Unexpected error - Here is what I know: " + e.getMessage());
                return false;
            } finally {
                try {
                    if (os != null) {
                        os.close();
                    }
                    process.destroy();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

    这里需要注意的是int exitValue = process.waitFor();这行代码。判断exitValue结果,当是0时,代表该智能设备具备最高权限。当exitValue结果不是0时,有两种情况,要么是这台设备没有被root,要么是当前应用没有root权限。所以它的返回值无法精确判定。kingRoot在设备root但是没有授权给应用时,返回值是固定的为0;但是SuperSU.apk,如果在拒绝后发挥值为1。

    三、检查手机是否存在已知的root管理软件

    像什么kingroot、SuperSU 、360Root、Root精灵、等apk是否存在。

    综上来说没好的办法来百分百确定这个手机是否root



    from : https://www.jianshu.com/p/f9f39704e30c

  • 相关阅读:
    python Matplotlib数据可视化神器安装与基本应用
    linux笔记
    appium自动化环境搭建
    C#实现局域网聊天 通讯 Socket TCP 多人
    layui 关闭弹出层方法
    allure生成漂亮的测试报告
    python内置测试框架unittest
    Python安全编程
    Python Web自动化测试
    Docker从入门到放弃
  • 原文地址:https://www.cnblogs.com/xuan52rock/p/11126360.html
Copyright © 2011-2022 走看看