Rewrite 是 Charles 被低估的功能
大多数人用 Charles 只看包,其实它的 Rewrite(重写) 功能可以规则化地批量修改请求和响应——改参数、换 host、注 header,不用写一行代码。逆向调试和服务端逻辑测试都靠它。
入口:Tools → Rewrite → Enable Rewrite,然后添加规则集。
六大规则类型与实战场景
1. Modify Header(改请求头)
场景:测试接口对 ua 的校验逻辑——把所有请求的 User-Agent 改成指定值:
Type: Modify Header
Where: Request
Match: Name=User-Agent
Replace: Value=CustomAgent/1.02. Modify URL(改地址)
场景:把生产环境的请求打到测试环境:
Type: Modify URL
Match: Host=api.prod.com
Replace: Host=api.test.com3. Modify Query Parameter(改参数)
场景:批量修改请求里的某个参数(比如把 uid 改成测试账号):
Type: Modify Query Parameter
Match: Name=uid, Value=.*
Replace: Value=123454. Modify Body(改请求/响应体)
场景:改响应体测试客户端逻辑——把接口返回的 "isVip": false 改成 true,看客户端 UI 变不变(验证会员判断在客户端还是服务端):
Type: Body
Where: Response
Match: "isVip":false
Replace: "isVip":true5. Map Local(本地映射)
严格说这是独立功能(Tools → Map Local):把某个接口的响应映射成本地文件。调试客户端对异常响应的处理时神器——本地文件里随便构造错误数据,不用等服务端配合。
6. Breakpoint(断点)
Proxy → Breakpoint Settings 加规则后,匹配的请求/响应会暂停等手动编辑。适合精细修改单个请求,不适合批量。
精髓:Rewrite vs Breakpoint vs 写代码
| 需求 | 工具选择 |
|---|---|
| 一次性改一个包看看效果 | Breakpoint |
| 规则化批量改(每次请求都改) | Rewrite |
| 需要逻辑判断(解密、条件修改) | mitmproxy 插件 |
Rewrite 的规则是纯文本替换,没有逻辑能力——需要"解密后改完再加密"这种操作时,换 mitmproxy 插件。
实战案例:验证签名的覆盖范围
想确认服务端签名校验覆盖了哪些参数?用 Rewrite 逐个篡改参数,看哪个参数改了之后接口报错:
- 规则 1:改
price参数 → 接口正常返回 = price 不在签名范围 - 规则 2:改
uid参数 → 返回签名错误 = uid 在签名范围
十条规则跑一遍,签名的参数覆盖清单就出来了——这比逆 JS 快得多,是"黑盒探测签名逻辑"的标准手法。
精髓:Charles 的两个效率功能
- Repeat Advanced:右键请求 → Repeat Advanced,设置并发数和次数——简易压测/重放工具,测试接口的频率限制阈值全靠它
- Export/Export Session:把抓包记录导出成 har/chls 文件存档,或导入到 Postman 继续调试。逆向文档化时,导出关键接口的抓包样本是标配动作
总结
- Rewrite 做规则化批量改包,六大类型覆盖参数/header/body/host
- Breakpoint 改单包,Rewrite 改批量,逻辑修改上 mitmproxy
- 篡改参数探测签名覆盖范围是黑盒分析标准手法
- Repeat Advanced 是内置的频率阈值测试器
交流微信:run1255