Charles 断点调试与 Rewrite 重写实战:随心修改请求与响应

抓包只是"看",真正的调试力在于"改"。Charles 提供两套改包能力:Breakpoints(断点)用于手动、逐个、实时地拦下请求慢慢改;Rewrite(重写)用于自动、批量、按规则地改。两者配合,你几乎可以模拟出任何客户端与服务端之间的异常场景。

一、Breakpoints:实时拦截并手动改包

断点的效果是:当命中的请求经过 Charles 时,会被暂停,弹出一个可编辑界面,让你在"发出前"改请求、在"返回前"改响应,改完点 Execute 才继续。

启用方式(任选其一):

1. 在会话列表里右键某个请求或某个 Host,选择 Breakpoints,即可对该 URL 打断点;

2. 打开 Proxy > Breakpoint Settings,手动 Add 一条规则并勾选 Request / Response,可精确控制在请求阶段断、还是响应阶段断。

断点是"阻塞式"的:命中后请求会一直挂起等你操作。调试完记得关掉断点,否则页面会像卡死一样一直转圈——这是新手最常见的困惑。

二、请求断点 vs 响应断点

请求断点(Request)响应断点(Response)
拦截时机请求发往服务器之前响应返回客户端之前
能改什么URL、请求头、Query、请求体、Cookie状态码、响应头、响应体
典型用途改参数绕过前端校验、伪造 UA/Token 测后端把成功响应改成错误码、篡改数据测前端容错

在断点编辑界面,切到 Edit / Raw 标签即可直接改文本;改完点 Execute 放行,或点 Cancel/Abort 中断该请求。

三、Rewrite:按规则自动改包

如果你要改的是"每一个请求都加同一个 header"这种重复劳动,断点就太笨了。Tools > Rewrite 让你写一条规则,之后所有命中的请求/响应都被自动改写,无需人工干预。

操作:Tools > Rewrite > Enable Rewrite > Add(新建一组规则集)。每组规则先在 Location 里设定作用的 Host/Path,再在下方 Add 具体的重写动作。

四、Rewrite 规则类型速查表

Type(类型)作用常见用法
Add Header新增请求/响应头补 CORS 头、注入自定义调试头
Modify Header修改已有头的值改 User-Agent、改 Content-Type
Remove Header删除某个头去掉 If-None-Match 强制不走缓存
Modify Query Param改 URL 查询参数强制 env=test
Modify Path改请求路径/v1/ 重写成 /v2/
Body正则替换请求/响应体把响应里的 "vip":false 改成 true
Response Status改响应状态码把 200 改成 500 测容错
Host / URL整体重定向类似 Map Remote 的效果

Body 类型支持正则和捕获组,勾选 Regex 后即可用 $1 引用匹配内容,能做相当精细的替换。

五、四个高频实战场景

场景 1:伪装成另一个客户端。用 Modify Header 把 User-Agent 改成手机端 UA,或加 X-Client-Version: 9.9.9,测试服务端的机型/版本分发逻辑。

场景 2:把正常返回改成错误码,测前端容错。用 Response Status 把 200 改成 500401,看看页面有没有兜底提示、Token 失效后会不会正确跳登录。

场景 3:篡改响应体解锁隐藏逻辑。用 Body 正则把响应里的开关字段替换掉,例如:

匹配(Regex):  "featureFlag"\s*:\s*false
替换为:         "featureFlag": true

这样无需后端配合即可打开灰度功能做联调。

场景 4:绕过前端校验测后端健壮性。前端限制了金额只能填正数?用请求断点把 amount=100 改成 amount=-1 直接发给后端,看后端是否做了服务端校验——这是安全与健壮性测试的常规手法。

以上操作仅应在你有权测试的自有系统或获得授权的环境中进行。篡改他人服务的数据属于违规甚至违法行为。

六、Breakpoint 还是 Rewrite?

需求推荐
只改这一次、要逐个看着改Breakpoint
每次请求都要做同样的改动Rewrite
改动依赖具体内容、要临场判断Breakpoint
规则固定、想解放双手Rewrite

经验法则:探索阶段用断点摸清楚要改什么,稳定之后把它固化成 Rewrite 规则,调试效率会有质的提升。