检测设备是否无系统地植根

时间:2019-01-18 15:22:54

标签: android root android-shell

由于无系统根目录已经可以使用几年了,因此检测设备是否已建立根目录变得“更加困难”。我开始寻找一种可能的解决方案,以检测设备是否无根地植根,而我仍然找不到解决方案。检查文件是否存在于给定的路径中(在/ system中)毫无意义,因为如果设备是非系统根目录的,则它不能存在。 另外,寻找管理根访问的应用程序可能没有意义,因为用户可能没有安装它们,或者只是使用其他应用程序,而不是Magisk,SuperSu等不受欢迎。

因此,我认为正在执行“ su”命令,然后检查外壳程序是否以root模式(“#”)或不是(“ $”)运行。但是,如何检查它以哪种模式运行?据我所知,只需执行命令即可:

       Runtime.getRuntime().exec("su");

由于不再使用“ SU用户”(?),进程被杀死。

简单查看我对adb用法的意思:

user@user:~$ adb shell
device:/ $ su

如果执行此命令后它变为:

device:/ #

将知道设备是否已植根,如果返回“权限被拒绝”,则会知道该设备未植根。我可以在Android应用程序中实现类似的功能吗?

3 个答案:

答案 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 scenarios

答案 2 :(得分:0)

加上Gabe Sechan的答案,连续检测无系统的根几乎是不可能的,因为根特权可以修改执行检查的软件。

话虽这么说,rootbeer拥有proposed pull request,它应该能够使用Unix域套接字来检测Magisk,至少直到该方法被修补之前。