去年我们团队经历了一次让我至今后怕的事故。客户的核心金融APP在上架前采购了某头部厂商的加固服务,“防二次打包”“防动态调试”是合同里的核心承诺。上线第三周,风控系统报警——多个设备的请求签名完全一致,典型的“重放攻击”特征。进一步溯源发现,攻击者不仅绕过了加固,还通过注入恶意DEX的方式篡改了交易接口,薅走了六位数的推广资金。选型时的“大厂信仰”瞬间崩塌,我们不得不连夜启动应急响应。

一、3起公开披露的加固绕过事件复盘
案例一:爱加密——脱修工具批量绕过(2025年4月)
2025年4月,MT论坛上出现了针对爱加密加固的详细脱修教程。攻击者通过以下步骤完成绕过:
- 脱壳:使用定制版Dump工具从内存中提取解密后的DEX
- 替换入口:修改AndroidManifest.xml中的Application入口,移除壳组件的初始化逻辑
- 清理残留:删除assets目录下的加固特征文件(.ijm、.smail等)
- 重打包:重新签名后应用正常运行,核心业务逻辑完全暴露
该帖发布后一周内,多个黑灰产工具群开始批量售卖“爱加密通杀脱壳脚本”。
技术复盘:爱加密被绕过的根本原因在于其加固方案过度依赖“隐藏入口”和“DEX加密”的单点防护。一旦攻击者找到内存Dump的时机(通常在壳加载完成、业务DEX解密后但尚未销毁前),所有防护形同虚设。更致命的是,加固后的应用缺乏运行时完整性校验机制,被脱壳后没有任何“自毁”或“降级”响应。
案例二:梆梆安全——Frida绕过反调试与kill防护(2025年8月)
某安全研究团队在2025年8月公布了绕过梆梆加固企业版反调试的完整方案。梆梆企业版内置了ptrace进程附加检测、Frida端口扫描、TracerPid读取等多层防护,但攻击者的绕过路径很清晰:
1. 用Frida Stalker跟踪壳的代码执行流,定位检测函数2. Hook open/read系统调用,拦截/proc/self/status的读取,返回伪造的清零TracerPid数据3. Hook kill函数,拦截加固进程的自我终止行为4. 待壳完全加载后,从内存Dump解密后的DEX
研究人员的原话是:“开着frida进去会被kill,但hook掉kill的syscall,打印堆栈快速定位到kill的位置,然后直接返回即可绕过。”
技术复盘:梆梆的失败在于其反调试逻辑是“固定点位”而非“行为链”检测。攻击者只要找到检测点并Hook对应的系统调用,就能让反调试失效。更讽刺的是,梆梆自身的加固壳为了稳定运行,必须调用标准的系统API(open、read、kill),这给攻击者留下了精准的Hook点。类Unix系统的“一切皆文件”哲学,在这里成了最大的攻击面。
案例三:360加固保——恶意DEX注入绕过防护(2025年6月)
2025年6月,360官方发布公告称发现黑灰产利用“恶意DEX注入”技术绕过加固。攻击手法如下:

- 攻击者拿到脱壳后的部分代码,修改核心逻辑(如支付回调)
- 将篡改后的DEX重新组装,删除原应用中的所有DEX文件
- 将恶意DEX填充到原始应用中,形成“补丁APP”
- 在ROOT环境下使用一键补丁工具加载该APP,篡改成功
更严重的问题:360在公告中承认,即使是已加固的应用,也普遍存在被恶意DEX注入的风险。攻击者不需要完全破解加固方案,只需要“在运行时替换掉你的业务DEX”。360后续新增了“恶意DEX注入检测”功能,但这一漏洞的存在本身说明:传统加固方案的信任模型是静态的,一旦应用安装到设备上,运行时环境完全不可控。
二、防二次打包失效的根因分析
这三个案例暴露出的共性问题是:加固厂商承诺的“防二次打包”,在真实的攻击链面前几乎不堪一击。原因有三:

