Android 终极抓包指南:X + Charles 强强联合

220 阅读5分钟

前言:为什么需要这套方案?

在 Android 开发和调试过程中,抓包是不可或缺的一环。传统的做法是设置 Wi‑Fi 代理,将流量指向 PC 上的 Charles。这种方法简单快捷,但有一个致命弱点:它属于应用层代理。任何有意识的 App 都可以通过代码(如 Proxy.NO_PROXY)轻松绕过系统代理,导致抓包失败。

为了解决这个问题,我们需要一种更底层的抓包方式——基于 VPN 的传输层代理。

本指南将详细介绍如何利用一款支持本地 VPN 隧道的代理 App(Android 版),在手机端建立一个本地 VPN,将设备上所有的网络流量(包括那些试图绕过系统代理的 App)强制转发到电脑上的 Charles,从而实现全面、无死角的抓包。

准备工作

  1. 一台电脑:安装并正常运行 Charles。
  2. 一台 Android 设备:手机或模拟器(如 MuMu),已安装“代理 App(Android 版)”。
  3. 网络环境:确保电脑和 Android 设备连接在同一个局域网(同一个 Wi‑Fi)下。

流程概览

  1. 正确配置 Charles:确保 Charles 能同时处理 HTTP 和多端口的 HTTPS 流量。
  2. 获取电脑 IP:找到 Charles 所在电脑的局域网 IP 地址。
  3. 编写代理 App 配置文件:创建一个 YAML 文件,指示将所有流量转发到 Charles。
  4. 导入并启动代理 App:在 Android 设备上运行该 App 并激活 VPN。
  5. 安装 Charles 证书:在 Android 设备上安装证书以解密 HTTPS 流量。

第一步:Charles 的正确配置(至关重要)

错误的 Charles 配置是排查过程中最常见的问题。请务必确认以下两项设置。

1. 代理设置(Proxy Settings)

此设置确保 Charles 的 8888 端口能正确接收 HTTP 和 HTTPS 流量。

  • 进入菜单栏 Proxy -> Proxy Settings...
  • Proxies 标签页下,确认:
    • HTTP Proxy 端口为 8888
    • 取消勾选 Enable transparent HTTP proxying

原因:如果勾选此项,Charles 会错误地将所有到达 8888 端口的流量都当作 HTTPS 来处理,导致正常的 HTTP 请求失败并显示 SSL: Unsupported or unrecognized SSL message

2. SSL 代理设置(SSL Proxying Settings)

此设置告诉 Charles 需要对哪些地址和端口的流量进行 SSL 解密。

  • 进入菜单栏 Proxy -> SSL Proxying Settings...
  • 确保 Enable SSL Proxying 已勾选。
  • Include 列表中,不要使用 *:*,这会引起冲突。推荐使用以下“白名单”组合,覆盖绝大多数 HTTPS 端口:
    • *:443(标准 HTTPS 端口)
    • *:8443(常见的后台服务 HTTPS 端口)
    • 如有需要,可继续添加其他非标准端口,如 *:8080, *:9443 等。

原因:使用 *:* 会让 Charles 尝试解密发往自身 8888 端口的纯 HTTP 流量,导致与第一点同样的问题。只包含明确的 HTTPS 端口可以完美规避此冲突。

第二步:获取电脑 IP 地址

Android 设备需要知道将流量转发到哪里。

  • Windows:打开命令提示符(CMD),输入 ipconfig,查找“无线局域网适配器 WLAN”下的“IPv4 地址”。
  • macOS:打开“终端”,输入 ifconfig | grep "inet ",查找 en0en1 网卡下的 IP 地址。

记下这个 IP,例如 192.168.0.0

第三步:编写配置文件

这是整个流程的核心。创建一个名为 charles-proxy.yaml 的文本文件,并将以下内容粘贴进去。

# 示例配置文件(将所有流量转发到电脑的 Charles 进行抓包)

# 混合代理端口(HTTP 和 SOCKS5),保持默认即可
mixed-port: 7890
allow-lan: true
mode: rule
log-level: info

# DNS 设置,防止 DNS 污染
dns:
  enable: true
  nameserver:
    - 223.5.5.5
    - 119.29.29.29

# 1. 定义你的上游代理(电脑上的 Charles)
proxies:
  - name: "Charles-PC"
    type: http
    # !! 将这里的 IP 地址替换为你自己的电脑 IP !!
    server: 192.168.0.0
    port: 8888

# 2. 定义代理组
proxy-groups:
  - name: "抓包代理"
    type: select
    proxies:
      - "Charles-PC"

# 3. 定义规则(最关键的部分)
rules:
  # 匹配所有流量(MATCH),并将其发送到“抓包代理”组
  - MATCH,抓包代理

请务必将 server 字段的值修改为你在第二步中获取的电脑 IP 地址。

第四步:在 Android 设备上导入并启动

导入配置

由于模拟器或部分 Android 系统存在文件读写权限问题,直接“从文件导入”可能会失败。推荐使用 URL 导入。

  1. 上传配置:将上述 charles-proxy.yaml 的内容完整复制,粘贴到 gist.github.com 并创建一个公开的 Gist。
  2. 获取 Raw 链接:在 Gist 页面,右键点击 Raw 按钮,选择“复制链接地址”。
  3. 在代理 App 中导入:
    • 打开应用,进入“配置”或“Profiles”页面。
    • 点击“+”->“从 URL 导入”。
    • 粘贴你复制的 Raw 链接,并为配置命名,然后保存。

启动 VPN

  1. 在配置列表中,选中你刚刚导入的配置,使其生效。
  2. 返回应用首页,开启开关;在弹出的 VPN 连接请求中选择“允许”。
  3. 开关变为“运行中”,且系统状态栏出现钥匙图标,表示应用已成功接管设备网络。

此时,Charles 应该已经能看到来自 Android 设备的流量了。

第五步:安装 Charles 证书(解密 HTTPS)

最后一步,让 Charles 能够解密 HTTPS 流量。

  1. 确保代理 App 的 VPN 正在运行。
  2. 在 Android 设备上打开任意浏览器。
  3. 访问地址:chls.pro/ssl
  4. 浏览器会提示下载一个证书文件(.pem 格式)。
  5. 下载后,根据系统提示安装该证书。通常需要进入“设置”->“安全”->“加密与凭据”->“从存储设备安装”,选择“CA 证书”进行安装。系统可能会要求你为证书命名并设置锁屏密码。

安装成功后,回到 Charles,你就可以看到清晰、解密后的 HTTPS 请求了。

至此,你已搭建起一套功能完备且强大的 Android 抓包环境。祝你调试愉快!