安卓抓包完全指南(一):从入门到 SSL Pinning 绕过

安全研究必备技能 · 从基础概念到实战操作


📋 本文导读

✅ HTTPS、公钥、私钥、证书这些基础概念

✅ 三种方法将抓包证书安装到系统目录

✅ SSL Pinning 的工作原理详解

✅ 使用 Objection 和 Frida 绕过 SSL Pinning

🔐 前置概念学习

在学习抓包限制绕过之前,首先需要明白几个核心概念:HTTPS、公钥、私钥、签名、证书(CA)

HTTPS 是什么?

HTTPS = HTTP + 加密 + 认证 + 完整性保护

简单来说,HTTPS 就是在 HTTP 的基础上增加了三层保护:

  1. 数据加密 - 传输内容不会被窃取
  2. 身份认证 - 确认你连接的是真实的服务器
  3. 完整性保护 - 数据在传输中不会被篡改

公钥与私钥

公钥私钥用于非对称加密算法(如 RSA、SM4 等),特点是双向加解密

  • 公钥加密 → 私钥解密
  • 私钥加密(签名) → 公钥解密

💡 记住:公钥是公开的,任何人都可以获取。私钥只存放于后端,绝对不能泄露。

CA 证书

CA 证书是由权威证书颁发机构发布的数字证书,包含:

  • 电子签证机关的信息
  • 公钥用户信息
  • 公钥
  • 签名和有效期

签名是指:用 hash 散列函数计算明文信息的摘要,然后用 CA 的私钥进行加密,加密后的密文就是签名。

证书 = 公钥 + 签名 + 申请者和颁发者信息

客户端操作系统预置了 CA 的公钥,所以可以解密签名来验证证书的真实性。


📦 常规抓包实现原理

理解了上面的原理后,我们来看看常规抓包的思路:为什么使用 BurpSuite、Fiddler 等抓包工具时,只需要将工具的 CA 证书导入到系统信任列表中即可抓包?

抓包的本质就是中间人攻击(MITM)

  1. 客户端与抓包工具建立 SSL 连接
  2. 抓包工具与服务器建立 SSL 连接
  3. 抓包工具在中间解密并转发数据

⚠️ 这一切的前提是:客户端信任抓包工具的证书


📱 安卓导入抓包证书的三种方法

从 Android 7.0 开始,系统不再信任用户自己安装的证书,需要将证书安装到系统证书目录才能生效。

1 手工将证书移入系统目录

这是最原始但可靠的方法:

步骤 1:从 BurpSuite 导出证书

在 BurpSuite 中导出 certificate.der 格式的证书

步骤 2:转换为 PEM 格式并计算 hash

bash 复制代码
# 转换为 PEM 格式
openssl x509 -in certificate.der -inform DER -out certificate.pem -outform PEM

# 提取 hash
openssl x509 -inform PEM -subject_hash -in certificate.pem | head -1

假设输出的 hash 是 9a5ba575,那么重命名文件:

bash 复制代码
cat certificate.pem > 9a5ba575.0
openssl x509 -inform PEM -text -in certificate.pem -out /dev/null >> 9a5ba575.0

步骤 3:推送到手机并移动到系统目录

bash 复制代码
# 先推送到临时目录
adb push 9a5ba575.0 /data/local/tmp/

# 进入 adb shell 操作
adb shell
su
mount -o rw,remount /system
mv /data/local/tmp/9a5ba575.0 /system/etc/security/cacerts/
chmod 644 /system/etc/security/cacerts/9a5ba575.0

⚠️ 如果遇到只读文件系统错误:

bash 复制代码
# 方法一:重新挂载
mount -o rw,remount /system

# 方法二:如果是 AVB 2.0
adb root
adb disable-verity
adb reboot
# 重启后再次操作

最后:重启手机,查看证书是否安装成功。

2 先安装到用户证书,再手动移动

这是更简单的方法:

  1. 正常安装证书到用户目录(手机设置中安装)
  2. 使用 MT 管理器等文件管理器
  3. /data/misc/user/0/cacerts-added/ 下的证书文件
  4. 移动到 /system/etc/security/cacerts/
  5. 重启手机即可

3 使用 Magisk 模块 Move Certificates

这是最方便的方法,适合经常需要抓包的同学:

  1. 安装 Fox's Magisk 模块管理工具
  2. 下载 Move Certificates 模块的 zip 安装包
  3. 在 Magisk 中导入安装模块
  4. 手动安装抓包工具证书到用户证书
  5. 重启手机,模块会自动将用户证书移动到系统目录

✅ 推荐:这是最省心的方法,每次安装新证书后重启即可自动移动。


🛡️ SSL Pinning 原理及绕过

搞定了基础抓包后,你会发现很多 APP 还是抓不到包。这就是因为开启了SSL Pinning(证书锁定)

