抓包工具相关

8 minute read

抓包工具 Charles/Fiddler/mitmproxy 完整系统学习大纲

本文面向测试工程师。抓包是测试人员最实用的”显微镜”:接口报错时确认是前端传参错了还是后端返回错了、Mock 造服务端还没准备好的数据、弱网下验证 App 表现、篡改参数做边界与安全测试——这些场景都离不开抓包。 文中以 Charles(跨平台、主力推荐)为主,Fiddler(Windows 常用)、mitmproxy(命令行/自动化)、Wireshark(网络层)为辅。

一、抓包概述

1.1 什么是抓包?

  • 定义:抓包(Packet Capture)指在客户端与服务器之间截获、查看、分析网络数据包的过程。
  • 本质:抓包工具充当”中间人”(Man-in-the-Middle),所有流量经过它,因此可以看到明文内容。
  • 分层:
    • 应用层抓包(Charles/Fiddler/Postman 代理):看 HTTP/HTTPS 请求响应全文,测试最常用。
    • 网络层抓包(Wireshark/tcpdump):看 TCP/UDP/IP 报文,排查连接、重传、握手等问题。

1.2 抓包能做什么?

用途 说明
定位前后端 Bug 看请求参数对不对、响应数据对不对,快速判定责任方
Mock 数据 服务端没开发完 / 造不出异常数据时,本地伪造响应
弱网测试 限速、加延迟、丢包,验证 App 在网络差时的表现
篡改请求/响应 构造异常、边界值、超长字段,测试客户端容错
安全测试 检查明文传输、敏感信息泄露、篡改参数越权
接口逆向/竞品分析 抓取 App 接口,理解业务逻辑
生成测试用例 抓到的请求可直接导出为 cURL / HAR,转成自动化用例

1.3 工具对比

工具 平台 免费 特点 适用场景
Charles Win/macOS/Linux 收费(试用 30 分钟) 界面清晰、功能全面、跨平台 主力推荐,日常接口抓包
Fiddler Classic Windows ✅ 免费 功能强、可扩展脚本(.NET) Windows 用户首选
Fiddler Everywhere 跨平台 收费(有限免费) 新版,UI 现代化 跨平台统一体验
mitmproxy 跨平台 ✅ 开源免费 命令行 + Python 插件,可脚本化 自动化测试/持续集成
Wireshark 跨平台 ✅ 开源免费 网络层抓包,协议支持最全 底层网络问题排查
Burp Suite 跨平台 社区版免费 安全测试专业工具 渗透/安全测试
Chrome DevTools 浏览器内置 ✅ 免安装,看 Network 面板 前端快速调试

💡 学习建议:先精通 Charles,掌握原理后其他工具一通百通。需要脚本化/自动化时再学 mitmproxy。

二、抓包原理

2.1 HTTP 抓包原理(代理模式)

正常流程:
  浏览器/App  ─────────────────────────▶  真实服务器

开启代理后:
  浏览器/App  ──▶  Charles(代理 8888)  ──▶  真实服务器
                       │
                       └─ 可查看/修改/拦截明文内容
  1. 客户端把代理设置为 Charles 的地址和端口(默认 127.0.0.1:8888)。
  2. 客户端的所有 HTTP 请求先发到 Charles。
  3. Charles 转发给真实服务器,拿到响应后再返回给客户端。
  4. HTTP 是明文,Charles 可直接读取全部内容。

2.2 HTTPS 抓包原理(中间人 + 证书信任)

HTTPS 是加密的,要解密必须让客户端”信任”Charles 伪造的证书:

① 客户端发起 HTTPS 请求(经 Charles 代理)
② Charles 用自己的根证书,现场签发一张"目标网站的假证书"返回给客户端
③ 因为客户端提前安装并信任了 Charles 根证书 → 信任这张假证书 → 握手成功
④ 同时 Charles 以客户端身份,与真实服务器建立正常的 HTTPS 连接
⑤ 结果:客户端↔Charles、Charles↔服务器 两段都是加密的
        但 Charles 在中间,可以解密看到明文

因此 HTTPS 抓包必须完成两步:

  1. 客户端安装并信任 Charles 根证书。
  2. Charles 开启 SSL Proxying(对指定域名启用 HTTPS 解析)。

