确定Android设备是否以编程方式为根?

时间:2010-08-06 13:28:12

标签: android

  

可能重复:
  Determine if running on a rooted device

如何(以编程方式)确定Android设备是否:rooted运行软件或ROM的破解副本。

我的数据库中有一些敏感信息,我希望在手机被root用户时加密,即用户可以访问数据库。我该如何检测到它?

3 个答案:

答案 0 :(得分:34)

生根检测是一种猫捉老鼠游戏,很难在所有情况下对所有设备进行生根检测。

请参阅 Android Root Beer https://github.com/scottyab/rootbeer以获取高级根检测,该检测还使用编译到.so本机库中的JNI和本机CPP代码。

如果您需要一些简单和基本的生根检测,请检查以下代码:

  /**
   * Checks if the device is rooted.
   *
   * @return <code>true</code> if the device is rooted, <code>false</code> otherwise.
   */
  public static boolean isRooted() {

    // get from build info
    String buildTags = android.os.Build.TAGS;
    if (buildTags != null && buildTags.contains("test-keys")) {
      return true;
    }

    // check if /system/app/Superuser.apk is present
    try {
      File file = new File("/system/app/Superuser.apk");
      if (file.exists()) {
        return true;
      }
    } catch (Exception e1) {
      // ignore
    }

    // try executing commands
    return canExecuteCommand("/system/xbin/which su")
        || canExecuteCommand("/system/bin/which su") || canExecuteCommand("which su");
  }

  // executes a command on the system
  private static boolean canExecuteCommand(String command) {
    boolean executedSuccesfully;
    try {
      Runtime.getRuntime().exec(command);
      executedSuccesfully = true;
    } catch (Exception e) {
      executedSuccesfully = false;
    }

    return executedSuccesfully;
  }

可能并不总是正确的。 2014年在~10台设备上进行了测试。

答案 1 :(得分:5)

如果信息是敏感的,您应该只为所有用户加密。否则,用户可以将您的应用程序安装为无根,然后在编写数据后根目录并读取您的数据库。

答案 2 :(得分:2)

official licensing guide说:

  

遗产的限制   Android上的复制保护机制   市场是使用它的应用程序   只能在兼容的情况下安装   提供安全内部的设备   存储环境。例如,a   受版权保护的应用程序不能   从Market下载到设备   提供root访问权限,以及   应用程序无法安装到   设备的SD卡。

您似乎可以从使用传统的警察保护中受益,以防止您的应用程序安装在有根设备上。

您可能会发布一个可以在带有加密数据库的root设备上安装的单独版本。