首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
移动端SSL Pinning抓包绕过实战:从证书安装到运行时Hook
📅 2026/10/29 2:25:20
✍️ 爱科研究院
👁 阅读 3,247
简介这份资源面向移动安全研究、逆向工程学习以及需要调试支付宝小程序网络请求的开发者聚焦于绕过小程序 SSL 证书校验、让代理工具能够正常抓取 HTTPS 流量的实际需求属于偏进阶的实操型工具包。压缩包共 3 个文件体积约 2KB包含 Python 脚本、JavaScript 脚本与 Markdown 说明文档Python 部分承担 Frida 注入与 Hook 逻辑JavaScript 脚本负责定位并改写证书校验相关函数说明文档则交代使用前提与整体思路三者配合构成一套轻量的验证绕过方案。目前已有 3029 人学习下载说明该方向在安全测试与接口分析场景中关注度较高。读者可从中获得可运行的脚本骨架、证书校验点的定位思路以及代理抓包环境的搭建参考便于在此基础上理解小程序通信机制、排查抓包失败原因并迁移到同类 App 的安全评估与调试工作中。1. 抓包卡在 SSL 验证一次真实的排查起点某次做移动端接口联调目标是一个运行在模拟器里的支付类小程序。代理挂好、证书装好、系统时间校准浏览器里 HTTPS 流量一切正常唯独这个小程序一发起请求就报网络异常代理端连一个 CONNECT 记录都看不到。换了两台设备、三个代理工具结论一致不是工具问题是客户端在 SSL 层做了额外校验。这类场景在移动安全测试里非常典型证书绑定SSL Pinning、双向校验、证书链自检任何一层没绕过抓包就是零流量。这篇内容面向三类人正在做接口分析、想知道校验到底卡在哪一层的人想复现一套可落地的绕过流程、而不是照抄脚本的人以及刚接触移动端抓包、需要一份能照着走通的排查路径的人。下面按“先定位校验类型、再选绕过手段、最后验证流量”的顺序展开每一步都给出判断依据和可执行操作。2. 先分清校验层级SSL Pinning 的四种常见形态2.1 从“有没有流量”反推校验位置抓包失败时第一件事不是急着上 hook 脚本而是看代理端到底收到了什么。如果连 TCP 连接都没有说明请求根本没走到代理可能是客户端硬编码了目标地址、走了私有协议或者代理配置没生效如果看到了 CONNECT 但 TLS 握手失败才是典型的证书校验问题。我在排查时习惯按这个顺序看代理日志有没有 CONNECT 记录 → 握手阶段是否报 certificate unknown / bad certificate → 客户端是否在握手后立刻断开。这三种现象分别对应“没走代理”“证书不被信任”“证书被主动拒绝”处理手段完全不同。很多人一上来就装 Xposed 模块结果发现是代理没配对白折腾半天。2.2 四种 Pinning 形态与识别特征移动端常见的证书校验大致分四类识别方式各有侧重校验形态典型实现识别特征绕过难度系统信任链校验依赖系统 CA 存储装用户证书即可通过低证书固定Pinning代码内嵌证书哈希/公钥换证书即握手失败中双向认证mTLS客户端持证书、服务端校验代理无法完成握手高运行时自检校验证书链、检测代理环境特定条件下才触发失败中高判断属于哪一类最直接的办法是看客户端在握手失败时的行为差异系统校验失败通常报错明确、连接直接断Pinning 失败往往表现为“连接建立后立刻 RST”运行时自检则可能出现“首次请求成功、后续失败”的诡异现象。我一般会先用一个自签证书的代理试一次再换一个和真实证书同 CA 的证书试一次两次结果对比基本能锁定层级。2.3 为什么小程序场景更麻烦小程序运行在宿主容器里网络请求往往经过宿主提供的网络模块而不是直接走系统网络栈。这意味着两件事一是证书安装的位置可能不是系统级而是容器级二是 hook 的注入点不在小程序代码本身而在宿主进程的网络层。实际排查时我会先确认请求是走宿主原生网络库还是走 WebView两者的证书校验逻辑完全不同。走原生库的重点看 TLS 实现和证书校验回调走 WebView 的重点看 WebView 的证书错误处理。这个判断决定了后面所有绕过手段的落点搞错了方向脚本写得再漂亮也没用。3. 绕过手段逐项对比从装证书到运行时 hook3.1 基础层证书安装与信任配置最基础的一步是把代理证书装进设备的信任存储。Android 7 以后用户证书默认不被应用信任需要把证书放到系统证书目录或者用可调试的测试包配合网络安全配置。具体操作上我会先把代理证书导出为 PEM计算哈希后重命名再推到系统证书目录并改权限# 导出代理证书并计算 subject_hash_old用于系统证书命名 openssl x509 -inform PEM -in proxy.crt -subject_hash_old -noout # 输出类似 9a2b3c4d重命名后推入系统证书目录 adb push 9a2b3c4d.0 /system/etc/security/cacerts/ adb shell chmod 644 /system/etc/security/cacerts/9a2b3c4d.0这段命令的关键在-subject_hash_old它生成的是旧版哈希命名系统证书目录按这个规则索引文件名字错了等于没装。推入后需要重启或重新挂载才能生效。这一步能解决系统信任链校验但对 Pinning 无效——因为 Pinning 根本不看系统存储它比对的是代码里写死的值。所以装完证书后如果还是握手失败就说明校验在应用层得往下走。3.2 进阶层hook 证书校验回调应用层 Pinning 的常见实现是重写TrustManager或HostnameVerifier或者在 OkHttp 的CertificatePinner里做比对。绕过思路是在运行时替换这些回调让校验恒返回成功。以常见的 Java 层实现为例hook 的落点通常是X509TrustManager的checkServerTrusted方法// Frida 脚本替换 TrustManager 的证书校验逻辑使其恒通过 Java.perform(function () { var X509TrustManager Java.use(javax.net.ssl.X509TrustManager); var SSLContext Java.use(javax.net.ssl.SSLContext); // 构造一个空实现的 TrustManager所有校验直接放行 var TrustManager Java.registerClass({ name: com.test.TrustAll, implements: [X509TrustManager], methods: { checkClientTrusted: function () {}, checkServerTrusted: function () {}, getAcceptedIssuers: function () { return []; } } }); // 替换 SSLContext.init 的 TrustManager 参数 SSLContext.init.overload( [Ljavax.net.ssl.KeyManager;, [Ljavax.net.ssl.TrustManager;, java.security.SecureRandom ).implementation function (km, tm, sr) { this.init(km, [TrustManager.$new()], sr); }; });这段脚本的核心是两步先注册一个所有方法都空实现的 TrustManager再拦截SSLContext.init把传入的 TrustManager 数组替换成自己的。参数说明上overload里的三个类型分别对应密钥管理器、信任管理器和随机源只替换第二个即可。执行后如果流量通了说明校验在 Java 层如果还是失败校验可能在 native 层需要换 hook 框架或直接改 so。这里有个容易翻车的点有些实现会在checkServerTrusted里抛特定异常空实现虽然放行了但上层逻辑可能因为拿不到证书链而崩溃所以更稳妥的做法是保留原方法调用、只吞掉异常。3.3 深水区native 层与双向认证当 Java 层 hook 无效时校验大概率在 native 层常见于用 BoringSSL 或自研 TLS 库的场景。这时候 hook 的落点是SSL_CTX_set_verify或证书校验回调函数需要定位 so 里的符号并替换返回值。判断是否在 native 层有个简单办法用 hook 脚本监控checkServerTrusted是否被调用如果压根没进这个方法就失败了说明校验在更底层。双向认证则更麻烦客户端持有一份证书服务端要求出示代理没有这份证书就无法完成握手。这种情况下思路从“绕过校验”转为“提取客户端证书”——从安装包或运行时内存里找到证书和私钥配置到代理端。这一步涉及的具体提取手段因实现而异但判断依据是一致的握手阶段服务端主动要求客户端证书且客户端确实出示了。3.4 三种手段的适用边界把上面的手段放一起对比选择逻辑其实很清晰手段适用校验类型侵入性稳定性前置条件系统证书安装系统信任链低高可写系统目录Java 层 hookTrustManager/Pinning中中可注入进程native 层 hook底层 TLS 校验高低定位符号证书提取双向认证中高能拿到私钥我的经验是先用侵入性最低的手段试逐层往下每层用“流量是否通”作为唯一判据。不要一上来就上 native hook那玩意儿调试成本高、版本一换就失效能停在 Java 层就别往下走。另外测试环境尽量用可调试的包省掉很多签名和注入的麻烦。4. 复现流程与验证从零到抓到完整请求4.1 环境准备与基线确认复现前先把基线跑通代理工具开启透明代理、设备代理指向代理机、系统时间同步、证书装好。然后用一个普通 HTTPS 请求验证代理链路是否正常比如访问一个公开的 HTTPS 接口确认能抓到明文。这一步是排除法的基础——如果普通请求都抓不到问题不在目标应用而在环境本身。我见过不少案例是代理只监听了 IPv4、设备走了 IPv6或者代理工具的根证书没被系统信任结果把环境问题误判成应用校验。基线确认后再对目标应用发起请求观察代理日志的变化从“无记录”到“有 CONNECT”再到“握手成功”每一步对应不同的处理动作。4.2 分步复现与失败点定位按前面的层级顺序推进每步记录现象装系统证书后重试若通结束若握手失败进入下一步。注入 Java 层 hook重试若通记录 hook 点若失败检查 hook 是否生效打日志确认方法被调用。若 Java 层未命中转 native 层定位 TLS 校验符号替换返回值。若握手阶段服务端要求客户端证书转为证书提取配置到代理端。每一步的失败点要记清楚是 hook 没注入、方法没被调用、还是调用了但返回值没生效。这三种情况的排查方向完全不同。hook 没注入看进程和框架版本方法没被调用说明校验在别处返回值没生效可能是被上层逻辑覆盖。我习惯在脚本里加日志输出确认每个 hook 点确实被执行而不是靠猜。4.3 验证抓到的流量是否完整流量通了不等于抓全了。验证完整性要看三点请求是否包含完整的 header 和 body、响应是否被正确解密、有没有遗漏的并发请求。有些应用会把关键请求放在独立线程或独立连接里代理只抓到了主流程。验证方法是比对客户端行为和代理记录比如客户端显示加载了三个模块代理只看到两个请求说明漏了一个。另外注意压缩和分块传输响应体可能是 gzip 或 chunked代理工具一般会自动处理但脚本解析时要留意。抓到完整流量后把请求按接口归类标注参数含义这份记录才是后续分析的基础。5. 避坑记录五条踩过的坑与处理方式5.1 证书装了但应用不认现象系统证书目录里能看到代理证书浏览器正常目标应用握手失败。原因应用使用了独立的信任存储或者只信任特定 CA不读系统目录。解决改用运行时 hook 替换 TrustManager或者把证书注入到应用的信任存储里。判断依据是看应用是否自带 CA 配置文件有的话优先改配置而不是硬 hook。5.2 hook 脚本执行了但校验没绕过现象脚本无报错日志显示方法被调用但请求依然失败。原因校验逻辑不止一处或者 hook 的是父类方法而实际调用的是子类重写版本。解决枚举所有 TrustManager 实现类逐个 hook同时监控checkServerTrusted的实际调用栈确认命中真正的实现。这个坑很常见尤其是用了第三方网络库的应用校验点可能藏在库的封装里。5.3 抓到的请求是加密的现象流量通了但请求体是一串密文。原因应用在应用层做了额外加密和 SSL 无关。解决这已经超出 SSL 绕过的范畴需要定位加密函数hook 其入参或返回值。判断方法是看密文长度和格式是否固定固定长度多半是对称加密带随机前缀可能是混合加密。别把应用层加密误当成 SSL 问题两者的处理路径完全不同。5.4 换设备后全部失效现象同一套流程在一台设备上通换一台就不行。原因系统版本、证书存储位置、hook 框架兼容性都可能不同。解决把环境差异列成清单逐项比对重点看 Android 版本对应的证书信任策略变化以及 hook 框架对目标进程架构的支持情况。我的习惯是每换一个环境先跑基线确认代理链路正常再动应用。5.5 测试行为影响了真实数据现象抓包过程中触发了业务侧的异常告警或数据变更。原因测试请求打到了生产接口且带了真实参数。解决测试前确认接口环境能用沙箱就用沙箱必须打生产时参数用无效值或测试账号避免产生真实业务影响。这条不是技术问题但翻车代价最大值得单独记一笔。6. 落到操作习惯一套可复用的排查顺序把上面的内容收成一套固定动作我每次遇到抓包失败都按这个顺序走基本不会乱。第一步永远是确认代理链路和基线用普通 HTTPS 请求验证环境排除工具和配置问题第二步看代理日志定位失败阶段是没连接、握手失败还是连接后断开分别对应不同的校验层级第三步按侵入性从低到高选手段系统证书、Java hook、native hook、证书提取每层用流量是否通作为唯一判据第四步验证流量完整性比对客户端行为和代理记录确认没有遗漏请求第五步记录每一步的现象和结论形成可复现的排查日志。这套顺序的价值在于把“玄学”变成可验证的步骤每一步都有明确的判断依据而不是靠试。回过头看最容易翻车的不是技术难点而是跳过基线直接上脚本结果在环境问题上耗掉大半时间。还有一个习惯值得坚持每次 hook 都加日志确认命中不靠“应该生效了”这种假设。移动端环境变化快同一套脚本换个版本就可能失效保留排查记录比保留脚本本身更有用。这份资源把上述流程和脚本整理在一起适合作为排查时的对照参考遇到具体场景时按层级往下走比从头摸索省事得多。希望帮到你。本文还有配套的精品资源点击获取
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/29 2:25:20
aixingpan.cn API开发文档:api_docs_onechart_marks_secondary2接口指南
2026/10/29 2:25:20
Vue + Cordova 混合应用原生能力接入与避坑
2026/10/29 2:20:20
红日靶场1打靶记录
2026/10/29 3:40:55
macOS安装PostgreSQL 18的pgvector扩展全攻略
2026/10/29 3:40:55
Nginx SSL证书替换与优化全指南
2026/10/29 3:40:55
impeccable:基于PROJECT.md的可执行契约与CI/CD自动化实践
2026/10/29 3:40:55
context-mode 编程范式:多环境适配与上下文管理实战
2026/10/29 3:40:54
容器技术核心原理与Docker实践指南
2026/10/29 3:35:54
RAGFlow v0.24.0企业级知识库架构升级与OceanBase集成实战
2026/10/29 0:00:09
服务器巡检报告模板怎么写:从检查项到PowerShell数据回填
2026/10/29 0:00:09
Zed编辑器Split Diff功能深度评测与优化指南
2026/10/29 0:00:09
OpenAI新模型定价解析:基础档便宜八成,快档贵六倍值不值?
2026/10/28 12:27:10
全国计算机二级C语言真题PDF高效刷题指南
2026/10/28 15:37:16
requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南
2026/10/28 12:37:46
递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现
2026/10/28 15:37:16
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/28 15:37:15
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/28 15:37:15
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)