⚠️ 安全提示:抓包工具能解密 HTTPS,本质是”合法的中间人”。只在你有权限的测试环境/自己的设备上使用;安装的根证书用完建议从信任列表移除,避免长期留在系统里。

2.3 抓不到包的常见原因

现象 原因 思路
全是 unknown / CONNECT 未开启 SSL Proxying Charles 中对该域名 Enable SSL Proxying
证书不受信任告警 根证书未安装或未信任 重装并信任证书(手机需在”信任的凭据”中确认)
App 直接断网/报错 SSL Pinning(证书绑定) App 内置了服务端证书指纹,不信任 Charles 证书
Android 7+ 抓不到 系统默认不信任用户 CA 需装为系统证书(root)或用测试包配置
部分请求抓不到 App 走了 socket/非系统代理 需 VPN 模式或透明代理(如 Postern、ProxyDroid)
浏览器能抓 App 不能抓 App 未走系统代理 检查 App 是否设置了独立代理

三、Charles 详解(主力工具)

3.1 安装与基本配置

  1. 下载:Charles 官网
  2. 安装后启动,Charles 会自动把系统代理设为 127.0.0.1:8888。
  3. 查看/修改代理端口:Proxy → Proxy Settings → HTTP Proxy → Port(默认 8888)。
Charles 界面布局:
┌───────────────┬──────────────────────────────────┐
│ Structure     │  Overview / Request / Response /  │
│ (按域名分组)  │  Summary / Chart / Notes          │
│ Sequence      │                                  │
│ (按时间排序)  │  右侧为选中请求的详情面板            │
└───────────────┴──────────────────────────────────┘
  • Structure 视图:按域名树形分组,适合看某个系统的所有接口。
  • Sequence 视图:按请求时间排序,适合看完整调用顺序(排查时序问题用它)。

3.2 证书安装(HTTPS 抓包前提)

Windows / macOS(抓电脑流量):

Help → SSL Proxying → Install Charles Root Certificate
→ 安装到"受信任的根证书颁发机构"(关键!)

移动端(抓手机流量):

  1. 手机与电脑连同一 WiFi。
  2. 手机 WiFi 设置 → 代理 → 手动 → 主机名填电脑 IP(如 192.168.1.5),端口 8888。
  3. 手机浏览器访问 chls.pro/ssl 下载证书并安装。
  4. 首次连接时 Charles 弹出授权窗口,点 Allow。
  5. Charles 开启:Proxy → SSL Proxying Settings → Enable SSL Proxying,添加域名(或填 * 抓全部)。
SSL Proxying Settings 配置:
☑ Enable SSL Proxying
  Include → Add
    Host: *        (抓全部)
    Port: 443
  或只加需要的:api.example.com

💡 建议只添加需要抓的域名,避免抓取系统/其他 App 的无关流量,干扰分析。

3.3 Charles 核心功能

3.3.1 Filter 过滤(最常用)

Proxy → Recording Settings → Include/Exclude
或直接在界面左下角 Filter 框输入关键字(如 api.example.com)

支持通配符 *、支持按 URL/状态码/方法过滤,是抓包效率的关键。

3.3.2 Breakpoints 断点(改请求/响应)

右键某请求 → Breakpoints
下次该请求发出时会被拦截,可修改:
  - Request:改 URL、Header、Body(构造异常参数)
  - Response:改返回数据(模拟各种服务端返回)
修改后点 Execute 放行

💡 测试场景:构造”余额不足”“库存为 0”“超长昵称”“特殊字符”等服务端难以造出的数据。

3.3.3 Map Local(本地文件替换响应)

Tools → Map Local → Enable Map Local → Add
   Map From: https://api.example.com/user/info
   Map To:   本地 user_info.json 文件
  • 把某个接口的响应永久替换成本地 JSON 文件内容。
  • 适合:后端接口未开发完成、需要稳定复现某类数据、UI 联调。

3.3.4 Map Remote(转发到另一台服务器)

Tools → Map Remote → Add
   Map From: https://api.example.com/
   Map To:   http://192.168.1.100:8080/
  • 把线上请求转发到测试/预发环境,常用于复现线上问题到本地环境。

