应用root检测通杀篇
平时应用测试过程中经常遇见Root检测,特别是金融类应用在启动时进行Root环境监测,会向用户弹窗提示运行环境存在安全风险不让APP继续运行下一步操作或禁止安装运行(直接闪退)。虽然之前说到magisk配合Shamiko模块可以过掉大部分应用root检测,比较依赖magisk环境,若app对magisk进行检测,此时我们又要对magiak进行隐藏。
这里的思路是-通过自定义su,并去除userdebug编译模式的一些特征
常规检测手段
root 常规检测手段大致可以分为三类
1.目录特征遍历
我们来看段检测代码,从代码中可以看会去遍历"/sbin/su", "/system/bin/su", "/system/sbin/su", "/system/xbin/su" 等目录其次检测magsik、SuperSU等特征
2.尝试执行root后的一些操作
对特定目录尝试新建文件例如 /data、/system、/etc 等(只有root后才有权限操作的目录),或者去执行典型的,例如su,还有find、mount等命令。
3.读取手机编译版本、调试状态
例如读取/system/build.prop中 是test-keys(测试版),还是release-keys(发布版),去获取ro.debuggable、ro.secure的值检测是否有调试状态
如何做到通杀呢?
其实我们只要通过定制ROM自定义su,就可以轻松应对1.目录特征遍历和 2.尝试执行root后的一些操作,
当我们把su改成mysu,对应目录也自定义成mysu,提权命令也会变成mysu,当应用执行对/data、/system、/etc 等目录进行文件操作,没有提权命令mysu自然也无法完成这些操作,最后我们把test-keys 以及ro.debuggable等特征都改成正常值,这样基本上可以做到ROOT检测通杀了。
ROM实现
我这里使用的是android-8.1.0_r1
自定义su
/system/extras/su/Android.mk中su修改为mysu
/system/core/libcutils/fs_config.cpp中/system/xbin/su修改为/system/xbin/mysu
/system/sepolicy/private/file_contexts中/system/xbin/su修改为/system/xbin/mysu
更改test-keys
ro.build.tags=test-keys被写入在system/build.prop文件,我们查看这个文件看到autogenerated by buildinfo.sh
是被buildinfo.sh文件写入的,我们找下这个文件
/build/make/tools/buildinfo.sh
ro.build.tags的值是读取BUILD_VERSION_TAGS
而BUILD_VERSION_TAGS 则是/build/core/Makefile 中BUILD_KEYS 给的值,所以我们将
test-keys 改为 release-keys即可
更改后test-keys均变成了release-keys
更改userdebug
虽然我们改了test-keys 但是ro.build.type、ro.build.display.id、ro.build.flavor、ro.build.description、ro.build.fingerprint标签中均有userdebug,发布版值应为user
我们先看下ro.build.type对应的值是来自TARGET_BUILD_TYPE
TARGET_BUILD_TYPE 的值又是TARGET_BUILD_VARIANT,又索引到其他文件去了,为了减少出错率,我们就在这里直接赋值user
我们再来看下ro.build.flavor 对应TARGET_BUILD_FLAVOR
TARGET_BUILD_FLAVOR := $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT)
我们对比下值就可以判断出 TARGET_BUILD_VARIANT 就是userdebug字符串
我们直接改成TARGET_BUILD_FLAVOR := $(TARGET_PRODUCT)-user,
其他几个地方就可以按照此方式挨个去除即可,只在/build/core/Makefile 中改动即可,由于篇幅原因就不带着大家挨个改了,后面会将改好文件放入星球中大家参考即可。我们来看下改好后的效果:
修改ro.debuggable =
在/build/core/main.mk可以直接把ro.debuggable指定为0 这样我们就关闭了全局debug模式了,但是平时分析应用需要调试所以我就保留了这个功能,借助mprop帮助我们隐藏ro.debuggable的值,这样既能保留全局debug模式,又隐藏了ro.debuggable的值,缺点就是每次手机重启,需要执行一下命令,才能做到隐藏。
先push到/data/local/tmp
adb push C:\Users\cxf\Downloads\mprop170119\libs\armeabi-v7a\mprop /data/local/tmp/
1 2 3 4 5 6 | adb shell
cd / data / local / tmp /
mysu
chmod 777 mprop
. / mprop
setprop ro.debuggable 0
|
修改完成后我们测试一下。
我们看到default.prop中还是ro.debuggable 0
不用担心其实app没有su权限读取不到这里。
没有su权限的app想要获取 ro.debuggable的值一般只有两种方式
1.getprop ro.debuggable
2.利用反射android.os.SystemProperties来获取,测试后发现值也是0
我们打开AS看到进程还在可以附加,说明debug模式还在。
总结:这个修改ro.debuggable 后续需要优化一下。主要是让其不在依赖外部工具。
最后:已经测试多个金融类基本检测不到ROOT了。其实ROM不仅仅实现了此功能还实现了fart的一些脱壳点,反调试相关,后续在为大家一一介绍。
ROM后续会放入星球,并持续更新大家自取即可食用哦。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2023-3-9 10:14
被爱玩逆向编辑
,原因: 修改内容