当前位置: 首页 > news >正文

Charles抓包进阶:断点与重写实战,掌握HTTP/HTTPS流量拦截与修改

1. 项目概述:从“看”到“改”的抓包进阶

做移动开发或者接口测试的朋友,对抓包工具肯定不陌生。我们常用它来查看App和服务器之间到底在“聊”些什么,排查问题、分析数据流。但很多时候,仅仅是“看”已经不能满足需求了。比如,你想测试一个支付回调接口,但总不能真的一直花钱去触发吧?或者,你想模拟服务器返回一个特定的错误码,来验证客户端的容错逻辑;又或者,你想绕过客户端的某些限制,临时修改请求参数。这时候,就需要从“观察者”升级为“参与者”,也就是对网络请求进行拦截和修改。

“Charles拦截抓包,修改包里面内容”这个标题,指向的就是这个核心进阶技能。它不再是简单的流量镜像,而是一种主动的、干预式的调试和测试手段。Charles作为一款老牌且强大的HTTP/HTTPS代理工具,其“断点”(Breakpoints)和“重写”(Rewrite)功能正是实现这一目标的利器。掌握它,意味着你可以在不修改客户端和服务端任何代码的情况下,动态地改变网络交互的行为,这为开发调试、安全测试、数据模拟打开了新世界的大门。无论是前端开发者想模拟后端接口返回,还是测试工程师需要构造异常场景,亦或是安全研究员分析应用逻辑,这都是必须掌握的实操技能。

2. 核心原理与工具准备:Charles如何成为“中间人”

在深入实操之前,我们必须先搞清楚Charles凭什么能拦截和修改我们的数据包。这一切都基于一个经典的网络模型:“中间人”(Man-in-the-Middle, MITM)代理。

2.1 “中间人”代理的工作原理

想象一下,客户端(比如你的手机App)和服务器(比如api.example.com)想要直接通信。Charles介入后,就变成了这样:客户端不再直接连接服务器,而是连接Charles;Charles再以自己的身份去连接服务器。于是,客户端与Charles之间建立了一个连接,Charles与服务器之间建立了另一个连接。

对于客户端来说,Charles“伪装”成了服务器;对于服务器来说,Charles“伪装”成了客户端。所有流经的数据,都会在Charles这里做一个“中转”。正因为Charles是流量的必经之路,它才有机会在数据“路过”时,将其截停下来(Breakpoint),让你查看和修改,然后再放行。

注意:正是因为这种“中间人”特性,在使用Charles抓取HTTPS流量时,需要在其和客户端之间建立一种特殊的信任关系,即安装Charles的根证书到客户端设备上。否则,客户端会检测到证书不匹配,从而中断连接,这也是抓取HTTPS包的必要前提步骤。

2.2 Charles核心功能模块解析

要实现拦截修改,主要依赖Charles的两个核心功能模块,它们适用于不同的场景:

  1. 断点(Breakpoints):这是一种“实时、手动”的拦截方式。你可以为特定的网络请求(通过URL匹配规则设置)设置断点。当请求命中规则时,Charles会立即暂停请求或响应的传输,弹出一个编辑窗口,等待你手动修改其中的任何内容(如URL、请求头、请求体、响应状态码、响应体等)。修改确认后,再继续执行。这种方式非常灵活,适合临时性的、交互式的调试。
  2. 重写(Rewrite):这是一种“自动、批量”的修改方式。你可以定义一系列规则,例如:“将所有发送至api.demo.com的请求头中的User-Agent修改为MyCustomClient”,或者“将所有来自service.test.com的响应体中的字符串”success”: false替换为”success”: true”。规则设置好后,Charles会在后台自动执行所有匹配的请求和响应,无需人工干预。这种方式适合需要长期、批量修改的场景,比如自动化测试。

2.3 环境配置与证书安装

工欲善其事,必先利其器。在开始拦截修改前,必须完成基础配置,尤其是HTTPS抓包配置,这是很多新手卡住的第一步。

