Loading... # 2026Frida逆向学习通——上 最近加了看雪论坛的A0tem大佬,看到了有一篇针对学习通的分析文章,分为上下两文,于是我就来跟着研究一下,顺便给它脱个壳,感兴趣的话可以去原文章看看https://bbs.kanxue.com/thread-289404.htm,下面为了方便称呼A0tem,就叫大佬吧 话不多说,开始学习,个人小白,如有不足之处请谅解 首先学习通的最新版本6.7.4版本的加固似乎增强了,以往互联网论坛的加固脱壳基本上是没有作用了,目前新版本依然是梆梆加固企业版的壳 首先大佬Hook了dlopen,`android_dlopen_ext` 是 Android 系统为加载动态库提供的**扩展函数**,我们主要要过Frida的检测,后续才能继续研究,这里提前透露一下,使用魔改的Frida不会麻烦,因为魔改Frida,加固厂商没那么多精力去应对千奇百怪的Frida版本,最好使用魔改的版本测试 首先先把frida-server开起来,用的模拟器,已经ROOT了,安装了LSP框架和阿尔法面具,对虚拟机有适配  使用frida命令来Hook,Hook之前记得adbforward转发下端口 ``` frida -U -f com.chaoxing.mobile -l .\hook_dlopen.js ``` 可以看到大佬的Hook直接在Frida执行是没有效果的  于是我试了魔改的Frida,成功Hook到了,不过后面报错崩溃了,说明是反调试起了作用 ``` android_dlopen_ext: /data/app/~~h6NHYZvnBLfi8ysy3vHJ8A==/com.chaoxing.mobile-9V4dpMyWYkMp667FbRW_cA==/oat/x86_64/base.odex android_dlopen_ext: /data/app/~~h6NHYZvnBLfi8ysy3vHJ8A==/com.chaoxing.mobile-9V4dpMyWYkMp667FbRW_cA==/lib/arm64/libDexHelper-x86.so android_dlopen_ext: libframework-connectivity-jni.so android_dlopen_ext: /data/app/~~h6NHYZvnBLfi8ysy3vHJ8A==/com.chaoxing.mobile-9V4dpMyWYkMp667FbRW_cA==/lib/arm64/libsecuritylib.so android_dlopen_ext: /system/lib64/arm64/nb/libtcb.so Process crashed: Trace/BPT trap ``` 经过对AI的提问,提醒了我Arm64架构的问题,由于虚拟机是X86_64架构,但实际情况不是,这跟大佬的情况一样,反Hook调试机制发现了,直接崩溃,可以看到新版本的库加载也不一样了  于是我决定拿Root手机进行测试 测试过程中卡在了第一步,被检测到了,ZygiskFrida也启动不了,我们就先在模拟器上继续测试,先继续分析 Hook Clone 理所当然抓到了,因为太多了,贴出主要的就行 ``` ═══ Clone Called ═══ args[0] (wrapper): 0x75fad3ceb9c0 args[1] (stack) : 0x75f829e24cf0 args[2] (flags) : 0x3d0f00 args[3] (tls) : 0x75f829e24cf0 真正的线程函数: SO名称: libutils.so 函数地址: 0x75fabac2ced0 偏移: 0x13ed0 ═══ Clone Called ═══ args[0] (wrapper): 0x75fad3ceb9c0 args[1] (stack) : 0x75f829d27cf0 args[2] (flags) : 0x3d0f00 args[3] (tls) : 0x75f829d27cf0 真正的线程函数: SO名称: libutils.so 函数地址: 0x75fabac2ced0 偏移: 0x13ed0 ═══ Clone Called ═══ args[0] (wrapper): 0x75fad3ceb9c0 args[1] (stack) : 0x75f829553cf0 args[2] (flags) : 0x3d0f00 args[3] (tls) : 0x75f829553cf0 真正的线程函数: SO名称: libart.so 函数地址: 0x75f8265eea50 偏移: 0x5eea50 ═══ Clone Called ═══ args[0] (wrapper): 0x75fad3ceb9c0 args[1] (stack) : 0x75f829359cf0 args[2] (flags) : 0x3d0f00 args[3] (tls) : 0x75f829359cf0 真正的线程函数: SO名称: libDexHelper-x86.so 函数地址: 0x75f811ac2460 偏移: 0x57460 检测到目标so!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ═══ Clone Called ═══ args[0] (wrapper): 0x0 args[1] (stack) : 0x0 args[2] (flags) : 0x1200011 args[3] (tls) : 0x0 ═══ Clone Called ═══ args[0] (wrapper): 0x75fad3ceb9c0 args[1] (stack) : 0x75f82925ccf0 args[2] (flags) : 0x3d0f00 args[3] (tls) : 0x75f82925ccf0 真正的线程函数: SO名称: libDexHelper-x86.so 函数地址: 0x75f811acfda0 偏移: 0x64da0 检测到目标so!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ═══ Clone Called ═══ args[0] (wrapper): 0x75fad3ceb9c0 args[1] (stack) : 0x75f82915fcf0 args[2] (flags) : 0x3d0f00 args[3] (tls) : 0x75f82915fcf0 真正的线程函数: SO名称: libDexHelper-x86.so 函数地址: 0x75f811acce70 偏移: 0x61e70 检测到目标so!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ═══ Clone Called ═══ args[0] (wrapper): 0x75fad3ceb9c0 args[1] (stack) : 0x75f829062cf0 args[2] (flags) : 0x3d0f00 args[3] (tls) : 0x75f829062cf0 真正的线程函数: SO名称: libDexHelper-x86.so 函数地址: 0x75f811ad04c0 偏移: 0x654c0 检测到目标so!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ═══ Clone Called ═══ args[0] (wrapper): 0x75fad3ceb9c0 args[1] (stack) : 0x75f828f65cf0 args[2] (flags) : 0x3d0f00 args[3] (tls) : 0x75f828f65cf0 真正的线程函数: SO名称: libDexHelper-x86.so 函数地址: 0x75f811ada980 偏移: 0x6f980 检测到目标so!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ═══ Clone Called ═══ args[0] (wrapper): 0x75fad3ceb9c0 args[1] (stack) : 0x75f8131cecf0 args[2] (flags) : 0x3d0f00 args[3] (tls) : 0x75f8131cecf0 真正的线程函数: SO名称: libart.so 函数地址: 0x75f82687ae70 偏移: 0x87ae70 ``` 大佬讲了安卓的三个创建线程机制, 安卓平台上总共有三种线程: 1. Java 线程:Android 虚拟机线程,具有运行 Java 代码的 Runtime 2. Native 线程(只能执行 C/C++):纯粹的 Linux 线程 3. Native 线程(还能执行 Java):既能执行 C/C++ 代码,也能执行 Java 代码 对于学习通,采用的是第一种方式,一般不需要使用到第二第三钟方式,在软件开发中常用 后面就是Hook绕过了,根据前面的Hook线程偏移,我的运行环境调用的是x86的so 我认为挑战在于启动的检测是怎么检测到的,frida原版的无论有没有脚本注入都是会秒闪退,也就是说反调试还没介入就会闪退,这些就放章节中来讲,总共分三章,第三章就来过签名校验和hook一些功能 最后修改:2026 年 03 月 07 日 © 禁止转载 打赏 赞赏作者 支付宝微信 赞 1 如果觉得我的文章对你有用,请随意赞赏