如何找到root设备?

时间:2014-07-08 04:17:39

标签: android android-activity su root

我一直在尝试查找设备是否已植根,如果找到设备已植根,我不希望我的应用程序安装。我尝试了以下两种方法

private boolean isRooted() {
  return findBinary("su");
    }

public static boolean findBinary(String binaryName) {
boolean found = false;
if (!found) {
    String[] places = { "/sbin/", "/system/bin/", "/system/xbin/",
            "/data/local/xbin/", "/data/local/bin/",
            "/system/sd/xbin/", "/system/bin/failsafe/", "/data/local/" };
    for (String where : places) {
        if (new File(where + binaryName).exists()) {
            found = true;
            break;
        }
    }
    try {

        File file = new File("/system/app/Superuser.apk");
        if (file.exists()) {
            Log.e("ERROR", "Unable to find icon for package '"
                   + "apk found");
       found = true;
        }
      } catch (Exception e1) {
        // ignore
      }
}
return found;
}

但我不认为这些方法足以找到一个有根设备,因为有工具可以隐藏apk并且可以重命名或删除su文件。还有其他任何方式或任何建议找到有根设备100%可靠?   我试图编辑su但无法做任何事情。这只是一个口口相传或者真的有可能这样做吗?提前致谢

*** *** EDITED :    我用过" HIDE MY ROOT"应用程序隐藏SU二进制文件以及superuser.apk.I可以使我的root设备看起来像无根使用隐藏我的root应用程序。因此我可以说这个源是防伪的,并且找不到root设备是不完全可靠的。 如果有其他方法可以找到有根设备,请告诉我..

3 个答案:

答案 0 :(得分:3)

我是通过以下方式做到的:

 /*
 * Run su command on  device 
 * @throws IOException, InterruptedException
 */

private static boolean suRun() throws IOException, InterruptedException
{
    try {
     Process su = null;
     su = Runtime.getRuntime().exec(new String[] {"su","-c","exit"});
     su.waitFor();

     InputStream in = su.getInputStream();
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));

     String suOutput = bufferedReader.readLine();

     if (suOutput == null)
     {
         return true;
     }
     else
     {
         return false;
     }
    } catch (Exception ex)
    {
        return false;
    }
 }


public static boolean isPhoneRooted() {
 // check if /system/app/Superuser.apk is present and can run su
 try {
     File file = new File("/system/app/Superuser.apk");
     if (file.exists() && suRun()) {
         Log.d("Blocking Service", "ROOTED PHONE DETECTED");
        return true;
     }
  } 
  catch (Throwable e1) {
      // ignore
  }
     return false;
}

答案 1 :(得分:2)

您可以使用Google Play服务中的SafetyNet API。这是android使用的不仅支付根检测,还检查与Android CTS的兼容性。

答案 2 :(得分:0)

从ShellInterface

调用isRooted()

isRooted()取决于三个因素的大部分

    public static boolean isRooted() {

    return isRooted1() ? (isRooted2() || isRooted3()) : (isRooted2() && isRooted3());
   }
private static boolean isRooted1() {
    Process mProcess = null;
    boolean mRoot;
    try {
        // This is executing on terminal
        mProcess = Runtime.getRuntime().exec("su");
        mRoot = true;

        // If the execute successfully then it return to true

    } catch (Exception e) {
        // if is not successfully then it return to false
        mRoot = false;

    } finally {
        if (mProcess != null) {
            try {
                mProcess.destroy();
            } catch (Exception ignored) {
            }
        }
    }
    return  mRoot;
}
private static boolean isRooted2() {
    String buildTags = Build.TAGS;
    return  buildTags !=null && buildTags.contains("test-keys");
}

private static boolean isRooted3() {
    boolean mRoot = false;
    boolean found = false;
    if (!found) {
        String[] places = {"/sbin/", "/system/bin/","/system/xbin",
                "/data/local/xbin","/system/sd/xbin","/data/local"
        };
        for (String path : places){
            if (new File(path+"su").exists()) {
                mRoot = true;
                found = true;
            }
        }
    }
    return mRoot;
}