绕过证书锁定 — Frida、reFlutter、Objection 几种工具链
什么是证书锁定
证书锁定(certificate pinning)是应用的主动安全措施:应用内置一份"可接受证书指纹"白名单,每次 TLS 握手时都主动比对服务器证书指纹是否在白名单内——不依赖系统证书存储。即使 PCAPdroid CA 成功注入到系统证书里,应用自己的 pinning 逻辑还是会拒绝。
现代 App(尤其是金融、社交、主流大厂 App)普遍做了 pinning,这是 TLS 解密路上最头疼的障碍。
工具链一览
| 工具 | 适用场景 | 需要 root |
|---|---|---|
| LSPosed + sslunpinning | 通用 App | ✅ |
| Frida + objection | 动态 Hook,最灵活 | ✅ 或非 root + Frida Gadget |
| reFlutter | Flutter App 专用(替换 flutter 引擎) | ❌(APK 重签名) |
| apk-mitm | 通用 App(反编译降低 targetSdk) | ❌ |
| android-unpinner | apk-mitm 备选 | ❌ |
Frida + Objection
Frida 是一个动态插桩框架,可以在运行时 Hook 任意函数。Objection 是 Frida 在上层封装的命令行工具,专门有 Android SSL pinning bypass 的预置脚本。
基本流程:
- 设备上跑 Frida Server(需要 root,或用 Frida Gadget 注入到 APK)
- 电脑上装 objection
- objection 连接设备后执行
android sslpinning disable - objection 会自动注入一系列 Frida 脚本,覆盖 OkHttp、WebView、Apache HttpClient 等主流库的 SSL 验证逻辑
- 然后用 PCAPdroid 解密同一应用——pinning 已被跳过
优点是实时生效、不改 APK、App 签名保持不变(SSO 不受影响)。缺点是需要 root 或 Gadget 注入,且脚本需要随 Frida 和 Android 版本更新。
reFlutter(Flutter 应用专用)
Flutter App(用 Dart 写的 Android/iOS 跨平台 App,Flutter 3.10+ 内置证书 pinning)的 pinning 逻辑在 Flutter 引擎内部,普通 Frida Hook 很难命中。reFlutter 的做法是:
- 解包 APK
- 找到 libapp.so(Dart VM 产物)
- 替换为打了 patch 的 Flutter 引擎(禁用 pinning)
- 重编译、重新签名、安装
这是目前绕过 Flutter pinning 最有效的方案,前提是 App 不是用 AOT 编译为 arm64 以外的架构。
apk-mitm
apk-mitm 完全自动化以下步骤:
- apktool 反编译 APK
- 降低 targetSdkVersion 到 23(Android 6.0),此时应用无条件信任用户 CA
- 自动处理网络安全配置、证书锁定代码
- 重新编译并签名
优点是一键命令行工具、不依赖 root。缺点是 App 签名变了——SSO 登录失效,解决方法见系统证书信任修复页的"apk-mitm / apktool 重签名"章节末尾的 SSO 数据恢复流程。
android-unpinner
mitmproxy 官方推荐的替代工具,相比 apk-mitm 在某些场景下效果更好,特别是在处理 App 自带 pinning 逻辑(非 OkHttp/WebView 标准库)时。
逆向工程(最后手段)
如果以上工具都不管用(App 用了完全自定义的 pinning 逻辑),就需要真·逆向:
- jadx:反编译 APK 到 Java 源码,定位 pinning 代码
- apktool:反编译后手动删改 pinning 相关逻辑
- VS Code APKLab 扩展:把 APK 解包、编辑、重打包整合到 IDE 里
- 参考 OWASP MASTG 的 Tampering and Reverse Engineering 章节
这是最耗时但最强大的方案,适合需要深度逆向的场景。