在移动应用安全测试里,SSL Pinning(证书锁定)是保护 App 与服务端通信不被中间人截获的常见手段。但对安全研究人员来说,它也是抓包分析时的第一道墙。Frida 因其动态插桩能力,成了绕过这道墙最顺手的工具。
环境准备
假设你已经 root 了测试机,并装好了 frida-server。在电脑端确认连接:
bash
# 电脑端
frida-ps -U # 列出设备上的进程,验证连接
# 设备端(root)
./frida-server -D &
姿势一:全局 Hook 常见校验证书函数
最通用的一招,是 Hook 掉系统证书校验的关键函数,让 App 无论用哪种实现都「验不出来」。安卓与 iOS 各有一组常见的校验入口:
- 安卓:
okhttp3的CertificatePinner、系统TrustManager。 - iOS:
SecTrustEvaluate、SecTrustEvaluateWithError。
姿势二:针对性 Hook 具体类
当全局 Hook 失效(App 用了自定义校验逻辑)时,就需要定位具体实现。以安卓的 okhttp3 为例,绕过它的 pinning:
javascript
Java.perform(function () {
var CertificatePinner = Java.use('okhttp3.CertificatePinner');
CertificatePinner.check.overload('java.lang.String', 'java.util.List')
.implementation = function (hostname, peerCertificates) {
// 直接放行,不再校验
console.log('[+] bypass check for: ' + hostname);
};
});
姿势三:重放 + 目标脚本
当目标很明确、只想抓某一个 App 的流量时,最优雅的做法是写一个 目标脚本,只针对该 App 的包名注入:
bash
frida -U -f com.example.app -l bypass.js --no-pause
「全局 Hook 求快,目标脚本求稳。先用前者快速定位,再用后者做干净复现。」
踩坑记录
不同版本、不同混淆程度下,校验函数签名会变。遇到 overload 报错时,先用 frida-trace 或打印 enumerateLoadedClasses 确认真实签名,不要盲目套模板。更多用法可参考 Frida 官方文档。
小结
三种姿势各有适用场景:
| 姿势 | 适用 | 稳定性 |
|---|---|---|
| 全局 Hook | 快速排查 | 中 |
| 针对具体类 | 自定义校验 | 高 |
| 目标脚本 | 定向复现 | 最高 |
抓包本质是一场「和校验逻辑的攻防」,掌握了 Frida 的动态插桩,就能在大多数场景下把证书这道墙拆掉。