3.3.5 Rewrite(批量改写)

Tools → Rewrite → Enable Rewrite → Add Rules
   可批量修改:Header、Host、URL、Body、Query 参数、响应状态码
   支持正则匹配

比断点更强大:可批量、自动改写,适合统一加请求头、替换环境标识、模拟全站错误码。

3.3.6 Throttle 弱网模拟

Proxy → Throttle Settings → Enable Throttling
   可设置:带宽(bandwidth)、延迟(latency)、丢包率(reliability)
   可对指定 Host 生效(只限制目标域名,不影响其他流量)

弱网参数参考表:

场景 带宽 延迟 丢包率 说明
正常网络 不限 0 0% 基线
良好 4G 4 Mbps 50 ms 0% 一般移动网络
一般 3G 384 kbps 200 ms 1% 中等
较差 2G 50 kbps 500 ms 5% 弱网
极差/断网边缘 20 kbps 2000 ms 10% 极限场景

💡 弱网测试重点观察:Loading 是否卡死、是否有超时提示、重试机制、数据是否重复提交、图片是否加载失败、有无崩溃。

3.3.7 其他实用功能

功能 入口 用途
Repeat / Repeat Advanced 右键请求 重发请求(Advanced 可设置次数+并发,简易压测)
Compose 右键 → Compose 修改后重新构造并发起请求
Copy as cURL 右键 → Copy cURL Request 导出为 curl 命令,可直接贴进终端/Postman
Export HAR File → Export → HAR 导出完整会话,可导入 Postman/JMeter
Focus / Ignore Hosts 右键请求 → Focus 聚焦只看关注的域名
Find in Session Ctrl+F 全文搜索请求/响应内容(找某个字段)

四、Fiddler 详解

4.1 版本选择

版本 平台 授权 说明
Fiddler Classic Windows 免费 老牌经典版,功能最全,插件生态好
Fiddler Everywhere Win/macOS/Linux 收费(有免费额度) 新版,跨平台,UI 现代化

4.2 基本配置

Tools → Options
  Connections 页签:
    ☑ Allow remote computers to connect   (允许手机连接,抓移动端必开)
    Fiddler listens on port: 8888          (默认端口)
  HTTPS 页签:
    ☑ Capture HTTPS CONNECTs
    ☑ Decrypt HTTPS traffic                (解密 HTTPS)
    → Actions → Trust Root Certificate     (安装并信任根证书)

4.3 核心功能对照(Charles ↔ Fiddler)

功能 Charles Fiddler
断点拦截 Breakpoints Rules → Automatic Breakpoints(或命令行 bpu 关键词)
本地文件替换响应 Map Local AutoResponder(拖拽即可,非常好用)
转发到其他服务器 Map Remote AutoResponder → 填 http://host:port
批量改写 Rewrite Fiddler Script(CustomRules.js)
弱网 Throttle Settings Rules → Performance → Simulate Modem Speeds
重发请求 Repeat Replay(选中请求按 R)
构造请求 Compose Composer
过滤 Filter Filters 页签(按 Host/进程/状态码过滤)

Fiddler 快捷命令行(界面底部黑色输入框):

bpu /api/login      请求前断点(含该关键字的 URL)
bpafter /api/login  响应后断点
bps 404             响应状态码为 404 时断点
bpu                 清除断点
cls                 清空会话列表
select json         选中所有 Content-Type 为 json 的会话
?keyword            高亮包含关键字的会话

4.4 AutoResponder 使用(Mock 神器)

1. 勾中某条会话 → 拖到右侧 AutoResponder 面板
2. ☑ Enable rules  ☑ Unmatched requests passthrough(不匹配的请求正常放行)
3. 右键该规则 → Edit Response / Choose Response File 选择本地 JSON
4. 可设置 rule:精确匹配 / 正则匹配(regex:)/ 状态码(如 404、500)

💡 比 Charles Map Local 更直观:支持直接拖放、支持正则、支持一次性返回指定状态码(如 500、超时)。

4.5 Fiddler Script(进阶)

Rules → Customize Rules(打开 CustomRules.js),用 C# 脚本批量改写:

