Android自定义root检测代码失效,root设备仍可运行应用求问题排查
现有Root检测代码的缺陷汇总
- 检测特征库覆盖不全
你枚举的su路径和Root相关文件都是SuperSU这类老旧Root工具的特征,现在主流的Magisk等Root工具会做特征隐藏,su文件不会放在你列的这些公共路径下,对应的老旧Root管理APK、守护进程文件也基本不会出现在现在的Root设备上,自然检测不到。 - 仅靠
File.exists()判断完全不可靠
现在常见的Root隐藏功能(比如Magisk Hide、Zygisk隐藏)可以针对指定应用伪造文件系统查询结果,你的应用发起路径存在性查询时,会直接返回不存在的结果,轻松绕过检测。另外如果你的应用没有对应系统路径的读取权限,exists()方法也会直接返回false且不会抛出异常,你误以为文件不存在,实际只是没有权限读取。 - 缺少运行态Root特征检测
你只做了静态文件扫描,完全没有涉及运行时检测逻辑:比如尝试执行su命令看是否能拿到Root权限、检测是否有su相关的守护进程在运行、检测SELinux状态是否为宽容模式,这些关键检测项的缺失导致绕过成本极低。 - Build.TAGS检测逻辑基本失效
现在的第三方定制ROM哪怕已经支持Root,编译时也会用正式签名的release-keys,根本不会携带test-keys标识,这个检测逻辑在近年的Android设备上几乎起不到作用。 - 没有对抗Hook的校验逻辑
很多Root用户会搭配Xposed、Frida这类Hook框架使用,完全可以直接Hook修改isDeviceRooted()方法的返回值,强行让该方法返回false,你的检测逻辑再完善也会直接失效。
如果要提升检测准确率,可以补充这些逻辑:尝试执行
which su命令查找su的真实路径、尝试执行su命令校验权限返回结果、检测/proc目录下的su相关进程、校验系统关键分区的完整性、增加自身检测方法的运行时完整性校验避免被Hook。
内容的提问来源于stack exchange,提问作者someone
相关产品推荐
相关产品推荐