在电脑端(Charles运行端):

  • 启动Charles,首次启动会请求授予代理权限,允许即可。
  • 确保Proxy -> Proxy Settings…中的HTTP代理端口(默认8888)是开启的。
  • 最关键的一步:安装Charles根证书到你的计算机“受信任的根证书颁发机构”存储中。通过Help -> SSL Proxying -> Install Charles Root Certificate完成。安装后,请务必打开系统的证书管理器,找到该证书,并手动将其设置为“信任”。

在移动设备端(如iPhone/Android):

  1. 确保手机和电脑在同一局域网(连接同一个Wi-Fi)。
  2. 在手机Wi-Fi设置中,配置代理:服务器为电脑的IP地址,端口为Charles的代理端口(默认8888)。
  3. 在手机浏览器中访问chls.pro/ssl,这个链接会引导你下载并安装Charles的根证书。
  4. 对于iOS:安装描述文件后,还需进入设置 -> 通用 -> 关于本机 -> 证书信任设置,找到Charles Proxy证书并完全信任。
  5. 对于Android:安装证书后,可能还需要在系统设置中为已安装的证书设置凭据用途(部分机型需要)。

完成以上步骤后,在Charles中开启Proxy -> SSL Proxying Settings…,添加一个通用的SSL代理设置:Host为*,Port为*。这表示对任何域名的HTTPS流量都进行解密代理。此时,你应该能在Charles中看到明文的HTTPS请求了。

3. 实战演练:使用断点功能手动修改请求与响应

断点功能是最直观、最常用的拦截修改方式。我们来通过两个典型场景,一步步走通整个流程。

3.1 场景一:修改请求参数,模拟用户提交

假设我们正在测试一个商品搜索接口GET https://api.shop.com/search?keyword=手机&page=1,我们想测试当关键词keyword参数为空或超长时,服务器的处理情况。

操作步骤:

  1. 定位请求:在Charles左侧的Structure视图中,找到并选中你想要拦截的域名(api.shop.com)或具体的请求路径(/search)。
  2. 设置断点:右键点击该域名或请求,选择Breakpoints。你也可以通过Proxy -> Breakpoint Settings…来更精细地管理断点规则列表。在这里,你可以添加规则,通过URL(支持通配符*)来匹配请求。
  3. 触发请求:在手机App或浏览器中,执行触发该搜索请求的操作。
  4. 拦截与修改:请求发出后,Charles会立即弹出 “Breakpoint Request for [请求URL]” 窗口。这个窗口分为两部分:
    • 请求视图:这里展示了即将发送给服务器的所有信息。你可以直接修改Query标签页下的keyword参数值,比如清空它,或者输入一串很长的字符。
    • 执行操作:修改完毕后,点击底部的Execute按钮。Charles会将你修改后的请求发送给服务器。
  5. 拦截响应(可选):如果你在Breakpoint设置中也勾选了响应拦截,那么在服务器返回数据后,Charles会再次弹出 “Breakpoint Response for [请求URL]” 窗口。在这里,你可以修改服务器返回的JSON数据、状态码等,然后点击Execute将修改后的响应返回给客户端。

实操心得:设置断点时,尽量使用具体的URL路径而不是整个域名,否则该域名下的所有请求都会被拦截,导致操作繁琐且影响其他请求。对于修改请求体(如POST的JSON),在请求视图的JSON Text标签页下修改非常方便,Charles会自动格式化JSON。

3.2 场景二:修改响应内容,构造特定测试数据

假设我们需要测试App在收到一个特定的错误响应(如{“code”: 500, “msg”: “Internal Server Error”})时的UI展示和逻辑处理。

