如何(以编程方式)确定Android设备是否:rooted运行软件或ROM的破解副本。
我的数据库中有一些敏感信息,我希望在手机被root用户时加密,即用户可以访问数据库。我该如何检测到它?
答案 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)
遗产的限制 Android上的复制保护机制 市场是使用它的应用程序 只能在兼容的情况下安装 提供安全内部的设备 存储环境。例如,a 受版权保护的应用程序不能 从Market下载到设备 提供root访问权限,以及 应用程序无法安装到 设备的SD卡。
您似乎可以从使用传统的警察保护中受益,以防止您的应用程序安装在有根设备上。
您可能会发布一个可以在带有加密数据库的root设备上安装的单独版本。