贸易网站建设方案,郑州低价网站制作,单位门户网站怎么做,做网站搭建的公司分析对象#xff1a; sub_1B924 及其完整调用链#xff08;so文件见附件#xff09;
分析目标#xff1a; 还原代码逻辑、提取核心对抗算法、复现 Shellcode、制定防御策略
分析深度#xff1a; 指令级/内核级
技术标签#xff1a; Anti-Frida, Watchdog, Shellcode I…分析对象sub_1B924及其完整调用链so文件见附件分析目标还原代码逻辑、提取核心对抗算法、复现 Shellcode、制定防御策略分析深度指令级/内核级技术标签Anti-Frida, Watchdog, Shellcode Injection, State Machine, ELF Parsing, Ptrace说明仅作为安全技术交流如有侵权联系删除1. 核心结论 (Executive Summary)经过对提供的 C 伪代码进行逐行审计和静态还原确认该模块是一个针对 Frida 框架的高级主动防御引擎。核心机制利用 Frida 为了修复 ART Bug 而必须 Hookart::ArtMethod::PrettyMethod的特性部署了一个内存完整性监控陷阱。执行架构主线程 (sub_1B924)负责环境清洗、反模拟器检测并根据 Android 版本适配加载 ART 库。监控线程 (sub_1C544)通过pthread_create启动在后台死循环运行负责扫描文件系统、内存映射和核心函数完整性。处决引擎 (sub_26334)一个混淆的状态机函数。一旦检测到异常Hook动态解密 Shellcode 并执行exit_group(0)强制抹杀进程。隐蔽性全程无显式字符串全部栈上解密无直接系统调用通过 Shellcode 完成无常规 Crash 日志。2. 详细分析入口与初始化 (sub_1B924)这是防御逻辑的起点。代码通过极其繁琐的步骤来隐藏其真实意图。2.1 字符串解密栈上异或 (Stack String Obfuscation)攻击者没有将字符串存储在.rodata段而是通过硬编码的十六进制数在栈上动态还原。代码定位1234v270xA700000099LL;//密钥低位0x99, 高位0xA7v28236;//密钥0xEC//...*(_QWORD*)v150xF69F89FA8ECEF5LL;//密文数据解密算法密钥序列 (Key): 循环使用[0x99, 0xA7, 0xEC]。操作Plaintext[i] Ciphertext[i] ^ Key[i % 3]。还原结果v20(库名):libart.so(或libc.so视上下文此处用于获取线程函数)。v21(函数名):pthread_create。分析意义这解释了后续v26函数指针的真实身份——它是线程创建函数而非 Hook 函数。2.2 动态加载 (Dynamic Loading)12345resultdlopen(v20,2);//加载 libc.so/libart.soif( result ) {v25dlsym(v22, v21);//获取 pthread_create 地址v26...;//v26 保存 pthread_create 指针}目的防止在 ELF 的Import Table(导入表) 中留下pthread_create的痕迹对抗静态分析工具的交叉引用分析。2.3 环境指纹检测 (Anti-Environment)在启动核心逻辑前代码执行了严格的环境检查。配置检查 (sub_CAA8)检查全局变量dword_48810是否为248(0xF8)。这通常是 SDK 版本适配或功能开关。硬件黑名单 (sub_12D9C)逻辑读取ro.product.model检查是否包含字符串Firefly-RK3399。对抗意图Firefly 开发板是安全研究员常用的低成本 ARM 逆向平台。代码检测到此环境直接跳过核心注入导致分析人员在特定设备上无法复现恶意行为“装死”。3. 核心部署陷阱安装 (sub_1CEF8)此函数负责定位攻击目标并启动看门狗线程。它是连接初始化与监控的桥梁。3.1 绕过 Android 7.0 命名空间限制Android 7.0 引入了 Linker Namespace禁止 APP 直接dlopen系统私有库如libart.so。代码逻辑检查 SDK 版本 (*off_47FB8)。SDK 24: 调用sub_18D54(libart.so)。sub_18D54原理这是一个手动 ELF 加载器。它读取/proc/self/maps找到libart.so的基址然后手动解析 ELF Header、Program Header 和 Dynamic Segment从而在不通过系统 Linker 的情况下查找符号。3.2 锁定“诱饵” (Targeting PrettyMethod)符号解密函数内部解密出字符串_ZN3art9ArtMethod12PrettyMethodEb。符号含义这是 ART 运行时函数art::ArtMethod::PrettyMethod(bool)的 C Mangled Name。为什么选它Frida 的frida-java-bridge源码中包含fixupArtQuickDeliverExceptionBug。关于frida检测的一个新思路为了修复 Native 线程抛出异常时栈帧缺失导致的 CrashFrida必须Hook 这个函数。结论攻击者利用了 Frida 的“刚需”将其设为陷阱。3.3 启动监控线程1234//a1: pthread_create (由上层传入)//sub_1C544: 线程执行体 (看门狗)//v20: PrettyMethod 的内存地址 (作为参数传递)returna1(thread_id,0, sub_1C544, v20);4. 终极监控看门狗线程 (sub_1C544)这是一个死循环函数 (__noreturn)负责全方位的环境扫描。4.1 扫描逻辑详解初始化解密出一系列黑名单字符串如 Xposed, Frida, Magisk。循环体 (while(1))sub_1BFAC(Mounts Check)遍历/proc/mounts查找 MagiskHide 留下的痕迹如core/mirror,tmpfs挂载。sub_1C158(Symlink Check)检查/system/bin下的关键文件是否被重定向Root 隐藏常用手段。sub_1C26C(Maps Check)读取/proc/self/maps查找内存中是否加载了frida-agent.so,io.swag.xposed.bridge等模块。sub_26334(a1)(核心完整性校验)这是最致命的一步。它检查传入的PrettyMethod地址 (a1) 是否被篡改。休眠sleep(4)每 4 秒轮询一次。5. 黑盒揭秘处决引擎 (sub_26334)这是整个防御体系中最坚固、最隐蔽的堡垒。它通过状态机混淆控制流通过动态 Shellcode执行处决。5.1 状态机检测逻辑函数内部维护一个状态变量v4初始状态为293539132。检测阶段读取PrettyMethod函数头部的4 字节机器码。比对特征值1476395088(Hex:0x58000050)。特征含义0x58000050对应 ARM64 指令LDR X16, #8。这是 Inline Hook Trampoline 的标准起手式将跳转地址加载到 X16然后 BR X16。具体原因参考文章关于frida检测的一个新思路分支判定如果等于0x58000050发现 Hook - 状态跳转至887579370(处决状态)。如果不等未发现 Hook - 状态跳转至安全退出。5.2 Shellcode 静态还原实战 (Step-by-Step)当检测到 Hook 时代码会解密并执行一段 Shellcode。我们完全静态还原了这段代码。步骤 A: 提取密钥 代码逻辑v10 *((_DWORD *)qword_30794 v8 -3 * (v9 / 3) 1);基址0x30794内存值99 00...,A7 00...,A9 00...密钥序列0xA7, 0xA9, 0x99(循环使用)步骤 B: 数据解密 源数据位于 xmmword_30760。代码首先将首字节置为 0x08。Index原始字节Key运算 (XOR)结果 (Hex)00x08-Set to 0x080810xA70xA7A7 ^ A70020x290xA929 ^ A98030x4B0x994B ^ 99D240xA60xA7A6 ^ A70150xA90xA9A9 ^ A90060x990x9999 ^ 990070x730xA773 ^ A7D480x690xA969 ^ A9C090x9A0x999A ^ 9903100xF80xA7F8 ^ A75F110x7F0xA97F ^ A9D6步骤 C:最终修正 (The Final Trick)代码执行*(_DWORD *)v16 3008; (对前4字节进行整数加法)。前4字节 (Little Endian):0xD2800008加数:3008(0xBC0)运算:0xD2800008 0x00000BC0 0xD2800BC8修正后前4字节:C8 0B 80 D2步骤 D: 最终载荷 (The Payload)将结果解释为 ARM64 汇编Hex汇编指令含义C8 0B 80 D2MOV X8, #94系统调用号 94 (__NR_exit_group)01 00 00 D4SVC #0Trap to Kernel (执行系统调用强制退出了)C0 03 5F D6RET之前强制退出了所以此处为不可达代码5.3 处决机制详解行为mmap分配 RWX 内存 - 写入 Shellcode -j___clear_cache- 执行。效果调用exit_group(0)。杀伤力这比exit()更底层、更彻底。它会立即杀死当前进程组中的所有线程。由于没有异常抛出Frida 甚至来不及捕获 detaching 事件APP 就会直接消失。6. 辅助防御体系sub_1B380如果配置不允许 Hook状态码非 249程序会进入备用防御模式。进程伪装 (sub_1B144)读取/proc/self/cmdline。使用prctl(PR_SET_NAME)和 Java 反射setArgV0修改进程名。目的在ps列表中伪装成合法系统进程防止被用户轻易发现并 Kill。双进程反调试 (sub_1A0D8)利用fork创建子进程。子进程对父进程执行ptrace(PTRACE_ATTACH)。目的抢占 Ptrace 调试端口。当 IDA/GDB 试图附加时会因端口被占用而失败 (EPERM或EBUSY)。7. 总结与防御建议 (Bypass)7.1 终极 Bypass 方案针对“看门狗自爆”架构最优雅的破解方式是让看门狗失效。方案 A (推荐): 沉默看门狗操作Hookpthread_create。逻辑在sub_1CEF8执行期间检查传入的线程函数地址。如果地址匹配sub_1C544将其替换为NOP(空函数)。效果线程正常启动但没有任何检测逻辑运行。方案 B (进阶): 欺骗视觉操作Hook 内存读取相关函数。逻辑当sub_26334试图读取PrettyMethod地址时返回原始未 Hook 的指令字节 (0x...)而非被 Frida 修改后的跳转指令。效果看门狗永远认为内存是纯净的。方案 C (硬核): 阻断自杀操作Hooksvc指令或mmap。逻辑监控sub_26334内的mmap调用大小为 28 字节是强特征或者直接 Patch 掉sub_26334的状态机跳转逻辑。