1. 脱壳工具的商品化
2025年的黑灰产已经不是“高手挖洞、小白吃肉”的阶段了。市面上存在大量成熟的脱壳工具,从免费版(FDex2、DumpDex)到付费版(XX脱壳王、通杀工具箱),对360、梆梆、爱加密、腾讯乐固等主流厂商的支持程度极高。攻击者甚至不需要懂逆向工程,点几下按钮就能拿到完整源码。
2. “猫鼠游戏”的根本困境
加固的本质是“代码混淆 + 反调试 + 完整性校验”,但这三者都存在天生缺陷:
- 混淆只能提高阅读成本,无法阻止代码执行。只要代码最终会在CPU上跑,攻击者就能通过内存Dump抓取明文。
- 反调试基于特征检测,Hook掉检测函数即可绕过。这是“你藏我找”的无限游戏,攻击者永远有信息优势(他知道你在检测什么,你不确定他用了什么手段)。
- 完整性校验依赖可信环境,但APP运行在用户设备上,用户拥有最高权限(ROOT/越狱)。这就像你把保险箱放在别人家里,还指望对方打不开。
3. 加固方案只解决了“静态安全”,忽视了“运行时风险”
上述所有绕过案例的共性攻击路径是:
- 在静态阶段,攻击者使用脱壳工具从内存中提取明文DEX
- 在动态阶段,通过HOOK/Frida篡改运行时行为
- 在持久化阶段,通过二次打包或DEX注入将恶意代码植入应用
大多数加固方案的防护止步于“阻止你直接解压APK拿到DEX”,但对“运行时篡改”和“内存Dump”几乎没有防御能力。
三、加固方案升级:从“单点防护”到“纵深防御”
基于上述案例教训,我们调整了加固策略。以下是可落地的新方案:
1. 核心逻辑下沉Native层
纯Java/Kotlin代码的DEX加固已经被证明不可靠。将核心算法、密钥派生、签名校验等逻辑下沉到Native层(C/C++),并:
- 使用Obfuscator-LLVM进行代码混淆(控制流平坦化、虚假控制流、指令替换)
- 关键函数不使用默认的JNI静态注册,改用动态注册 + 动态加载
- 在Native层实现堆栈回溯,检测调用者是否为预期Java类
原理:Native层的逆向难度远高于DEX。虽然仍有被破解的可能,但攻击成本指数级上升。
2. 运行时完整性校验 + 自毁机制
在应用运行过程中持续校验自身完整性:
- 定期计算APK自身(或核心SO库)的哈希值,与预期值比对
- 检测Java层和Native层的Hook特征(Xposed、Frida、Substrate)
- 检测调试器、模拟器、ROOT环境
- 关键点:检测到异常后,不要直接崩溃(容易被定位),而是采用“降级策略”——返回错误数据、随机失败、延迟响应
参考:iOS生态的防护思路已经证明,运行时对抗是防二次打包的最后一道防线。
3. 服务端配套风控
这是最容易被忽视但也最有效的一环:
- 请求签名绑定设备指纹:将请求签名与设备的唯一标识(如Android ID、OAID、DRM ID)绑定,服务端验签的同时校验设备维度,防止签名被复制后用于重放攻击
- 行为异常检测:单一设备短时间内大量请求、相同签名但不同IP、请求时序异常等,服务端可直接拦截
- 关键接口走BaaS风控服务:接入极验、数美等专业风控厂商,将部分安全能力从客户端剥离
核心理念:客户端没有绝对的安全,服务端的风控才是最后的保险。
四、应急响应SOP:当你的加固被绕过时
如果发现加固被绕过(风控告警、盗版应用上线、第三方报告),按以下流程执行:
阶段一:止血(1-4小时)
- 立即下架当前版本,通过热修复或强制更新让用户升级
- 分析攻击样本:下载盗版APK,对比正版APK的差异
- 使用
diff对比META-INF目录,确认签名是否被替换 - 使用jadx打开盗版APK,检查MainActivity/Application入口是否被修改
- 检查assets/lib目录是否存在异常SO或DEX文件
- 逆向攻击手法:如果能拿到脱壳后的DEX,分析攻击者修改了哪些逻辑、篡改了哪些接口
阶段二:根因分析(4-24小时)
- 定位被绕过的具体环节:
- 是DEX加固被脱壳?(检查是否存在内存Dump痕迹)
- 是反调试被绕过?(检查攻击样本是否包含Frida/Xposed脚本)
- 是二次打包后签名校验失效?(验证盗版APK是否重新签名)
- 复现攻击路径:在测试环境中尝试复现攻击者的完整流程
- 评估影响面:被盗资金/数据量、受影响用户数、合规风险
阶段三:加固方案升级(24-72小时)
- 短期方案:更换加固厂商(如果原厂商响应不力)或升级到更高等级的防护配置(如梆梆的“企业版-内存保护”)
- 中期方案:实施第三节的“纵深防御”改造,重点将核心逻辑下沉Native并增加运行时校验
- 长期方案:重构关键业务的信任模型,从“客户端验证”转向“服务端风控”,客户端仅作为执行终端
阶段四:事后复盘与持续监控
- 输出安全事件报告:记录根因、影响、处置过程、改进措施
- 建立威胁情报通道:接入第三方安全监测平台(如爱加密的渠道监测、腾讯御安全),实时监测盗版应用的上线和传播
- 定期红蓝演练:每季度聘请外部团队对APP进行渗透测试,主动发现加固短板
五、选型建议:如何避免“承诺失效”的坑?
基于真实踩坑经验,给安全架构师和技术负责人的建议:
1. 不要迷信“加固强度”的营销话术
“军工级加密”“银行级防护”都是营销词汇。真正验证加固方案是否靠谱,唯一的方法是拿你的真实APK去测试:
- 用jadx和GDA反编译加固后的APK,看能否看到明文代码
- 用Frida/Xposed尝试Hook关键函数,看是否被拦截
- 用apktool重新打包并签名,看能否正常运行
- 用定制版脱壳工具(自己找或采购)尝试内存Dump
三项全通过,才算及格。
2. 把“应急响应能力”作为核心选型指标
被绕过不可怕,可怕的是厂商反应迟钝。选型时问清楚:
- 发现绕过漏洞后,平均修复时长是多久?(承诺<48小时才考虑)
- 是否提供7×24小时安全专家支持?
- 是否提供威胁情报共享?(是否第一时间通知客户新的绕过手法)
- 合同内是否明确安全事件的响应时效和赔付责任?
3. 放弃“单点依赖”,采用“加固 + 自研”混合策略
把核心安全逻辑完全交给第三方加固厂商是最大的风险。我们的做法是:
- 加固厂商解决80%的通用防护(DEX加密、反调试、签名校验)
- 自研模块解决20%的核心资产保护(Native层关键算法、运行时环境检测、与服务端的双向认证)
- 即使厂商被绕过,自研模块也能争取到宝贵的响应时间
加固厂商在进步,攻击工具也在进化。2025年的现实是:没有牢不可破的壳,只有不断提高的攻击成本。作为安全架构师,我们的职责不是寻找“绝对安全的工具”,而是构建“即使被绕过也能快速发现、快速止血、快速升级”的防御体系。
那天晚上,我看着风控系统的报警,深刻理解了这句话。希望你的加固方案,不是最后一个让你彻夜加班的“保险丝”。