首页
社区
课程
招聘
[原创]某气骑士 libtprt.so 反 Frida 机制分析与绕过
发表于: 1天前 560

[原创]某气骑士 libtprt.so 反 Frida 机制分析与绕过

1天前
560

某气骑士 libtprt.so 反 Frida 机制分析与绕过

好久没写博客了,今天打算更新一下,记录一下之前写过的东西,在GitHub上也写了一些小软件,顺便分享一下

本文核心问题:libtprt.so 是通过哪些特征检测 Frida?

方法:对比 frida-server 与 florida-server 差异

一、工具准备

最近写了一些小工具,感觉还是挺好用的,所以分享出来:

EasyHook

384K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6d9P5i4c8@1k6i4u0y4L8$3S2F1i4K6u0r3c8h3q4K6P5f1S2G2L8$3D9`.

EasyHook 是一个运行在 Windows 桌面端的 Android Frida 脚本 IDE,支持脚本管理、代码编辑、Android 设备 连接、进程选择、Attach/Spawn 注入、运行控制和日志输出,让 Frida 脚本无需手写 Python 启动器即可快速执行。

UsbDetectionBypass

890K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6d9P5i4c8@1k6i4u0y4L8$3S2F1i4K6u0r3g2i4y4T1c8r3g2@1k6h3y4@1K9h3!0F1b7Y4W2H3j5i4y4K6

隐藏 Android 应用内 USB 连接与 USB 调试检测信号的 LSPosed/Xposed 模块。

EnvdetectEnvScope

ee3K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6d9P5i4c8@1k6i4u0y4L8$3S2F1i4K6u0r3c8h3&6$3f1$3y4G2M7r3f1`.

EnvScope 是一个用于 Android 运行环境自检的 APK,重点探测 Frida、Xposed、LSPosed、EdXposed、Substrate、Riru、Zygisk/Magisk 等动态插桩、Hook 或模块化注入痕迹。

二、前言

在之前的博客中,我分析测试了某气骑士这款游戏(ec5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2^5N6h3q4F1N6$3!0J5L8r3c8Q4x3X3g2@1L8%4m8Q4x3V1j5J5x3o6t1$3i4K6u0r3x3o6q4Q4x3V1j5H3z5g2)9J5c8X3q4F1k6s2u0G2K9h3c8Q4x3X3c8J5k6g2)9J5k6r3E0F1K9h3N6Z5N6q4)9J5c8W2!0q4c8W2!0n7b7#2)9^5z5g2!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4g2!0n7c8q4)9&6x3#2!0q4y4W2)9&6y4#2!0n7y4W2!0q4z5g2)9^5x3g2)9^5y4#2!0q4y4g2)9^5z5q4!0n7x3q4!0q4y4q4!0n7b7g2)9^5y4W2!0q4y4g2)9^5c8W2)9^5c8r3k6J5K9h3c8S2i4@1f1%4i4K6W2m8i4K6R3@1i4@1f1$3i4K6W2o6i4@1u0m8i4@1f1#2i4K6R3^5i4@1t1$3i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1$3i4K6R3&6i4K6R3H3i4@1f1@1i4@1u0n7i4@1p5#2i4@1f1$3i4K6W2o6i4K6R3H3i4@1f1#2i4K6V1H3i4K6S2q4i4@1f1$3i4K6V1^5i4@1q4r3i4@1f1%4i4K6V1@1i4@1p5^5i4@1f1@1i4@1u0m8i4K6R3$3P5s2m8G2M7$3g2V1i4@1f1$3i4K6S2r3i4K6V1J5i4@1f1@1i4@1u0n7i4@1t1$3i4@1f1#2i4K6V1J5i4K6S2o6N6r3g2J5L8i4g2^5i4@1f1^5i4@1u0r3i4K6V1H3i4@1f1^5i4@1p5I4i4K6S2o6M7$3S2W2L8r3I4Q4c8e0S2Q4z5o6c8Q4z5f1q4Q4c8e0k6Q4z5f1y4Q4b7f1y4Q4c8e0g2Q4b7f1g2Q4z5f1g2Q4c8e0N6Q4z5p5g2Q4b7U0m8Q4c8e0g2Q4z5o6k6Q4z5o6g2Q4c8e0g2Q4b7f1c8Q4z5e0S2V1N6h3#2H3i4@1f1%4i4K6W2m8i4K6R3@1i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1$3i4@1t1J5i4@1p5I4i4@1f1$3i4K6W2o6i4K6R3&6i4@1f1%4i4@1u0n7i4K6R3$3i4@1f1^5i4K6R3%4i4@1t1@1i4@1f1%4i4K6W2m8i4K6R3@1i4@1f1#2i4K6R3^5i4K6R3$3i4@1f1$3i4K6W2q4i4K6V1H3i4@1f1#2i4@1p5$3i4K6R3J5i4@1f1@1i4@1u0p5i4K6V1#2i4@1f1@1i4@1u0p5i4@1u0r3i4@1f1%4i4K6V1@1i4@1p5^5i4@1f1#2i4K6R3#2i4@1t1$3i4@1f1@1i4@1u0n7i4K6V1$3i4@1f1$3i4K6V1$3i4@1t1&6i4@1f1#2i4@1u0o6i4K6S2r3i4@1f1%4i4@1u0n7i4K6V1#2i4@1f1^5i4@1u0r3i4K6R3%4k6Y4u0A6k6r3q4Q4c8e0k6Q4b7e0y4Q4z5o6m8Q4c8e0k6Q4b7U0g2Q4z5p5u0Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0k6Q4z5o6W2Q4z5o6m8Q4c8e0c8Q4b7V1u0Q4b7e0g2Q4c8e0S2Q4b7V1k6Q4z5e0W2Q4c8e0k6Q4b7f1y4Q4b7e0q4Q4c8e0g2Q4z5p5c8Q4z5f1q4Q4c8e0g2Q4b7f1g2Q4b7e0u0Q4c8e0g2Q4b7U0m8Q4b7U0q4Q4c8e0k6Q4z5f1c8Q4b7e0g2Q4c8e0g2Q4b7f1g2Q4z5f1g2Q4c8e0N6Q4z5p5g2Q4b7U0m8Q4c8e0c8Q4b7U0S2Q4z5o6m8Q4c8e0c8Q4b7U0S2Q4z5p5u0Q4c8e0y4Q4z5o6m8Q4z5o6t1`.

