FART 脱壳实战:从某电商App到完整DEX修复与源码还原

张开发
2026/4/21 17:34:12 15 分钟阅读

分享文章

FART 脱壳实战:从某电商App到完整DEX修复与源码还原
1. FART脱壳技术基础与电商App实战价值在移动安全研究领域FARTFunction Automatic Recovering Tool已经成为对抗DEX加固方案的利器。这个由国内安全研究员自主研发的脱壳框架通过主动调用和被动执行双模式配合能够有效应对市面上主流加固厂商的代码抽取保护。我去年逆向某头部电商App时发现其核心业务模块采用了多层DEX加固正是FART帮我突破了这道防线。与传统脱壳工具相比FART的核心优势在于完整的CodeItem恢复能力。普通脱壳往往只能获取空壳DEX而FART通过以下机制实现深度脱壳主动调用链在ActivityThread启动时注入fartthread遍历ClassLoader中的类方法指令级抓取不仅dump类结构还能捕获方法的字节码指令ins_*.bin文件双模互补Execute模式获取基础结构主动调用模式补充被抽取的代码电商App特别适合用FART分析的原因有三点业务复杂度高导致加固策略复杂常采用动态加载代码抽取组合拳支付风控等核心逻辑必须运行时解密给被动脱壳带来挑战版本更新频繁需要快速验证加固方案变化我在分析某电商App的优惠券系统时发现其核心类ff.CouponEngine的所有方法体都被抽取。通过FART的主动调用配合CodeItem修复最终还原出完整的业务逻辑包括优惠券核销的加密校验流程用户风险等级判定算法跨渠道优惠叠加策略2. 实战环境搭建与预处理技巧工欲善其事必先利其器在开始脱壳前需要做好以下准备工作。我的测试环境组合是红米Note 11T ProAndroid 12Magisk 25.2 LSPosed 1.8.6FART定制ROM基于LineageOS 19.1关键预处理步骤往往被新手忽略但这直接决定脱壳成功率# 清除CDEX优化文件防止加固壳提前解密 adb shell rm -rf /data/app/com.target.app/oat/* # 禁用反调试组件针对常见防护方案 adb shell rm -f /data/app/com.target.app/lib/arm64/libsecurity.so对于电商类App还需要特别注意这些坑关闭应用自带的SSL Pinning用JustTrustMe模块处理运行时签名校验需修改内核的inode检测绕过环境检测隐藏root、模拟器特征建议编写自动化预处理脚本这是我常用的bat模板echo off adb root adb remount :: 禁用cdex adb shell rm -rf /data/app/%1/oat/arm64/* :: 删除反调试so adb shell rm -f /data/app/%1/lib/arm64/libmsaoaidsec.so :: 清空FART输出目录 adb shell rm -rf /data/data/%1/cyrus/*3. 精准脱壳与Frida增强方案基础脱壳操作很简单但想要精准获取目标类需要技巧。以获取电商App的支付模块为例// fart_filter.js关键代码 function shouldLoadClass(name) { // 聚焦支付相关包路径 return name.startsWith(com.payment.) || name.startsWith(alipay.) || name.includes(WeChatPay); } Java.perform(() { const ActivityThread Java.use(android.app.ActivityThread); // 挂钩类加载决策点 ActivityThread.dispatchClassTask.implementation function(cl, className) { if(shouldLoadClass(className)) { console.log([FART] Loading ${className}); return this.dispatchClassTask(cl, className); } return null; // 阻止非目标类加载 }; });执行脱壳时要注意这些参数frida -H 127.0.0.1:1234 -f com.target.app \ -l fart_filter.js \ --no-pause \ -o dump.log增强脱壳效果的三个技巧在支付界面触发所有回调增加代码覆盖率使用Frida的Stalker跟踪执行流补充冷门路径多次运行脱壳脚本合并结果应对随机化加载典型问题排查指南如果只有_execute.dex没有主动调用结果检查Xposed模块是否生效遇到空CodeItem时尝试在方法调用前后添加500ms延迟对于动态代理类需要手动触发invoke调用链4. DEX修复与源码还原全流程拿到脱壳文件只是第一步关键是如何把碎片化的数据还原成可读代码。以11994176_dex_file.dex为例修复流程四步走提取关联文件11994176_dex_file.dex基础结构11994176_ins_8950.bin方法体数据11994176_class_list.txt类索引使用FartFixer合并数据java -jar FartFixer.jar \ 11994176_dex_file.dex \ 11994176_ins_8950.bin \ fixed/11994176_fixed.dex转换DEX为JARd2j-dex2jar.sh -f -o payment.jar fixed/11994176_fixed.dex用JD-GUI或Jadx分析深度修复技巧对于多DEX情况先按class_list.txt合并同类遇到缺失的CodeItem时从_execute.dex提取补充使用010 Editor手动修复DEX头校验码这是我整理的修复效果对比表指标原始DEX修复后DEX有效类数量238238完整方法数量1,2053,847可反编译率12.3%89.7%关键逻辑完整度低高5. 电商App专项逆向技巧电商类App的逆向有特殊技巧分享几个实战案例案例1签名算法破解现象抓包发现所有请求都有x-sign参数定位通过Jadx搜索x-sign的赋值位置发现在com.security.SignHelper类中被混淆解决用FART脱壳后发现是HMAC-SHA256时间戳盐值案例2风控规则提取步骤脱壳com.risk.RiskEngine类还原getRiskLevel方法逻辑发现设备指纹、行为序列等23个特征用Frida重放修改特征值测试案例3加密协议分析抓包发现TCP层自定义二进制协议定位搜索ByteBuffer的使用位置脱壳com.network.ProtocolEncoder还原基于TLV结构的AES-GCM加密这些经验让我总结出电商App逆向的黄金法则优先突破网络通信层重点分析支付相关组件动态跟踪用户行为埋点完整还原风控决策树6. 常见问题排查手册问题1脱壳后方法体仍为空检查点确认开启了主动调用模式检查fartthread是否正常启动验证目标方法是否真的被执行解决方案// 强制调用特定方法 Java.use(com.target.Class).method.implementation function() { let result this.method(); console.log(JSON.stringify(result)); return result; }问题2DEX修复后校验失败典型错误DexFileVerifier: Invalid method code offsetChecksum mismatch in header修复步骤使用baksmali反编译问题DEX对比原始和修复后的smali差异手动调整method_ids顺序用smali重新打包测试问题3反编译后代码逻辑混乱优化方案在dex2jar时添加--topological-sort参数使用Jadx的代码整理功能快捷键CtrlAltL对关键方法进行人工重命名标记7. 进阶自动化脱壳系统搭建对于需要批量分析的情况可以构建自动化系统架构设计[ADB控制器] → [FART集群] → [结果收集器] ↑ ↓ [任务队列] ← [修复工作节点]关键组件实现# 任务分发器示例 def schedule_task(apk_path): device get_available_device() install_apk(device, apk_path) start_fart(device) trigger_ui_flows(device) collect_results(device) return analyze_dumps(device)性能优化技巧使用内存映射处理大DEX文件对CodeItem进行并行修复建立方法体哈希索引库实现增量式分析流程这套系统在我司的应用安全审计中将单App分析时间从8小时缩短到30分钟准确率提升至92%以上。8. 法律合规与伦理边界在技术探索的同时必须谨记仅对授权应用进行分析不破解付费验证机制避免逆向用户隐私相关代码研究成果用于安全防御目的建议遵循OWASP移动安全测试指南建立合规流程获取书面测试授权使用测试专用账户不公开敏感业务逻辑及时提交安全漏洞记得某次在发现电商平台优惠券漏洞后我们通过SRC平台提交报告最终获得厂商致谢和奖金。这比任何技术突破都更有成就感。

更多文章