抓包分析 Android 应用的网络流量

抓包分析 Android 应用的网络流量

📚 前置知识

本配方涉及以下核心技术,建议先阅读相关章节:

  • ADB 速查手册 - 设备连接与证书推送
  • HTTP/HTTPS 协议 - 理解请求响应结构与 TLS 握手

问题场景

  • 你遇到了什么问题?

  • 想知道某个 App 调用了哪些 API 接口

  • 需要分析 API 的请求参数和响应数据

  • 想查看 App 发送了哪些敏感信息(设备信息、定位等)

  • 需要找到加密签名的生成逻辑

  • 想重放或修改 API 请求

  • 本配方教你:配置抓包环境,拦截并分析 HTTPS 流量,绕过 SSL Pinning 限制。

  • 预计用时: 15-30 分钟(首次配置)


工具清单

必需工具

  • Android 设备/模拟器(已 Root,或可安装证书)
  • 抓包代理工具(选择其一):
    • Burp Suite(推荐,功能最强)
    • Charles(UI 友好)
    • mitmproxy(开源,可编程)
  • Frida(用于绕过 SSL Pinning)

可选工具

  • Wireshark(分析底层 TCP/UDP 流量)
  • HttpCanary(Android 上的抓包工具,无需 PC)

前置条件

确认清单

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 1. Verify device connection
adb devices

# 2. Frida 可用
frida-ps -U

# 3. PC and phone on the same Wi-Fi network
# Record PC IP address(used below as YOUR_PC_IP)
# Windows: ipconfig
# macOS/Linux: ifconfig or ip addr
  • Android 7.0+:需要 Root 权限安装系统证书
  • Android 6.0-:可直接安装用户证书,无需 Root
  • 或使用支持用户证书的 App(Target SDK < 24)

解决方案

第 1 步:配置抓包工具(5 分钟)

使用 Burp Suite(推荐)

1.1 启动 Burp Suite

1
2
3
4
5
# Download Burp Suite Community Edition (free)
# https://portswigger.net/burp/communitydownload

# Run the command
java -jar burpsuite_community.jar
  1. 打开 ProxyOptions
  2. Proxy Listeners 部分
  3. 点击 Add,配置:
  • Bind to port: 8888
  • Bind to address: All interfaces(或选择你的 Wi-Fi 网卡)
  1. 点击 OK 保存

Burp Proxy配置

验证:浏览器访问 http://YOUR_PC_IP:8888,应该看到 Burp 的错误页面(表示代理工作正常)

使用 Charles

1.1 启动 Charles

下载:https://www.charlesproxy.com/download/

1.2 配置代理

  1. ProxyProxy Settings
  2. 设置 Port 为 8888
  3. 勾选 Enable transparent HTTP proxying
使用 mitmproxy
1
2
3
4
5
6
7
8
9
# Install
pip install mitmproxy

# startup(监听 8888 端口)
mitmproxy -p 8888 --listen-host 0.0.0.0

# 或使用 Web 界面
mitmweb -p 8888 --listen-host 0.0.0.0
# 访问 http://127.0.0.1:8081 查看流量

第 2 步:配置手机代理(2 分钟)

2.1 连接到同一 Wi-Fi

确保手机和 PC 在同一局域网