什么是 SSL Pinning?

SSL Pinning 顾名思义就是将服务器提供的 SSL/TLS 证书内置到 APP 客户端中,当客户端发起请求时,通过比对内置的证书和服务器端证书的内容,以确定这个连接的合法性。

简单说:APP 只信任自己内置的证书,不信任系统证书列表中的证书,所以抓包工具的证书就不被信任了。

两种锁定方式

方式 说明 特点
证书锁定 将服务器证书的哈希或公钥直接内置到 APP 中 简单直接,但证书更新需要发版
公钥锁定 只锁定证书中的公钥,比对公钥值 公钥不变的话证书续期不用改代码

SSL Pinning 的实现方式

1. 代码层实现(以 OkHttp 为例)

直接在代码中校验证书公钥:

2. 配置文件实现(network_security_config)

通过 res/xml/network_security_config.xml 配置 SSL Pinning:

  • 使用证书锁定:将证书哈希写入配置
  • 使用公钥锁定:提取公钥哈希写入配置

这种方式是目前最常见的实现方式。


🎯 实战:SSL Pinning 绕过演示

我们使用测试 APP 来演示 SSL Pinning 的效果和绕过过程:

测试 SSL Pinning 是否生效

打开测试 APP,点击相关按钮,使用 Charles 抓包:

可以看到提示:

Client closed the connection before a request was made. Possibly the SSL certificate was rejected

这说明 SSL Pinning 生效了,APP 拒绝了我们抓包工具的证书。

绕过方法一:使用 Objection 一键绕过

Objection 是基于 Frida 的强大工具,可以一键绕过 SSL Pinning。

命令:

bash 复制代码
# 启动 Objection 并注入目标 APP
objection -g com.actorn.netcapture explore

# 在 Objection 中执行
android sslpinning disable

执行后,再次点击 APP 中的按钮,就可以成功抓到 HTTPS 请求包了!

✅ 优点:简单快速,一键搞定。

❌ 缺点:可能有个别 APP 的自定义 SSL Pinning 无法被检测到。

绕过方法二:使用 Frida 自己写 Hook 脚本

如果 Objection 的通用脚本不起作用,就需要自己写针对性的 Frida 脚本。

绕过代码层检测公钥:

bash 复制代码
console.log("[*] Starting SSL Pinning bypass");
Java.perform(function () {
    var ss = Java.use("okhttp3.OkHttpClient$Builder");
    ss.proxy.implementation = function (x) {
        console.log("[+] Hooked proxy setting");
        return this.proxy(null);
    }
});

加载脚本并执行:

bash 复制代码
frida -U -f com.actorn.netcapture -l unpin.js --no-pause

绕过配置文件校验:

执行后,同样可以成功抓包:

绕过方法三:JustTrustMe / JustTrustMePlus

这是专门的 Xposed / LSPosed 模块:

  1. 在 LSPosed 中安装 JustTrustMe 模块
  2. 选择作用域为目标 APP
  3. 重启 APP 即可自动绕过

原理:Hook 了系统所有的 SSL 相关校验方法,让它们永远返回验证通过。


📝 本篇总结

核心要点

基础概念:理解 HTTPS、证书、公钥私钥是抓包的基础

证书安装:Android 7.0+ 需要安装到系统证书目录,推荐使用 Magisk 模块

SSL Pinning:是最常见的反抓包手段,将证书/公钥内置到 APP 中

绕过方法:Objection 一键绕过,或自定义 Frida 脚本,或使用 JustTrustMe 模块

📢 这只是抓包的入门篇。下一篇我们将继续讲解更复杂的抓包限制绕过:双向认证、NO_PROXY、VPN 检测等进阶技术!


🔗 推荐阅读

相关推荐
石山岭6 小时前
自己动手写了一个 Android 虚拟定位 App:GPSSimulate 技术实
android·前端
杉氧8 小时前
副作用 (Side Effects) 全攻略:如何像大师一样掌控 Composable 的生命周期?
android·架构·android jetpack
Kapaseker12 小时前
Kotlin Toolchain 0.11 发布:主要是把 Amper 干没了
android·kotlin
三少爷的鞋13 小时前
Android 现代架构不需要事件总线进阶篇
android
杉氧1 天前
深入理解 Compose 重组机制:快照系统如何驱动 UI 精准刷新?
android·架构·android jetpack
召钱熏1 天前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端
杉氧1 天前
深度解析:Jetpack Compose 核心架构与底层原理 —— 十年安卓老兵的“破茧重生”
android·架构·android jetpack
通玄1 天前
Jetpack Compose 入门系列(七):ViewModel 与界面状态管理
android
落魄Android在线炒饭1 天前
Android Framework 开发技巧:android.jar 生成与系统快速编译验证
android
如此风景1 天前
Kotlin Flow操作符学习
android·kotlin