简书链接:检测具有root权限执行几种方法 文章字数:244,阅读全文大约需要1分钟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 package sg.vantagepoint.util; import android.os.Build; import java.io.File; public class RootDetection { public RootDetection() { super(); } public static boolean checkRoot1() { boolean bool = false; String[] array_string = System.getenv("PATH").split(":"); int i = array_string.length; int i1 = 0; while(i1 < i) { if(new File(array_string[i1], "su").exists()) { bool = true; } else { ++i1; continue; } return bool; } return bool; } public static boolean checkRoot2() { String string0 = Build.TAGS; boolean bool = string0 == null || !string0.contains("test-keys") ? false : true; return bool; } public static boolean checkRoot3() { boolean bool = true; String[] array_string = new String[]{"/system/app/Superuser.apk", "/system/xbin/daemonsu", "/system/etc/init.d/99SuperSUDaemon", "/system/bin/.ext/.su", "/system/etc/.has_su_daemon", "/system/etc/.installed_su_daemon", "/dev/com.koushikdutta.superuser.daemon/"}; int i = array_string.length; int i1 = 0; while(true) { if(i1 >= i) { return false; } else if(!new File(array_string[i1]).exists()) { ++i1; continue; } return bool; } return false; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 private boolean loggingEnabled = true; private final Context mContext; public RootBeer(Context context) { this.mContext = context; } public boolean isRooted() { return detectRootManagementApps() || detectPotentiallyDangerousApps() || checkForBinary("su") || checkForDangerousProps() || checkForRWPaths() || detectTestKeys() || checkSuExists() || checkForRootNative(); } public boolean isRootedWithoutBusyBoxCheck() { return detectRootManagementApps() || detectPotentiallyDangerousApps() || checkForBinary("su") || checkForDangerousProps() || checkForRWPaths() || detectTestKeys() || checkSuExists() || checkForRootNative(); } public boolean detectTestKeys() { String buildTags = Build.TAGS; return buildTags != null && buildTags.contains("test-keys"); } public boolean detectRootManagementApps() { return detectRootManagementApps(null); } public boolean detectRootManagementApps(String[] additionalRootManagementApps) { ArrayList<String> packages = new ArrayList(); packages.addAll(Arrays.asList(Const.knownRootAppsPackages)); if (additionalRootManagementApps != null && additionalRootManagementApps.length > 0) { packages.addAll(Arrays.asList(additionalRootManagementApps)); } return isAnyPackageFromListInstalled(packages); } public boolean detectPotentiallyDangerousApps() { return detectPotentiallyDangerousApps(null); } public boolean detectPotentiallyDangerousApps(String[] additionalDangerousApps) { ArrayList<String> packages = new ArrayList(); packages.addAll(Arrays.asList(Const.knownDangerousAppsPackages)); if (additionalDangerousApps != null && additionalDangerousApps.length > 0) { packages.addAll(Arrays.asList(additionalDangerousApps)); } return isAnyPackageFromListInstalled(packages); } public boolean detectRootCloakingApps() { return detectRootCloakingApps(null) || (canLoadNativeLibrary() && !checkForNativeLibraryReadAccess()); } public boolean detectRootCloakingApps(String[] additionalRootCloakingApps) { ArrayList<String> packages = new ArrayList(); packages.addAll(Arrays.asList(Const.knownRootCloakingPackages)); if (additionalRootCloakingApps != null && additionalRootCloakingApps.length > 0) { packages.addAll(Arrays.asList(additionalRootCloakingApps)); } return isAnyPackageFromListInstalled(packages); } public boolean checkForSuBinary() { return checkForBinary("su"); } public boolean checkForBusyBoxBinary() { return checkForBinary("busybox"); } public boolean checkForBinary(String filename) { boolean result = false; for (String path : Const.suPaths) { if (new File(path + filename).exists()) { result = true; } } return result; } private boolean isAnyPackageFromListInstalled(List<String> packages) { boolean result = false; PackageManager pm = this.mContext.getPackageManager(); for (String packageName : packages) { try { pm.getPackageInfo(packageName, 0); result = true; } catch (NameNotFoundException e) { } } return result; } public boolean checkForDangerousProps() { Exception e; Throwable th; BufferedReader bufferedReader = null; boolean result = false; try { ProcessBuilder pb = new ProcessBuilder(new String[]{"getprop", "ro.debuggable"}); pb.redirectErrorStream(true); BufferedReader in = new BufferedReader(new InputStreamReader(pb.start().getInputStream())); try { String str = ""; str = in.readLine(); if (str != null && str.equals("1")) { result = true; } if (result) { bufferedReader = in; } else { pb = new ProcessBuilder(new String[]{"getprop", "ro.secure"}); pb.redirectErrorStream(true); bufferedReader = new BufferedReader(new InputStreamReader(pb.start().getInputStream())); str = bufferedReader.readLine(); if (str != null && str.equals("0")) { result = true; } } SysHelper.close(bufferedReader); return result; } catch (Exception e2) { e = e2; bufferedReader = in; try { e.printStackTrace(); SysHelper.close(bufferedReader); return false; } catch (Throwable th2) { th = th2; SysHelper.close(bufferedReader); throw th; } } catch (Throwable th3) { th = th3; bufferedReader = in; SysHelper.close(bufferedReader); throw th; } } catch (Exception e3) { e = e3; e.printStackTrace(); SysHelper.close(bufferedReader); return false; } } public boolean checkForRWPaths() { Throwable th; BufferedReader in = null; boolean result = false; try { ProcessBuilder processBuilder = new ProcessBuilder(new String[]{"mount"}); processBuilder.redirectErrorStream(true); Process mProcess = processBuilder.start(); BufferedReader in2 = new BufferedReader(new InputStreamReader(mProcess.getInputStream())); while (true) { try { String line = in2.readLine(); if (line != null) { String[] args = line.split(" "); if (args.length >= 4) { String mountPoint = args[1]; String mountOptions = args[3]; for (String pathToCheck : Const.pathsThatShouldNotBeWrtiable) { if (mountPoint.equalsIgnoreCase(pathToCheck)) { for (String option : mountOptions.split(",")) { if (option.equalsIgnoreCase("rw")) { result = true; break; } } } } } } else { int exitValue = mProcess.waitFor(); SysHelper.close(in2); in = in2; return result; } } catch (Exception e) { in = in2; } catch (Throwable th2) { th = th2; in = in2; } } } catch (Exception e2) { SysHelper.close(in); return false; } catch (Throwable th3) { th = th3; SysHelper.close(in); throw th; } } public boolean checkSuExists() { boolean z = true; BufferedReader in = null; try { ProcessBuilder pb = new ProcessBuilder(new String[]{"which", "su"}); pb.redirectErrorStream(false); Process mProcess = pb.start(); BufferedReader in2 = new BufferedReader(new InputStreamReader(mProcess.getInputStream())); try { String line = in2.readLine(); int exitValue = mProcess.waitFor(); SysHelper.close(in2); if (line == null || !line.endsWith("su")) { z = false; } in = in2; return z; } catch (Throwable th) { in = in2; if (in != null) { SysHelper.close(in); } return false; } } catch (Throwable th2) { if (in != null) { SysHelper.close(in); } return false; } } public boolean checkForNativeLibraryReadAccess() { return true; } public boolean canLoadNativeLibrary() { return true; } public boolean checkForRootNative() { if (!canLoadNativeLibrary()) { return false; } String binaryName = "su"; String[] paths = new String[Const.suPaths.length]; for (int i = 0; i < paths.length; i++) { paths[i] = Const.suPaths[i] + binaryName; } if (FileNative.checkForRoot(paths) > 0) { return true; } return false; }
https://www.anquanke.com/post/id/86201
其中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 /** * 并不能决定什么 ,Permission denied 哪怕root了。 * @return */ public static boolean checkSuExistsByWhich() { boolean z = true; BufferedReader in = null; try { ProcessBuilder pb = new ProcessBuilder(new String[]{"which", "su"}); pb.redirectErrorStream(false); Process mProcess = pb.start(); BufferedReader in2 = new BufferedReader(new InputStreamReader(mProcess.getInputStream())); try { String line = in2.readLine(); int exitValue = mProcess.waitFor(); close(in2); if (line == null || !line.endsWith("su")) { z = false; } in = in2; return z; } catch (Throwable th) { in = in2; if (in != null) { close(in); } return false; } } catch (Throwable th2) { if (in != null) { close(in); } return false; } }
方法不靠谱,有root也会提示权限禁止,另外还可以反射判断secure是否为1,来判断 以及 ro.debuggalbe,如果调试为1 或者安全为0 就是root了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package android.os; public class Build { private static final String TAG = "Build"; /** Value used for when a build property is unknown. */ public static final String UNKNOWN = "unknown"; /** Either a changelist number, or a label like "M4-rc20". */ public static final String ID = getString("ro.build.id"); /** A build ID string meant for displaying to the user */ public static final String DISPLAY = getString("ro.build.display.id"); /** The name of the overall product. */ public static final String PRODUCT = getString("ro.product.name"); /** The name of the industrial design. */ public static final String DEVICE = getString("ro.product.device");