首页 / 新闻资讯 / 加固效果自测工具和方法:不用等被破解就能验证防护有效性
去年我们金融App上线前被安全测试打回的场景让我明白一件事:等黑产来验证加固效果,代价就是上架延期和核心代码裸奔。那之后我花了三个月,搭建了一套可复现的加固效果评估工具链。这套工具链帮我们在POC阶段就筛掉了3家“号称能防Frida”的厂商,节省了至少半年的合同周期。

今天把这套方法论完整开源出来,从环境搭建到结果解读,每一步都给你写清楚。
搭建评估环境不需要昂贵的设备,一台root过的Pixel(3代以上即可,二手500块能拿下)加上一台普通办公电脑就够了。
硬件清单:
软件环境:
adb命令可用)⚠️ 关键说明:为什么要root?因为我们要模拟攻击者的环境。黑产拿到你的App,第一件事就是在root过的设备上跑Frida/Xposed。如果加固方案连root环境都检测不到,后面的测试就不用做了。
Frida是目前最主流的动态插桩工具,安全测试人员人手一份。如果加固方案连标准的Frida都防不住,那基本等于没防。
PC端安装(一行命令搞定):
pip install frida-tools安装后验证版本(记下这个版本号,后面要用):
frida --version# 输出示例:16.1.0手机端安装Frida Server:
frida-server-{版本号}-android-arm64.xz)adb push frida-server /data/local/tmp/adb shell chmod 755 /data/local/tmp/frida-serveradb shell su -c /data/local/tmp/frida-server &验证Frida是否正常工作:

# 查看手机上正在运行的进程frida-ps -U如果能看到进程列表,说明Frida安装成功。
拿到一个加固过的App,第一步是识别它用了哪家方案。不同厂商的防护重点不同,识别后可以针对性测试。推荐这个开源工具:
Android-packinfo:原理是遍历APK里的SO文件和dex类名,匹配特征库来判断加固厂商。用法超级简单:

git clone https://github.com/smartdone/Android-packinfopython packinfo.py your_app.apk输出示例:
报告,当前发现So存在加固,疑似加固类型:360加固除了识别厂商,它还能帮你确认:这个包到底加固了没有?有的外包团队收钱不办事,一测就知道了。
如果想做持续回归测试(比如每次发版前自动跑一遍加固验证),可以用Google官方的AutoRepro,这是Android安全补丁测试框架,可以集成到CI流程里。
安装后配置好Android Studio和Gradle插件,跑一条命令就能自动完成:安装测试包 → 执行Hook脚本 → 收集结果 → 生成报告。
这是整套方法里最关键的部分。下面的脚本都是经过实战验证的,直接复制粘贴就能用。
先写一个最简单的脚本,测试加固App能不能被Frida注入:
// test_attach.js// 目的:检测Frida能否attach到加固App的进程if(Java.available) { Java.perform(function() { console.log("[*] Frida injected successfully"); // 尝试列举所有已加载的类 Java.enumerateLoadedClasses({ onMatch: function(className) { if(className.includes("your_package_name")) { console.log("[+] Found target class: " + className); } }, onComplete: function() { console.log("[*] Class enumeration complete"); } }); });}运行命令:
frida -U -f com.your.package.name -l test_attach.js --no-pause判定标准:
Frida injected successfully,说明加固失败,连attach都没防住很多加固方案会把真实代码解密后,用自定义ClassLoader加载。如果直接Java.use()会报Class not found,需要先拿到正确的ClassLoader。
下面这个脚本专门用于绕过360加固这类方案的classloader检测:
// test_hook_classloader.js// 目的:获取加固App的真实ClassLoader,并Hook关键方法if(Java.available) { Java.perform(function() { var application = Java.use("android.app.Application"); var reflectClass = Java.use("java.lang.Class"); // Hook Application.attach方法,在加固解密完成后获取ClassLoader application.attach.overload('android.content.Context').implementation = function(context) { var result = this.attach(context); var classloader = context.getClassLoader(); // 将当前的ClassLoader替换为加固App的真实ClassLoader Java.classFactory.loader = classloader; console.log("[*] Got real classloader: " + classloader); // 现在可以用Java.classFactory.use()来获取加固后的类了 // 示例:假设要Hook的类叫com.target.MainActivity try { var TargetClass = Java.classFactory.use("com.target.MainActivity"); console.log("[+] Successfully loaded class: " + TargetClass); // Hook onCreate方法 if(TargetClass.onCreate) { TargetClass.onCreate.overload('android.os.Bundle').implementation = function(bundle) { console.log("[!] onCreate called!"); return this.onCreate(bundle); }; } } catch(e) { console.log("[-] Failed to load target class: " + e); } return result; }; });}这个脚本能做什么:
判定标准:
Got real classloader并Hook到目标方法,说明运行时保护不合格专业的黑产团队不会每次手动跑Frida,而是把脚本打包进App,实现一键持久化Hook。这种攻击方式叫“Frida持久化”,最新的技术方案甚至能把Frida脚本直接编译进SO文件,随App启动自动执行。
测试方法是:用fripack工具把Frida脚本打包成Xposed模块或注入到APK的SO中,然后重新安装App,看加固方案能否拦截。
# 安装fripack工具git clone https://github.com/std-microblock/fripackcd fripack# 将Frida脚本打包成Xposed模块python fripack.py --script your_hook.js --output xposed_module.apk判定标准:
如果说上面的Hook测试是“敲门”,那内存Dump就是“破门”。攻击者可以用工具把运行时的内存直接导出,分析明文的代码和数据。如果加固方案连内存Dump都防不住,那核心逻辑基本等于裸奔。
// dump_dex.js// 目的:从内存中提取Dex文件// 来源:frida-dexdump工具的简化版var libart = Process.getModuleByName("libart.so");var address = libart.base;console.log("[*] libart base: " + address);// 遍历内存查找Dex文件特征// Dex文件头部通常是"dex\n035"(十六进制:64 65 78 0A 30 33 35)function findDex() { var ranges = Process.enumerateRanges({ protection: 'rw-', coalesce: true }); ranges.forEach(function(range) { // 扫描内存页,寻找Dex magic // 实际代码需要遍历内存并匹配特征 });}运行后如果能在内存中提取出完整的dex文件,说明加固方案的内存加密没有做到位。
不想自己写脚本的话,直接用现成的工具:
pip install frida-dexdumpfrida-dexdump -U -f com.your.package.name这个工具会自动扫描加固App的内存,提取所有加载的dex文件并保存到本地。
判定标准:
我测试了7家厂商后,总结了一套量化的评分体系:
| 测试项 | 满分 | 合格线 | 评分标准 |
|---|---|---|---|
| Frida attach防护 | 10分 | 8分 | 完全阻止attach得10分;闪退得8分;能attach但Hook失败得5分;能Hook成功得0分 |
| ClassLoader隔离 | 15分 | 12分 | 无法获取真实ClassLoader得15分;能获取但Hook失败得10分;能Hook关键方法得0分 |
| 持久化注入防护 | 15分 | 12分 | 阻止所有持久化注入得15分;阻止部分得8分;完全失效得0分 |
| 内存Dump防护 | 20分 | 16分 | 无法dump任何有效代码得20分;能dump但代码严重混淆得10分;能dump明文代码得0分 |
| Xposed绕过测试 | 10分 | 8分 | 用Xposed框架尝试Hook,完全阻止得10分,部分阻止得5分,能Hook成功得0分 |
| 运行稳定性 | 15分 | 12分 | 加固后30款机型零崩溃得15分≤1%崩溃率得10分>5%崩溃率得0分 |
| 性能损耗 | 15分 | 10分 | 启动时间增加<15%得15分<30%得10分>50%得0分 |
最终评级:
把上面的内容串起来,一次完整测试的步骤:
Day 1:环境搭建
Day 2-3:执行测试
Android-packinfo识别加固厂商,做到心中有数test_attach.js,看Frida能否attachtest_hook_classloader.js,看classloader防护是否到位frida-dexdump,尝试从内存提取dexfripack打包持久化注入模块,测试深度防护Day 4:结果分析
坑1:只用模拟器测试。黑产用的是真机root环境,模拟器的检测逻辑和真机完全不同。有的加固方案在模拟器上“装死”,到真机上直接失效。
坑2:只看厂商的演示视频。我们遇到过一家厂商,演示时防Frida效果完美,自己一测10分钟就破了。后来发现他们演示用的是自己修改过的旧版Frida,特征库里根本没有。
坑3:只测一个版本。黑产的工具也在进化。建议用最新版Frida测试的同时,也尝试降级到老版本——有些加固方案对新版检测严格,但对老版疏于防范,这是严重漏洞。
坑4:忽略性能测试。有的加固方案防护确实强,但App启动从800ms飙到3秒,上线后用户差评爆炸。性能也是防护的一部分。
| 工具名称 | 用途 | 获取方式 |
|---|---|---|
| Frida | 动态插桩核心工具 | pip install frida-tools |
| frida-dexdump | 内存Dex提取 | pip install frida-dexdump |
| Android-packinfo | 查壳/识别厂商 | GitHub搜Android-packinfo |
| fripack | Frida持久化打包 | GitHub搜std-microblock/fripack |
| AutoRepro | 自动化测试集成 | Google官方文档 |
| Kea2 | UI自动化+Fuzzing | PyPI |
以上所有工具都是开源免费的,不用花一分钱就能搭建一套专业的加固评估体系。
最后一条建议:把这套工具链固化到你的CI流程里,每次发版前自动跑一遍。不要等到安全测试打回来再后悔——加固这事,能用工具验证的,就别靠厂商吹牛。