2.2 设置手动代理

  1. 打开手机 设置Wi-Fi
  2. 长按当前连接的 Wi-Fi → 修改网络
  3. 展开 高级选项
  4. 代理设置改为 手动
    • 代理服务器主机名: YOUR_PC_IP(如 192.168.1.100
    • 代理服务器端口: 8888
  5. 保存

2.3 验证代理连接

1
2
# 手机浏览器访问任意 HTTP 网站(如 http://example.com)
# 此时 Burp/Charles 应该显示拦截到的请求

第 3 步:安装 HTTPS 证书(5-10 分钟)

为什么需要? HTTPS 流量经过加密,需要安装证书才能解密查看。

Burp Suite 证书安装

3.1 下载证书

  1. 手机浏览器访问 http://burp
  2. 点击 CA Certificate 下载 cacert.der

3.2 安装证书

  • Android 7.0+ (需要 Root)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 1. 转换证书格式
openssl x509 -inform DER -in cacert.der -out cacert.pem

# 2. 计算证书哈希
HASH=$(openssl x509 -inform PEM -subject_hash_old -in cacert.pem | head -1)

# 3. 重命名并推送到系统目录
cp cacert.pem $HASH.0
adb root
adb remount
adb push $HASH.0 /system/etc/security/cacerts/
adb shell chmod 644 /system/etc/security/cacerts/$HASH.0

# 4. 重启设备
adb reboot
Charles 证书安装
  1. 手机浏览器访问 http://chls.pro/ssl
  2. 下载并安装证书
  3. Android 7.0+ 同样需要安装到系统目录(参考 Burp 步骤)
mitmproxy 证书安装
  1. 手机浏览器访问 http://mitm.it
  2. 点击 Android 图标下载证书
  3. 安装步骤同上

第 4 步:开始抓包(1 分钟)

4.1 清空旧记录

  • Burp: Proxy → HTTP history → 右键 → Clear history
  • Charles: Proxy → Clear Session

4.2 启动目标 App

在手机上打开要分析的应用,正常使用。

4.3 查看流量

在抓包工具中:

  • 查看 HTTP history / Sequence
  • 筛选目标 App 的域名
  • 分析 Request/Response 内容

示例分析点

  • 请求 URL 和参数
  • Request Headers(User-Agent, Authorization, 自定义签名头)
  • Request Body(POST 数据)
  • Response Body(API 返回的 JSON/XML)

第 5 步:绕过 SSL Pinning(如遇到)

症状

  • 证书已安装,但 HTTPS 请求仍无法抓取
  • App 显示"网络错误"或直接闪退
  • 抓包工具显示 SSL 握手失败

原因:App 启用了 SSL Pinning(证书锁定),拒绝信任系统证书。

方法 1: 使用 Frida 通用脚本(推荐)

下载脚本 bypass_ssl_pinning.js

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// Universal android SSL Pinning Bypass
Java.perform(function () {
  console.log(" [SSL Pinning Bypass] 已启动");

  // 拦截 TrustManagerImpl (常用)
  try {
    var TrustManagerImpl = Java.use(
      "com.android.org.conscrypt.TrustManagerImpl"
    );
    TrustManagerImpl.verifyChain.implementation = function (
      untrustedChain,
      trustAnchorChain,
      host,
      clientAuth,
      ocspData,
      tlsSctData
    ) {
      console.log("✓ [TrustManagerImpl] BypassCertValidate: " + host);
type: posts
tags: ["RSA", "浏览器指纹", "签名验证", "Frida", "SSL Pinning", "代理池"]
      return untrustedChain;
    };
  } catch (e) {
    console.log("! TrustManagerImpl 不存在");
  }

  // Hook OkHttp3
  try {
    var CertificatePinner = Java.use("okhttp3.CertificatePinner");
    CertificatePinner.check.overload(
      "java.lang.String",
      "java.util.List"
    ).implementation = function (hostname, peerCertificates) {
      console.log("✓ [OkHttp3] Bypass SSL Pinning: " + hostname);
      return;
    };
  } catch (e) {
    console.log("! OkHttp3 不存在");
  }

  // Hook SSLContext
  try {
    var SSLContext = Java.use("javax.net.ssl.SSLContext");
    SSLContext.init.overload(
      "[Ljavax.net.ssl.KeyManager;",
      "[Ljavax.net.ssl.TrustManager;",
      "java.security.SecureRandom"
    ).implementation = function (keyManager, trustManager, secureRandom) {
      console.log("✓ [SSLContext] 使用自定义 TrustManager");
      this.init(keyManager, null, secureRandom);
    };
  } catch (e) {
    console.log("! SSLContext hook 失败");
  }

  console.log(" [SSL Pinning Bypass] 配置完成\n");
});
1
2
3
4
5
# 方式1:附加到运行中的 App
frida -U com.example.app -l bypass_ssl_pinning.js

# 方式2:启动 App 并注入
frida -U -f com.example.app -l bypass_ssl_pinning.js --no-pause
1
[SSL Pinning Bypass] 配置完成

方法 2: 使用 Xposed 模块

JustTrustMe 安装步骤
  1. 确保设备已安装 Xposed Framework
  2. 下载 JustTrustMe 模块:https://github.com/Fuzion24/JustTrustMe
  3. 在 Xposed Installer 中激活
  4. 重启设备

方法 3: 修改 APK(重打包)

APK 重打包步骤

如果 Frida 被检测,可以修改 APK 来信任用户证书:

  1. 反编译 APK
  2. 修改 AndroidManifest.xml,添加:
    1
    
    <application android:networkSecurityConfig="@xml/network_security_config">
  3. 创建 res/xml/network_security_config.xml
    1
    2
    3
    4
    5
    6
    7
    8
    
    <network-security-config>
        <base-config cleartextTrafficPermitted="true">
            <trust-anchors>
                <certificates src="system" />
                <certificates src="user" />
            </trust-anchors>
        </base-config>
    </network-security-config>
  4. 重新打包并签名 APK

工作原理

MITM(中间人攻击)流程

1
2
3
4
1. App 发起 HTTPS 请求
2. 代理解密请求(使用安装的证书)
3. 代理重新加密并转发到真实服务器
4. 服务器响应经过代理返回给 App

SSL Pinning 是什么?

App 内置了服务器证书的指纹(Hash),只信任特定证书:

1
2
3
CertificatePinner pinner = new CertificatePinner.Builder()
    .add("api.example.com", "sha256/AAAAAAAAAA...")
    .build();

常见问题

问题 1: 手机无法连接代理

症状:浏览器显示"无法连接到代理服务器"

检查

  1. PC 和手机是否在同一 Wi-Fi?
  2. PC 防火墙是否允许 8888 端口?
1
2
3
4
5
# Windows 防火墙规则(以管理员身份运行)
netsh advfirewall firewall add rule name="Burp Proxy" dir=in action=allow protocol=TCP localport=8888

# macOS
# 系统偏好设置 → 安全性与隐私 → 防火墙选项 → 允许 Java
1
2
3
# 检查端口
netstat -an | grep 8888 # macOS/Linux
netstat -an | findstr 8888 # Windows

问题 2: 证书无效

症状:浏览器显示证书无效

Android 7.0+ 限制

  • 默认只信任系统证书
  • 必须将证书安装到 /system/etc/security/cacerts/(需要 Root)

无 Root 设备的解决方案

  • 使用 Magisk + MagiskTrustUserCerts 模块
  • 或修改 APK(参考方法 3)

问题 3: Frida 脚本不生效

可能原因

  1. App 使用了自定义网络库 → 需要定位具体的类名和方法,定制 Hook 脚本

  2. Frida 被检测 → 使用重命名的 frida-server:

1
2
adb push frida-server /data/local/tmp/random_name
adb shell "/data/local/tmp/random_name &"

问题 4: 抓不到某些请求

可能原因

  1. 使用了 HTTP/2 或 QUIC → Burp Suite → Proxy → Options → HTTP/2 → 勾选"Enable HTTP/2"

  2. 直接使用 Socket 通信 → 需要使用 Wireshark 或 tcpdump 抓取原始 TCP 包

  3. 加密的自定义协议 → 需要逆向分析加密算法并解密


延伸阅读

相关配方

工具深入

案例分析

💡 思路一句话: 抓包的关键是「选对工具链」— HTTP 用 mitmproxy/Charles,HTTPS 需要证书信任处理(Android 7+ 需要 root 注入系统证书),非 HTTP 协议用 Wireshark + Frida hook socket。


快速参考

一键启动脚本

  • macOS/Linux:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash
# start_proxy.sh

# 获取本机 IP
IP=$(ifconfig | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}' | head -1)

echo "代理地址: $IP:8888"
echo "配置手机代理到: $IP:8888"
echo "证书下载: http://burp (Burp) 或 http://mitm.it (mitmproxy)"
echo ""

# 启动 mitmproxy
mitmweb -p 8888 --listen-host 0.0.0.0
  • Windows:
1
2
3
4
5
6
7
8
9
@echo off
REM start_proxy.bat

for /f "tokens=2 delims=:" %%a in ('ipconfig ^| findstr /c:"IPv4"') do set IP=%%a
echo 代理地址: %IP%:8888
echo 配置手机代理到: %IP%:8888
pause

java -jar burpsuite_community.jar

快速 SSL Pinning 绕过

1
2
3
4
5
# 下载通用 SSL Pinning 绕过脚本
curl -O https://codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass-with-frida/

# 运行
frida -U -f com.target.app -l universal-ssl-pinning.js --no-pause

相关内容

如果这篇文章对你有帮助,请我喝杯咖啡吧~
+5 支付宝支付宝
+5 微信微信