操作步骤:

  1. 清除请求断点:为了避免重复修改请求,我们可以在Breakpoint Settings中编辑规则,取消Request的勾选,只保留Response。这样只会拦截响应。
  2. 触发正常请求:在客户端进行一次正常的搜索操作。
  3. 拦截并篡改响应:当Charles弹出响应断点窗口时,切换到JSON Text视图。将原本正常的响应体完全替换为我们的错误数据:{“code”: 500, “msg”: “Internal Server Error”}。同时,你还可以在Status区域将HTTP状态码从200改为500。
  4. 执行并观察:点击Execute。客户端App收到的将是你构造的错误响应,你可以立即观察到App的界面变化、弹窗提示、日志输出等,从而验证其错误处理机制是否健全。

这个功能在测试边界条件和异常流程时无比强大,你无需等待后端配合部署错误代码,就能独立完成客户端健壮性测试。

4. 高效自动化:使用重写规则批量修改流量

断点虽好,但每次都需要手动点击,不适合需要重复执行或批量修改的场景。这时,“重写”(Rewrite)功能就是你的自动化脚本。

4.1 重写规则的核心组成

一个重写规则集(Rewrite Set)包含多个规则(Rule),每个规则由四个核心部分组成:

  1. 位置(Location):定义规则作用于请求(Request)还是响应(Response)。
  2. 匹配条件(Match):通过协议、主机、端口、路径、查询参数等来筛选目标流量。支持使用正则表达式进行复杂匹配。
  3. 操作(Action):定义要执行的具体修改动作,如修改头(Header)、修改查询参数(Query)、替换正文(Body)等。
  4. 值(Value):指定操作的目标值,可以是固定字符串,也可以是包含正则表达式分组的变量(如$1)。

4.2 实战案例:全局修改User-Agent与特定接口数据替换

案例A:为所有请求添加一个自定义标记头假设我们想标记所有经过Charles的流量,以便在服务器日志中区分。

  1. 打开Tools -> Rewrite…,创建一个新的重写规则集,比如命名为 “Add Custom Header”。
  2. 点击Add新建一条规则。
  3. 位置:选择Request
  4. 匹配条件:为了匹配所有请求,可以将Host留空,或者填写*Path也留空。
  5. 操作:选择Add Header
    • Name:X-Debug-Source
    • Value:Charles-Rewrite
  6. 保存并启用该规则集。此后,所有从客户端发出的请求,都会自动带上X-Debug-Source: Charles-Rewrite这个头信息。

