由于无系统根目录已经可以使用几年了,因此检测设备是否已建立根目录变得“更加困难”。我开始寻找一种可能的解决方案,以检测设备是否无根地植根,而我仍然找不到解决方案。检查文件是否存在于给定的路径中(在/ system中)毫无意义,因为如果设备是非系统根目录的,则它不能存在。 另外,寻找管理根访问的应用程序可能没有意义,因为用户可能没有安装它们,或者只是使用其他应用程序,而不是Magisk,SuperSu等不受欢迎。
因此,我认为正在执行“ su”命令,然后检查外壳程序是否以root模式(“#”)或不是(“ $”)运行。但是,如何检查它以哪种模式运行?据我所知,只需执行命令即可:
Runtime.getRuntime().exec("su");
由于不再使用“ SU用户”(?),进程被杀死。
简单查看我对adb用法的意思:
user@user:~$ adb shell
device:/ $ su
如果执行此命令后它变为:
device:/ #
将知道设备是否已植根,如果返回“权限被拒绝”,则会知道该设备未植根。我可以在Android应用程序中实现类似的功能吗?
答案 0 :(得分:0)
没有真正的方法来确定设备是否没有root。甚至进行测试以查看su是否存在-他们始终可以将应用重命名为“ super”而不是su。或“ foobar”。或使用AOSP的自定义版本来隐藏您要查找的内容。您要执行的操作是在不受控制的不受信任的环境中运行,并询问是否可以信任。那永远都行不通。您可以证明一个环境是不值得信赖的,您永远也不能证明它是值得信赖的。
答案 1 :(得分:0)
最好只使用SafetyNet API。尽管它无法明确告诉root用户,但它会让您知道设备不可靠。代码也很简单。
val nonce = ByteArray(20)
SecureRandom().nextBytes(nonce)
SafetyNet.getClient(context).attest(nonce, API_KEY)
.addOnSuccessListener(this) { response ->
// Indicates communication with the service was successful.
// Use response.jwsResult to get the result data.
val resultParts = result.jwsResult.split(".")
if (resultParts.size == 3) {
val bytes = Base64Utils.decode(resultParts[1])
val newString = String(bytes)
val json = JSONObject(newString)
// Check json fields to see if device is secure
// NOTE best practice is to send this to server instead of handling locally.
}
}
.addOnFailureListener(this) { e: Exception ->
// An error occurred while communicating with the service.
if (e is ApiException) {
// An error with the Google Play services API contains some
// additional details.
// You can retrieve the status code using the
// e.statusCode property.
} else {
// A different, unknown type of error occurred.
Log.d(TAG, "Error: ${e.message}")
}
}
以下是已检查的不同方案。请查看android documentation
答案 2 :(得分:0)
加上Gabe Sechan的答案,连续检测无系统的根几乎是不可能的,因为根特权可以修改执行检查的软件。
话虽这么说,rootbeer拥有proposed pull request,它应该能够使用Unix域套接字来检测Magisk,至少直到该方法被修补之前。