// 在 OnBeforeRequest 中给所有请求加一个测试标记头
static function OnBeforeRequest(oSession: Session) {
    if (oSession.HostnameIs("api.example.com")) {
        oSession.oRequest["X-Test-Flag"] = "true";

        // 模拟接口延迟 2 秒
        // oSession["request-trickle-delay"] = "2000";
    }
}

五、mitmproxy(命令行 / 自动化)

5.1 安装与三种模式

pip install mitmproxy
mitmproxy --version
命令 形态 用途
mitmproxy 交互式 TUI(终端界面) 手动查看,无 GUI 环境
mitmdump 纯命令行(类似 tcpdump) 脚本化、自动化、CI
mitmweb Web 界面(浏览器打开) 类 Charles 的图形界面
# 启动(默认监听 8080)
mitmproxy -p 8888
mitmweb -p 8888

# 透明代理模式(无需客户端配代理)
mitmproxy --mode transparent

# 保存所有流量到文件
mitmdump -w traffic.flow

# 回放 / 读取
mitmdump -r traffic.flow

证书安装:启动后手机/浏览器访问 mitm.it 下载对应平台证书。

5.2 Python 脚本(自动化测试核心能力)

# mock_addon.py
from mitmproxy import http

def request(flow: http.HTTPFlow) -> None:
    """请求发出前:可修改请求"""
    if "/api/user/info" in flow.request.pretty_url:
        flow.request.headers["X-Test-Token"] = "mock-token"

def response(flow: http.HTTPFlow) -> None:
    """收到响应后:可替换响应内容"""
    if "/api/user/info" in flow.request.pretty_url:
        flow.response.set_text(
            '{"code": 0, "data": {"name": "MockUser", "vip": true}}'
        )
        flow.response.headers["Content-Type"] = "application/json"
# 加载插件运行
mitmdump -p 8888 -s mock_addon.py

# 过滤只处理指定域名(注意引号,Windows 用双引号)
mitmdump -p 8888 -s mock_addon.py --set confdir=~/.mitmproxy "~d api.example.com"

更多实用脚本片段:

from mitmproxy import http

def response(flow: http.HTTPFlow) -> None:
    # 1. 统一注入错误码(模拟服务端故障)
    if "/api/" in flow.request.pretty_url:
        flow.response.status_code = 500

    # 2. 模拟接口延迟
    # import time; time.sleep(3)

    # 3. 拦截并记录特定请求用于断言
    if "/api/order/create" in flow.request.pretty_url:
        with open("order_requests.log", "a", encoding="utf-8") as f:
            f.write(flow.request.text + "\n")

💡 测试价值:mitmproxy 可以写进自动化测试框架 —— 启动代理、加载 mock 脚本、运行 UI 自动化、断言请求内容、关闭代理。这是 Charles 图形界面做不到的事。

六、Wireshark(网络层抓包)

6.1 与 Charles/Fiddler 的区别

维度 Charles / Fiddler Wireshark
层级 应用层(HTTP/HTTPS) 网络层/传输层(TCP/UDP/IP)
内容 请求响应全文(已解密) 原始报文(HTTPS 内容加密看不到)
用途 看接口数据、Mock、改包 排查连接、握手、重传、延迟
门槛 低 较高

6.2 常用过滤表达式

# 按 IP/主机
ip.addr == 192.168.1.100
ip.src == 10.0.0.1 && ip.dst == 10.0.0.2

# 按端口/协议
tcp.port == 8080
http
dns
tls

# 按请求特征(HTTP 明文时)
http.request.method == "POST"
http.request.uri contains "/api/login"
http.response.code == 500

# 排查 TCP 问题(重传、握手、连接重置)
tcp.analysis.retransmission     # 重传(网络质量差/丢包)
tcp.analysis.flags              # 异常标志
tcp.flags.reset == 1            # 连接被重置(RST)
tcp.flags.syn == 1 && tcp.flags.ack == 0   # SYN(握手发起)
# 服务器端命令行抓包(tcpdump)
tcpdump -i any -w capture.pcap host 192.168.1.100 and port 8080
tcpdump -i any -nn -A 'tcp port 8080'      # 直接打印明文内容
# 下载 capture.pcap 后用 Wireshark 分析

