一文讲懂模拟器抓包App

在模拟器上抓包 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 的接口数据了。