在移动应用安全测试里,SSL Pinning(证书锁定)是保护 App 与服务端通信不被中间人截获的常见手段。但对安全研究人员来说,它也是抓包分析时的第一道墙。Frida 因其动态插桩能力,成了绕过这道墙最顺手的工具。

环境准备

假设你已经 root 了测试机,并装好了 frida-server。在电脑端确认连接:

bash
# 电脑端
frida-ps -U          # 列出设备上的进程,验证连接

# 设备端(root)
./frida-server -D &

姿势一:全局 Hook 常见校验证书函数

最通用的一招,是 Hook 掉系统证书校验的关键函数,让 App 无论用哪种实现都「验不出来」。安卓与 iOS 各有一组常见的校验入口:

姿势二:针对性 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 的动态插桩,就能在大多数场景下把证书这道墙拆掉。