💡 测试场景:接口偶发超时、客户端报”连接被重置”、性能压测时连接上不去——这类问题应用层抓包看不出来,需要 Wireshark 看 TCP 握手和重传。

七、移动端抓包实战

7.1 Android 抓包

步骤:
1. 手机与电脑连同一 WiFi
2. 电脑查 IP:ipconfig(Windows)/ ifconfig(mac/Linux)
3. 手机:设置 → WLAN → 长按当前 WiFi → 修改网络 → 显示高级选项
       → 代理:手动
       → 主机名:电脑 IP
       → 端口:8888
4. 手机浏览器访问 chls.pro/ssl 下载证书
5. 安装:设置 → 安全 → 从存储设备安装 → 选择证书(需设置锁屏密码)
6. Charles 点 Allow 授权

Android 7.0+ 的限制(重点坑):

  • Android 7 起,App 默认只信任系统级 CA,用户安装的证书不生效(浏览器不受影响)。
  • 解决办法(测试环境):
    1. 使用 debug 包:让开发在 res/xml/network_security_config.xml 中配置信任用户 CA:

      <network-security-config>
          <debug-overrides>
              <trust-anchors>
                  <certificates src="system" />
                  <certificates src="user" />   <!-- 关键:信任用户证书 -->
              </trust-anchors>
          </debug-overrides>
      </network-security-config>
      
    2. 装为系统证书(需 root / 模拟器):把证书 push 到 /system/etc/security/cacerts/。
    3. 用 Android 模拟器(如夜神、MuMu、AVD):模拟器一般可直接信任用户证书。

7.2 iOS 抓包

1. 设置 → 无线局域网 → 当前 WiFi → 配置代理 → 手动 → 填电脑 IP + 8888
2. Safari 访问 chls.pro/ssl → 下载描述文件
3. 设置 → 通用 → VPN与设备管理 → 安装描述文件
4. 设置 → 通用 → 关于本机 → 证书信任设置 → 开启"完全信任"(关键!第 4 步最容易漏)

⚠️ iOS 必须在”证书信任设置”中手动开启开关,只安装描述文件是不够的。

7.3 SSL Pinning(证书绑定)

部分 App(金融、支付类)内置了服务端证书指纹,会校验当前证书是否匹配,不匹配就直接拒绝连接,导致抓不到包。

测试环境下的合规处理方式:

  1. 优先找开发要 debug 包(关闭 Pinning 或配置信任用户 CA)—— 最正当的途径。
  2. 使用测试环境/测试包自带的抓包开关。
  3. 逆向手段(Frida、Objection、Xposed 模块)仅可在自己有明确授权的应用上、在测试环境中使用,涉及合规风险,生产应用请勿尝试。

7.4 抓不到包排查清单

检查项 操作
手机和电脑同一网段? 手机 ping 电脑 IP
Charles/Fiddler 允许远程连接? Fiddler 需勾 Allow remote computers to connect
防火墙放行端口? Windows 防火墙可能拦截 8888,临时关闭测试
证书装了但没信任? iOS 看”证书信任设置”;Android 看”信任的凭据”
SSL Proxying 开启? Charles 需 Enable SSL Proxying 并加域名
App 不走系统代理? 尝试 VPN 模式(Postern / Drony / ProxyDroid)
App 有 SSL Pinning? 换 debug 包

八、测试场景实战(重点)

8.1 定位前后端 Bug(最高频)

判定口诀:

抓到的现象 责任方
请求没发出去 前端 Bug(事件没绑定、校验拦截)
请求发了但参数错误/缺失 前端 Bug(传参问题)
请求参数正确,响应数据错误 后端 Bug
响应数据正确,页面显示错误 前端 Bug(渲染问题)
响应 5xx 后端 Bug
响应 4xx 看情况:参数错是前端,接口逻辑拒绝是后端
实战步骤:
1. 复现问题,抓到对应请求
2. 看 Request:URL、Method、Header、Body 参数是否正确
3. 看 Response:状态码、返回数据是否符合预期
4. 对比接口文档,判定责任方
5. 截图保存请求响应(提 Bug 时附上,开发秒懂)

💡 提 Bug 的加分项:把请求和响应截图(或用 Copy as cURL 导出)附到缺陷单里,开发的定位效率会提升数倍。

