一文讲懂模拟器抓包App
- 教程文章
- 2026-08-20
- 58热度
- 1评论
在模拟器上抓包 App,核心思路就两件事:让模拟器的网络流量经过电脑上的抓包工具,解决 HTTPS 证书信任问题。
原理:流量为什么能"转弯"
正常情况下,App 直接与服务器通信。抓包就是要在中间插一个"收费站":
App ──→ 抓包工具(Charles/Burp) ──→ 目标服务器
↑ 你在这里看全部流量
具体到 HTTPS:抓包工具会伪造一张证书(用它的根证书签发),App 如果信任了这张证书,流量就会被解密成明文供你分析。
┌──────────┐ HTTPS(证书B) ┌────────────┐ HTTPS(证书A) ┌──────────┐
│ 模拟器 │ ───────────────→ │ 抓包工具 │ ───────────────→ │ 服务器 │
│ 信任B │ ←─────────────── │ 信任A │ ←─────────────── │ │
└──────────┘ 明文在这里可见 └────────────┘ └──────────┘
所以整个流程 = 配置代理(流量转向)+ 安装证书(建立信任)。
⚙️ 准备:选对工具是成功的一半
模拟器推荐
| 模拟器 | 特点 | 备注 |
|---|---|---|
| MuMu 模拟器 | 支持 ROOT、可写系统盘 | ADB 调试端口默认 16384,官方文档详细 |
| 夜神 Nox | 支持 ROOT,Android 5.1 镜像方便 | 老版本系统规避高版本证书限制,操作简单 |
| Genymotion | 面向开发的虚拟机 | 基于 VirtualBox,适合自动化 |
建议使用 NAT 网络模式,代理设置会容易很多。抓包尽量用 Android 5.1 ~ 9 的镜像,证书和 SSL Pinning 的处理会省不少事。
抓包工具选择
| 工具 | 定位 | 适用场景 |
|---|---|---|
| Charles | 图形界面友好,功能强大 | 最主流的选择,新手友好 |
| Fiddler | Windows 经典抓包工具 | 配置思路与 Charles 类似 |
| Burp Suite | Web 安全测试的瑞士军刀 | 安全分析、渗透测试场景 |
| mitmproxy | 命令行工具 | 自动化脚本、批量处理 |
| HttpCanary | 运行在模拟器内的 App | 抓取特定应用流量,免电脑 |
📡 第一步:配置代理,让流量"转弯"
1. 开启抓包工具的代理端口
- Charles:
Proxy → Proxy Settings,默认端口 8888,勾选 Enable transparent HTTP proxying - Fiddler:
Tools → Options → Connections,默认端口 8888 - Burp Suite:
Proxy → Proxy Listeners,添加监听127.0.0.1:8080,勾选 Support invisible proxying
2. 获取宿主机 IP
在电脑命令行执行:
# Windows
ipconfig
# Mac / Linux
ifconfig
找到局域网 IP(如 192.168.1.100)。注意:在模拟器内部,10.0.2.2 固定指向宿主机(你的电脑),相当于"回环地址"。
3. 设置模拟器的 Wi-Fi 代理
设置 → 网络和互联网 → Wi-Fi → 长按当前 Wi-Fi → 修改网络 → 代理设为手动:
- 代理主机名:
10.0.2.2(或电脑局域网 IP) - 代理端口:
8888(或你工具的端口)
也可以直接用 ADB 命令行设置,脚本化更方便:
# 设置代理
adb shell settings put global http_proxy 10.0.2.2:8888
# 清除代理
adb shell settings put global http_proxy :0
🔐 第二步:安装证书,解锁 HTTPS
为什么必须装"系统证书"?
Android 7.0 以上,App 默认只信任系统证书,你在手机上"安装证书"装的用户证书对多数 App 无效。所以必须把抓包工具的根证书装进系统证书目录 /system/etc/security/cacerts/——这需要 ROOT 权限和可写系统盘。
通用操作流程
1. 从抓包工具导出证书
- Charles:
Help → SSL Proxying → Save Charles Root Certificate,保存为charles.pem - Fiddler:
Tools → Options → HTTPS→ 勾选 Decrypt HTTPS traffic →Actions → Export Root Certificate to Desktop - Burp:
Proxy → Proxy Settings → Import/Export CA certificate
2. 转换格式并计算哈希重命名
Android 系统证书的文件名是证书主题的 哈希值 + .0:
# 计算证书哈希(以 Charles 为例)
openssl x509 -inform PEM -subject_hash_old -in charles.pem -noout
# 输出形如:d0c556f7
# 重命名证书文件
mv charles.pem d0c556f7.0
3. 通过 ADB 推送到系统证书目录
adb root # 获取 root 权限(模拟器需开启 ROOT)
adb remount # 使系统分区可写(或开启"可写系统盘")
adb push d0c556f7.0 /system/etc/security/cacerts/
adb shell chmod 644 /system/etc/security/cacerts/d0c556f7.0
adb reboot # 重启模拟器让证书生效
夜神小技巧:使用 Android 5.1 镜像,证书校验宽松,直接把证书装为用户证书即可生效,省去系统证书步骤。
MuMu 注意:连接 MuMu 时 ADB 端口是
16384,命令形如adb connect 127.0.0.1:16384。
🚀 进阶技巧:搞定难缠的 App
如果以上步骤完成,某些 App 仍然抓不到包,按下面策略逐个击破:
1. Flutter 应用不走系统代理
Flutter 默认不遵循系统代理设置。需要在 Flutter 代码里手动配置代理,并加回调信任抓包证书:
// Dio 示例
final dio = Dio(
BaseOptions(
baseUrl: 'https://api.example.com',
),
);
(dio.httpClientAdapter as IOHttpClientAdapter).createHttpClient = () {
final client = HttpClient()
..findProxy = (uri) => 'PROXY 10.0.2.2:8888';
client.badCertificateCallback = (cert, host, port) => true; // 信任所有证书
return client;
};
2. 绕过 App 的代理检测
部分 App 会检测系统代理,发现开了代理就拒绝联网。方案:关掉模拟器内的代理,改用 PC 端流量转发工具(如 Proxifier),把模拟器进程(如 Nox.exe、MuMuPlayer.exe)的流量强制转发到 Burp/Charles 的监听端口。
3. SSL Pinning(证书固定)怎么办
App 在代码里写死了服务器证书指纹,任何假证书都会被拒。两条路:
- Xposed 框架:安装 Xposed + JustTrustMe 模块,从应用层 Hook 掉证书校验逻辑,强制信任抓包证书
- Frida:用
frida-server+ 脚本注入绕过SSL_pinning,适合原生 App 且无需重启
4. 端口设置
在抓包工具的 SSL 代理设置中,确保监听 443(HTTPS 默认端口),或直接配置 * 通配所有端口,避免 App 走非标端口时漏抓。
🔍 常见问题排查
| 现象 | 可能原因 | 解决 |
|---|---|---|
| 模拟器断网 | 代理地址/端口填错 | 确认宿主机 IP 与工具端口,10.0.2.2 仅在模拟器内部有效 |
| 抓到 CONNECT 但无明文 | 证书未生效 | 检查证书是否在系统目录、权限 644、已重启 |
| App 提示证书错误 | 证书未被信任 | 确认 App 信任系统证书,或走 Xposed/Proxifier 方案 |
| 部分流量缺失 | App 不走系统代理 | Flutter 手动配代理 / Proxifier 强制转发 |
| 高版本 Android 装不上 | 用户证书不被信任 | 使用 Android 5.1~9 镜像,或 ROOT 后装系统证书 |
⚠️ 合规提醒
抓包本质上是对流量进行中间人解密,请务必只在授权的范围内使用:自己的 App、已授权的渗透测试项目、CTF 或靶场环境。对未授权目标抓包可能触犯法律,且抓取的数据可能涉及他人隐私,请注意保护。
模拟器提供了一个高度可控的"沙盒",虽然配置过程略显繁琐,但配置一次即可长期复用。按部就班完成这几步,你就能拿下大多数 App 的接口数据了。

厉害厉害