首先介绍一下基本情况,某气骑士这款游戏使用了libtprt.so库对游戏进行加固,除了对il2cpp进行加固外,还加入了反frida的机制,如果手机中运行frida-server进程的话,游戏在启动的时候回卡死,il2cpp将不会被加载到内存中,不过在之前的测试中,发现libtprt.so会检测usb连接功能,不过不确定是怎么进行检测的。

1. USB检测绕过

所以现在第一步,需要绕过libtprt的usb检测功能,因为如果不连接usb的话,frida脚本执行会比较麻烦,为此我专门编写了一个可以防usb检测的lsposed模块:UsbDetectionBypass

下载源代码后修改作用域

在手机上启动这个模块,之后在电脑上通过adb查看日志:

adb logcat -s UsbBypass UsbBypassNative UsbDetectionBypassNative

之后运行某气骑士这款游戏,可以看到如下图的日志内容,这说明检测的返回值已经被修改,成功绕过检测:

从日志可以看出,应用在 Java 层通过 BATTERY_CHANGED 广播获取 plugged 状态来判断是否连接 USB,同时在 Native 层通过 __system_property_get 读取 init.svc.adbdservice.adb.tcp.portro.debuggable 等系统属性来检测 ADB 调试环境;而当前结果中这些值均被成功篡改为“未连接 USB、未开启调试”,说明通过 Hook 覆盖了应用的检测路径,从而有效绕过了其 USB/调试环境检测机制。

2. frida检测的绕过

通过上述的方式可以防止libtprt检测我的usb,不过frida还是容易被检测,一旦开启frida-server就会闪退。

这个被检测的原因有很多,因为frida本身有很多检测点,我先换了一个魔改的frida-server测试了一下,魔改的frida-server是这个:

0a6K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6k6L8r3q4J5L8$3c8Q4x3V1k6r3L8r3!0J5K9h3c8S2

启动florida-server(报错不用管)

然后启动游戏观察是否闪退,只要能看到界面就说明il2cpp已经加载进去了:

发现没有闪退,简单写个脚本测试一下,这个IDE是我自己用electron做的**EasyHook**,喜欢可以自己去下载,我感觉还是很方便的:

成功hook,说明florida+UsbDetectionBypass的方案是可以绕过libtprt.so的。

3. frida检测方式的初步分析

其实我最好奇的问题是,某气骑士是如何检测到frida的呢,根据目前的信息,frida是能被检测到,florida是不会被检测到,所以我的思路就是去查看frida和florida有哪些区别,这些地方就是检测点,为此我专门做了一个小软件**EnvScope**,这个软件通过各种各样的监测点去检测当前的环境中是否存在xposed或者frida等特征,然后做一个简单的测试:

首先是florida的检测结果:

然后是frida的检测结果:

从检测结果来看,frida-server 相比 florida-server 暴露了更完整的特征,主要的区别是:

  1. frida-server在 /proc/self/maps 中可以直接命中 libzygisk.so,说明 frida 的注入过程触发了 Zygisk 相关机制,导致系统注入库被加载并被检测到

  2. Native 层枚举特征,通过 dl_iterate_phdrdlsym 等方式也能扫描到这些 so,说明不仅 maps 可见,底层模块遍历同样能识别

  3. 更丰富的 Unix Socket 特征,frida 会产生多个带有明显 “frida” 标识的 socket(如 frida-xxxx),而 florida 对这部分做了一定混淆或减少。

虽然florida也有很明显的特征,但是相比之下frida会有更多的特征,说明这些特征很可能构成其检测规则的一部分,之后我计划自己去魔改frida,检查这个到底是如何被检测到的。

三、 小结

这篇主要是把之前没细做的部分补了一下,重点其实有两个:一是通过 Hook BATTERY_CHANGED__system_property_get 把 USB 和 ADB 相关检测全部“伪装掉”,解决 libtprt.so 对调试环境的第一层判断;二是通过对比 frida-server 和 florida-server,去反推它具体是从哪些特征在识别 Frida。

对比下来能明显看到,frida-server 暴露的东西更多,比如 maps 里的 libzygisk.so、Native 层可枚举的 so 以及带 frida 关键字的 socket,这些叠在一起基本就很容易被命中;而 florida 把内存和一部分注入链路特征藏掉了,只剩下端口和少量通信特征,所以能跑起来。

如果这些工具(EasyHook / UsbDetectionBypass/ EnvScope)对你有帮助的话,也可以顺手点个 star!球球了!


[培训]《冰与火的战歌:Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回