8.2 Mock 造数据

场景:需要测试"会员过期""余额为0""列表有 1000 条数据"等难造的场景
做法:
  1. 先正常抓一次请求,拿到真实响应
  2. 右键 → Save Response 保存为 JSON
  3. 修改 JSON 内容为目标数据
  4. Charles: Tools → Map Local 指向该文件
     (或 Fiddler: 拖到 AutoResponder → Choose Response File)
  5. 重新打开页面,即可看到 Mock 数据

8.3 弱网测试

Charles: Proxy → Throttle Settings → Enable Throttling
   ☑ Only for selected hosts → 添加目标域名(避免影响其他流量)
   设置 bandwidth / latency / reliability

重点验证:
  □ 是否有 Loading 提示,是否会卡死
  □ 超时后是否有友好提示 + 重试按钮
  □ 重复点击是否会产生重复订单/重复提交
  □ 图片加载失败是否有占位图
  □ 断网重连后数据是否恢复
  □ 是否发生崩溃/ANR

8.4 篡改请求做边界与安全测试

用 Breakpoints 拦截后修改:
  □ 超长字符串(昵称输入 10000 字符)
  □ 特殊字符(<script>、'、"、%、emoji、SQL 片段)
  □ 负数/超大数值(金额 -1、数量 99999999)
  □ 空值/null
  □ 篡改用户 ID / 订单 ID(检查是否越权)
  □ 篡改金额、数量(检查服务端是否二次校验)
  □ 删除/修改签名参数

⚠️ 安全测试重点:前端校验可以绕过,服务端必须二次校验。用抓包改包验证”篡改金额能否下单成功”,是经典的越权/逻辑漏洞测试。

8.5 接口自动化辅助

# 1. 抓包 → Copy as cURL → 直接转成 Python requests 代码
#    可用工具:curlconverter.com,或 Postman 的 Import → Paste cURL

# 2. Charles 导出 HAR → 导入 Postman / JMeter
#    File → Export → HAR → Postman: File → Import → 选 .har
# 由 cURL 转换得到的 requests 用例
import requests

url = "https://api.example.com/api/login"
headers = {"Content-Type": "application/json"}
data = {"username": "test01", "password": "123456"}

resp = requests.post(url, json=data, headers=headers, timeout=5)
assert resp.status_code == 200
assert resp.json()["code"] == 0

8.6 其他实用场景

场景 做法
复现线上问题到本地 Map Remote 把线上域名转发到本地服务
验证缓存策略 看响应头 Cache-Control、重复请求是否返回 304
检查敏感信息泄露 搜索响应中是否含明文密码、身份证、token
检查是否走 HTTPS 看是否有明文 HTTP 请求(安全合规问题)
验证接口性能 看 Timeline / Duration,定位慢在哪个接口
验证重试机制 用 Rewrite 让接口返回 500,看客户端是否重试

九、常见问题速查

问题 原因 解决
抓包后上不了网 代理开着但 Charles 关了 关闭系统代理或保持 Charles 运行
全是 CONNECT 看不到内容 没开 SSL Proxying Proxy → SSL Proxying Settings 开启并加域名
提示证书不受信任 根证书未装入”受信任的根证书颁发机构” 重装证书到正确存储区
手机连了代理但抓不到 电脑防火墙拦截 / 不同网段 关防火墙测试;确认同一 WiFi
Charles 每次弹授权窗口 手机 IP 变化 确认后不再弹;或设置 Allow 白名单
抓包导致 App 变卡 抓取流量过多 用 Filter 只保留目标域名
关掉 Charles 后浏览器打不开网页 系统代理没还原 关闭系统代理开关,或退出前先关代理
HTTPS 显示 <unable to decrypt> 该域名未加入 SSL Proxying 列表 加入列表或填 *

十、学习资源

资源 说明
Charles 官方文档 功能说明与教程
Fiddler 官方文档 Fiddler Classic/Everywhere 文档
mitmproxy 官方文档 含 Python 插件 API
Wireshark 官方指南 网络层抓包权威资料
curlconverter cURL 转各语言代码
Fiddler 中文文档 / 博客园抓包专题 中文实战经验