|
查看: 65|回复: 31
|
[相关教程]
SSLPinning绕过实战:从Frida到ssl_logger四种方法
[复制链接]
|

UID2
贡献9 点
钻石7 个
C币993 个
|
抓 App 的 HTTPS 请求是逆向的基本功。但现在的 App 基本都加了 SSL Pinning(证书绑定),常规抓包看不到内容。这篇讲怎么绕。
一、什么是 SSL Pinning
正常 HTTPS 连接时,客户端验证服务端证书是否被可信 CA 签名。SSL Pinning 在此基础上加了一层:客户端内置了服务端的证书或公钥,连接时验证服务端证书是否跟内置的匹配。如果你用 Charles/mitmproxy 做中间人代理,你的代理证书跟内置的不匹配,连接就失败了。
二、绕过方法
- 方法一:Frida 脚本(最通用)
用 Frida hook 证书验证函数,让它永远返回通过。这是最通用的方法,大部分 App 都能绕。
通用脚本(适用于 OkHttp):- Java.perform(function() {
- var CertificateFactory = Java.use("java.security.cert.CertificateFactory");
- var X509Certificate = Java.use("java.security.cert.X509Certificate");
- var OkHostnameVerifier = Java.use("okhttp3.internal.tls.OkHostnameVerifier");
- // 绕过证书验证
- var TrustManagerImpl = Java.use("com.android.org.conscrypt.TrustManagerImpl");
- TrustManagerImpl.checkTrustedRecursive.implementation = function() {
- console.log("Bypassed checkTrustedRecursive");
- return Java.use("java.util.ArrayList").$new();
- };
- // 绕过主机名验证
- OkHostnameVerifier.verify.overload('java.lang.String', 'javax.net.ssl.SSLSession').implementation = function() {
- console.log("Bypassed hostname verification");
- return true;
- };
- });
复制代码
- 方法二:objection(零代码)
objection 基于 Frida 封装了 SSL Pinning 绕过命令,一条指令搞定:- objection -g com.target.app explore
- # 进入交互模式后
- android sslpinning disable
复制代码 适合不想写脚本的人。但不是所有 App 都能绕,有些自定义实现的 Pinning objection 覆盖不到。
- 方法三:Xposed 模块
装 Xposed 框架 + JustTrustMe 或 SSLUnpinning 模块。全局绕过所有 App 的 SSL Pinning。不需要每个 App 单独处理。但需要 root 和 Xposed 框架。
- 方法四:改 APK(免 root)
用 apktool 反编译 APK,修改网络配置文件,把 user-ca 加入可信列表。然后回编译重签名。适合不想 root 手机的情况。
三、遇到自定义 Pinning 怎么办
有些大厂 App 不用 OkHttp,用自研网络库或 native 层实现 Pinning。Frida 通用脚本覆盖不到。
排查思路:
- 用 frida-trace 追踪 SSL 相关函数调用,找到验证逻辑在哪
- 如果是 Java 层:用 frida-trace 追踪 javax.net.ssl 包下的类
- 如果是 Native 层:在 IDA 里搜 SSLVerify、verify_cert、X509 等关键词,找到验证函数后用 Frida hook
- 用 ssl_logger 脚本打印明文流量,不需要绕 Pinning 就能看到请求内容
四、Frida ssl_logger 脚本(终极大招)
不绕 Pinning,直接在 SSL 读写函数层面抓明文:- // hook SSL_read 和 SSL_write
- var SSL_read = Module.findExportByName("libssl.so", "SSL_read");
- Interceptor.attach(SSL_read, {
- onLeave: function(retval) {
- if (retval.toInt32() > 0) {
- var buf = this.context.x1;
- var len = retval.toInt32();
- console.log("SSL_read: " + Memory.readUtf8String(buf, len));
- }
- }
- });
复制代码 这个方法在 OpenSSL/BoringSSL 层面抓数据,不管上层怎么验证都能看到明文。

SSL Pinning 绕过的核心:找到验证点在哪层(Java / Native),然后用对应工具 hook 掉。优先试 objection(零成本),不行再写 Frida 脚本,最后用 ssl_logger 在底层抓明文。 |
温馨提示:
1、在论坛里发表的文章仅代表作者本人的观点,与本网站立场无关。
2、论坛的所有内容都不保证其准确性,有效性,时间性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
3、当政府机关依照法定程序要求披露信息时,论坛均得免责。
4、若因线路及非本站所能控制范围的故障导致暂停服务期间造成的一切不便与损失,论坛不负任何责任。
5、注册会员通过任何手段和方法针对论坛进行破坏,我们有权对其行为作出处理。并保留进一步追究其责任的权利。
6、网络世界也请遵守我国的法律法规!一旦发现违法行为,将立即封存相关信息并报警处理!
|
|
|
|
|
|
|
|
|
|
发表于 2026-9-2 16:33:11
|
显示全部楼层
|
我用的另一条路线,效果差不多,但工具链更轻一些,回头整理下发出来。 |
|
|
|
|
|
|
|
|
|
|
发表于 2026-9-2 17:16:52
|
显示全部楼层
|
想请教一下,你用的这个版本是哪个?我这边跑起来报错。 |
|
|
|
|
|
|
|
|
|
|
发表于 2026-9-2 18:44:15
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|
发表于 2026-9-2 20:55:19
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|
发表于 2026-9-2 23:50:05
|
显示全部楼层
|
步骤写得很清楚,跟着走了一遍,卡在第二步的环境配置上,后来装了老版本才好。 |
|
|
|
|
|
|
|
|
|
|
发表于 2026-9-3 03:28:33
|
显示全部楼层
|
我这边环境是Mac,有些步骤要调整,回头补个差异说明。 |
|
|
|
|
|
|
|
|
|
|
发表于 2026-9-3 07:50:42
|
显示全部楼层
|
同求后续,想知道绕过之后怎么稳定保持,重签名这块一直搞不定。 |
|
|
|
|
|
|
|
|
|
|
发表于 2026-9-3 12:56:33
|
显示全部楼层
|
看完最大的感受是基础知识还是要扎实,不然工具报错都不知道怎么查。 |
|
|
|
|
|
|
|
|
|
|
发表于 2026-9-3 18:46:06
|
显示全部楼层
|
有个坑提醒,不同厂商ROM差异很大,通用性没有想象中那么强。 |
|
|
|
|
|
|
|
|
温馨提示:
1、在论坛里发表的文章仅代表作者本人的观点,与本网站立场无关。
2、论坛的所有内容都不保证其准确性,有效性,时间性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
3、当政府机关依照法定程序要求披露信息时,论坛均得免责。
4、若因线路及非本站所能控制范围的故障导致暂停服务期间造成的一切不便与损失,论坛不负任何责任。
5、注册会员通过任何手段和方法针对论坛进行破坏,我们有权对其行为作出处理。并保留进一步追究其责任的权利。
6、网络世界也请遵守我国的法律法规!一旦发现违法行为,将立即封存相关信息并报警处理!