案例B:将某个接口的响应数据中的价格单位“元”改为“美元”假设接口https://api.shop.com/product/123返回的JSON中有一个字段”price”: “100元”,我们需要在测试时模拟国际化展示。

  1. 在Rewrite设置中,新建规则集 “Currency Replace”。
  2. Add新规则。
  3. 位置Response
  4. 匹配条件
    • Host:api.shop.com
    • Path:/product/123(也可以使用/product/*匹配所有商品)
  5. 操作:选择Body->Replace
  6. :这里需要使用正则表达式。
    • Find:(\d+)(元)(这个正则匹配数字+“元”,并将数字和“元”分别放入分组$1和$2)
    • Replace:$$$1美元(这里$$表示输出一个$符号,$1引用第一个分组即数字,后接“美元”)
    • 注意:在Charles的Replace框中,$符号有特殊含义(引用分组),所以如果要输出字面值$,需要转义为$$
  7. 保存启用。之后,所有匹配的响应返回的”100元”都会被自动替换为”$100美元”

重写规则的强大之处在于其“设置一次,自动运行”的能力,非常适合在集成测试、性能测试或安全测试中,构造持续的、特定的流量环境。

5. 本地映射与远程映射:更彻底的流量接管

除了动态修改,Charles还提供了静态映射功能,可以将请求直接指向本地文件或另一个远程地址,实现更彻底的流量“调包”。

5.1 本地映射(Map Local)

这个功能允许你将某个特定的网络请求,直接映射到本地计算机上的一个文件。服务器根本不会收到这个请求,客户端拿到的是你本地文件的内容。

典型场景:接口尚未开发完成,前端需要静态数据进行UI开发和联调。

  1. 让后端提供一份完整的、符合接口规范的JSON数据文件。
  2. 在Charles中,选中该请求,右键选择Save Response…,将响应体保存为一个本地.json文件。
  3. 再次右键选中该请求,选择Map Local…
  4. 在设置窗口中,选择你刚才保存的本地JSON文件。
  5. 点击OK。之后,所有对该URL的请求,Charles都会直接返回本地文件的内容,而不会去访问真正的服务器。

注意事项:使用Map Local时,响应的HTTP状态码会固定为200(OK)。如果你需要测试非200状态码(如404, 500),Map Local无法直接实现,这时应使用断点(Breakpoints)功能来修改状态码,或者使用远程映射(Map Remote)映射到一个能返回错误码的测试服务器。

5.2 远程映射(Map Remote)

这个功能可以将请求从一个地址重定向到另一个地址。比如,将指向生产环境的请求,临时重定向到测试环境。

典型场景:在测试环境中,使用生产环境的App安装包进行测试,避免打包。

  1. 打开Tools -> Map Remote…
  2. 启用Enable Map Remote
  3. 点击Add添加一条映射规则。
  4. 匹配(Map From)
    • Protocol:https
    • Host:api.product.com(生产环境主机)
    • Path:/v1/user/login(可选,可以只映射特定路径)
  5. 重定向到(Map To)
    • Protocol:https
    • Host:api.test.com(测试环境主机)
    • Path:/v1/user/login(路径可以保持不变,也可以修改)
  6. 保存后,所有原本发往api.product.com/v1/user/login的请求,都会被Charles透明地转发到api.test.com/v1/user/login。这对于进行全链路测试、灰度发布验证非常有用。

6. 常见问题排查与实战技巧

在实际使用中,你肯定会遇到各种“坑”。下面是一些高频问题和我积累的实战技巧。

6.1 HTTPS抓包失败或显示乱码

这是最常见的问题,根本原因在于SSL证书信任链未正确建立。

  • 现象:HTTPS请求显示为<unknown>SSL Proxying not enabled for this host,或者能看到请求但内容是乱码。
  • 排查清单
    1. 电脑证书是否已信任:这是最容易被忽略的一步。在电脑上安装Charles根证书后,必须手动打开系统钥匙串访问(Mac)或证书管理器(Windows),找到Charles Proxy CA或类似名称的证书,双击打开,在“信任”设置中,将“使用此证书时”设置为“始终信任”
    2. 手机证书是否已安装并信任:确保手机通过chls.pro/ssl安装了证书,且iOS在“证书信任设置”中已启用完全信任。
    3. SSL代理设置是否包含目标域名:在Proxy -> SSL Proxying Settings…中,检查是否添加了*:*的通配规则,或者至少添加了你需要抓取的特定主机和端口(如*.yourdomain.com:443)。
    4. App是否启用了证书锁定(SSL Pinning):一些安全性要求高的App(如银行、支付类)会内置服务器证书,只信任固定的证书,从而防止中间人攻击。这种情况下,Charles的通用根证书无效。解决方案通常需要反编译App并绕过证书锁定,这涉及更复杂的技术,且可能违反用户协议,需谨慎评估。

6.2 断点或重写规则不生效

  • 检查规则是否启用:在Breakpoint Settings或Rewrite设置中,确保顶部的Enable BreakpointsEnable Rewrite复选框是勾选的,并且对应的规则集也是勾选状态。
  • 检查匹配条件:URL匹配是否准确?注意大小写和路径。对于重写规则,检查HostPath是否填写正确,特别是当Path有查询参数时,匹配的是路径部分,不包含?之后的内容。
  • 清除缓存:Charles和客户端(浏览器/App)都可能缓存了旧的请求。尝试在Charles中清除当前会话(Charles -> Clear Session),并在客户端上拉刷新或重启App。
  • 规则执行顺序:如果有多条重写规则,它们会按列表顺序执行。后执行的规则可能会覆盖前面规则的效果。检查规则顺序是否符合你的预期。

6.3 修改复杂JSON或二进制数据

  • JSON格式化:在断点编辑窗口或重写规则的Body替换中,如果原始数据是格式化的JSON,修改起来很方便。如果是压缩过的(一行),可以点击视图下方的{}按钮进行格式化。
  • 二进制数据:对于图片、音视频等二进制响应,在断点窗口中可能显示为十六进制码。直接修改二进制数据非常困难,通常的用途是“替换”整个响应体。这时,使用Map Local功能,直接映射到一个本地的二进制文件(如图片),是更合适的选择。

6.4 性能影响与使用建议

开启断点会显著减慢网络请求速度,因为每个匹配的请求都需要等待人工操作。在不需要时应及时关闭断点功能。重写规则对性能影响较小,但复杂的正则表达式匹配也可能带来开销。

一个高效的工作流是:使用断点进行探索性调试和一次性修改,找到规律后,将固定的修改模式提炼成重写规则,实现自动化。对于固定的Mock数据,则使用本地映射。将三者结合使用,能让你在网络调试和测试中游刃有余。

最后,记住Charles是一个强大的工具,但能力越大责任越大。请仅在自己的开发、测试环境或已获得明确授权的设备上使用拦截修改功能,切勿用于干扰或窥探他人的网络通信,这是基本的职业操守和技术伦理。

http://www.cnnetsun.cn/news/3824020.html

相关文章:

  • 随机森林算法详解——基于垃圾邮件分类案例
  • Spring Security自定义认证:从默认密码到UserDetailsService实现详解
  • 从微软XBOX裁员看技术组织架构优化:扁平化与高效协作实践
  • Unity游戏开发实战:点乘与叉乘的五大核心应用场景解析
  • 本地大模型部署实战:从CUDA环境搭建到SenseNova-U1部署全流程
  • 年薪百万的网安人,到底比你强在哪?这份「从0到1」的系统学习地图,请查收。
  • 构建AI隐私安全舱:三层纵深防御体系护航企业智能数据安全
  • 统信UOS系统安装NVIDIA官方驱动实现稳定多屏显示完整指南
  • Android编译优化:精准模块清理解决增量编译失败
  • WorkBuddy与罗与罗Skill:构建法律AI智能体工作流的工程实践
  • MySQL字符集与校对规则深度解析:从原理到实战,彻底解决乱码问题
  • Loop Engineering 没死,Graph Engineering 也没有上位
  • 从拳击手到AI金融科技创业者:蔡永军的跨界转型之路
  • 信奥赛01串问题解析:位运算与动态规划实战
  • OpenClaw AI Agent 实战:从部署到技能开发的完整指南
  • 2026年正规SEO公司怎么选:七大避坑维度+真实案例复盘+KPI对赌合同指南|详解
  • 2026年正规SEO公司怎么选:七大避坑维度+真实案例复盘+KPI对赌合同指南|指南
  • 2025最权威的十大降AI率神器横评
  • 【读论文】2020 IEEE [C] 多种基音检测算法对比研究 A comparative study of various pitch detection algorithms
  • 关于编译器报警告--scanf的返回值被忽略-程序却能正常运行的理解
  • React useState初始值写法性能优化指南
  • Kali Linux部署HexStrike AI:MCP连接失败深度排错与优化指南
  • CTFHub HTTP协议通关指南:从基础请求到实战技巧
  • 支持私有化部署的企业 Agent 方案选型指南:技术架构、安全边界与主流厂商深度测评
  • Unity Cinemachine Virtual Camera:从核心原理到第三人称镜头实战
  • 虚拟仿真、半实物仿真和实况仿真简介
  • OpenCV相机标定实战:从针孔模型到鱼眼矫正的完整指南
  • UE5 Nanite实战指南:从核心原理到资产分类启用策略
  • 基于企业微信与go-cqhttp构建AI数字分身:IM生态集成实践
  • 亚马逊运营底层逻辑解析:从A9算法到飞轮理论,构建系统性认知框架