目前来说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\n");
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

【转】Android检查手机是否被root的更多相关文章

  1. Android 检查手机上是否安装了指定的软件(根据包名检测)

    Android检查手机上是否安装了指定的软件(根据包名检测) /** * 检查手机上是否安装了指定的软件 * @param context * @param packageName * @return ...

  2. Android检查手机上是否安装了第三方软件的方法------本文以百度地图为例

    package com.example.myapi.thirdbaidumap; import java.net.URISyntaxException; import java.util.ArrayL ...

  3. Android 检查手机网络是否可用

    添加网络状态权限 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 代 ...

  4. 怎样检查手机是否root成功

    怎样检查手机是否root成功 浏览:154361 | 更新:2011-01-20 13:10 | 标签:root 总有人以为,root后就可以删除自带程序了,这个想法也对也不对,想删除自带的软件,确实 ...

  5. Android 判定手机是否root

    Android获取手机root的状态 package com.app.demo; import java.io.File; import android.app.Activity; import an ...

  6. android推断手机是否root

    关于推断手机是否已经root的方法.假设app有一些特殊功能须要root权限,则须要推断是否root. 比方一些市场下载完app后自己主动安装. /** * @author Kevin Kowalew ...

  7. Android使用adb工具及root权限完成手机抓包

    1.环境准备/注意: 手机要求已经root. 首先需要配置JDK环境变量,这里主要讲解抓包,JDK环境变量配置跳过. 将包内附带的adb.zip解压到C盘根目录.  整个操作过程都需要用手机用数据线连 ...

  8. android 检查网络连接状态实现步骤

    获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:name="android.permission.AC ...

  9. 如何开启红米手机4X的ROOT超级权限

    红米手机4X通过什么方法拥有了root权限?大家都清楚,Android机器有root权限,如果手机拥有了root相关权限,可以实现更强的功能,举个栗子大家公司的营销部门同事,使用大多数营销软件都需要在 ...

随机推荐

  1. 用PL/SQL工具连接Oracle数据库的时报错:ORA-12638: 身份证明检索失败的解决方法

    本地客户端用PLSQL Developer连接远程数据库时提示: ORA-12638: 身份证明检索失败!!! 解决方法一: 此目录下F:\myorcl\product\11.2.0\client_1 ...

  2. rpm与yum软件管理

    一.rpm 简介 这是一个数据库管理工具,可以通过读取数据库,判断软件是否已经安装,如果已经安装可以读取出来所有文件的所在位置等,并可以实现删除这些文件. rpm:RPM is Redhat Pack ...

  3. c++第四次作业

    继承与派生--访问控制 一.知识要点 (一)知识回顾: 基类的成员可以有public.protected.private三种访问属性.基类的自身成员可以对基类中任何一个其他成员进行访问,但是通过基类的 ...

  4. new 运算符的原理

    关于 new 运算符的原理: 1.红宝书上解释: (1)创建一个新对象 (2)将构造函数的作用域赋给新对象 (3)执行构造函数中的代码 (4)返回新对象 2.MDN上的解释: (1)一个继承自 Foo ...

  5. Spring源码窥探之:ImportBeanDefinitionRegistrar

    1. 编写实现ImportBeanDefinitionRegistrar的类 /** * description * * @author 70KG * @date 2018/11/13 */ publ ...

  6. 2019/8/20 Test

    题目 简述 做法 \(BSOJ2237\) 求\(\displaystyle{k\in G:\sum_{i\in G\vee j\in G}\frac{C^k_{i,j}}{C_{i,j}}}\),其 ...

  7. CUDA并行程序设计 开发环境搭建与远程调试

    课题需要用到GPU加速.目前使用的台式电脑只有核心显卡,而实验室有一台服务器装有NVIDIA GTX980独显.因此,想搭建一个CUDA的开发环境,来实现在台式机上面开发cuda程序,程序在服务器而不 ...

  8. Kafka ISR and AR HW 、 LEO

    相信大家已经对 kafka 的基本概念已经有一定的了解了,下面直接来分析一下 ISR 和 AR 的概念. 0|1ISR and AR 简单来说,分区中的所有副本统称为 AR (Assigned Rep ...

  9. mage Ansible学习1 常用模块

    一.Ansible特点 二.Ansible架构 1.core modules实现常用模块 2.Custom modules实现自定义模块 3.Connection Plugins 连接插件,可通过SS ...

  10. 【洛谷P4245】 【模板】任意模数NTT

    三模数 NTT,感觉不是很难写 $?$ 代码借鉴的 https://www.cnblogs.com/Mychael/p/9297652.html code: #include <bits/std ...