咨询发布 发表于 2026-9-1 14:11:15

SSLPinning绕过实战:从Frida到ssl_logger四种方法

抓 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 层面抓数据,不管上层怎么验证都能看到明文。

https://www.metk.cn/img/posts/ssl_pinning.jpg

SSL Pinning 绕过的核心:找到验证点在哪层(Java / Native),然后用对应工具 hook 掉。优先试 objection(零成本),不行再写 Frida 脚本,最后用 ssl_logger 在底层抓明文。

浅夏笔记 发表于 2026-9-2 16:33:11

我用的另一条路线,效果差不多,但工具链更轻一些,回头整理下发出来。

山有木杂谈 发表于 2026-9-2 17:16:52

想请教一下,你用的这个版本是哪个?我这边跑起来报错。

青柠79 发表于 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
查看完整版本: SSLPinning绕过实战:从Frida到ssl_logger四种方法