在网络调试中,能抓到包只是第一步。 当问题指向客户端行为异常、状态分支不符合预期,或者需要验证条件时,只看请求和响应已经不够了。
这类场景需要在数据返回给 App 之前,主动改掉它。
不是所有抓包方式都能改响应
在动手之前,需要先知道一个条件,只有代理模式,才具备修改请求和响应的能力。
原因是代理工具位于客户端与服务器之间,请求和响应在这里以明文形式经过,才有机会被拦截和替换
设备直接抓包、数据流抓包,只负责采集和展示数据,不参与转发,自然也无法修改。
从代理抓包开始修改
如果目标是改响应,第一步必须让流量经过代理。
基本准备流程
- 在电脑上启动代理抓包工具
- 确认代理端口正在监听
- 设备与电脑处于同一网络
- 在设备侧配置代理地址与端口
- 在设备上安装并信任代理证书
完成后,可以先用浏览器访问 HTTPS 页面,确认代理生效。
确认目标 App 的流量进入代理
接下来是一个关键验证步骤:
- 在代理工具中观察 Safari 请求
- 再触发 App 中的业务操作
如果 App 的请求能出现在代理列表中,说明这条路径成立,可以继续。
如果没有任何请求出现,需要先解决流量是否经过代理的问题,而不是直接写脚本。
为什么要用脚本,而不是手工改包
在调试中,手工改包存在几个限制:
- 只能修改一次
- 不适合重复请求
- 容易引入操作误差
自定义脚本的价值在于:
- 对特定 URL 自动生效
- 每次请求行为一致
- 便于反复验证客户端逻辑
这也是代理工具支持脚本能力的原因。
在抓包大师中启用拦截器
在抓包大师(Sniff Master)的 HTTPS 代理抓包模式 下,可以使用内置拦截器来修改请求或响应。
操作方式是:
- 进入 HTTPS 代理抓包界面
- 在右侧找到拦截器入口(插件图标)
- 打开拦截器日志窗口
- 确认拦截功能处于开启状态
只有在代理模式中,这个入口才会存在。
编辑拦截器脚本
在拦截器界面中,可以进入脚本编辑区域。
脚本由固定结构组成:
handleRequest(request)handleResponse(response)filterUrl()
函数名和参数不能修改,只能调整内部逻辑。
通过 URL 规则控制拦截范围
在开始修改响应之前,先限制作用范围。
例如,只拦截某个接口:
function filterUrl() {
return ["https://api.example.com/v1/*"]
}
这样可以避免误修改其他请求,便于观察效果。
修改响应内容的具体方式
在 handleResponse 中,可以直接操作返回数据。
例如,将接口返回的状态字段强制改为成功:
function handleResponse(response) {
if (!response.IsBase64Body) {
let body = JSON.parse(response.Body)
body.code = 0
body.message = "ok"
response.Body = JSON.stringify(body)
}
return response
}
保存后,脚本立即生效。
验证修改是否真正生效
验证方式不依赖主观判断,而是观察结果:
- App 是否进入原本不会进入的逻辑分支
- UI 是否出现不同的展示状态
- 是否触发了新的接口请求
如果行为发生变化,说明响应已经在代理层被替换。
与其他工具的配合方式
在实际调试中,自定义脚本往往不是单独使用的。
常见组合包括:
- 代理工具 + 拦截器:修改响应验证逻辑
- 抓包工具:确认请求参数是否符合预期
- 日志工具:对比客户端内部状态变化
脚本负责修改数据,其他工具负责观察结果。
脚本失效时的排查方向
当修改没有生效时,可以按顺序检查:
- 当前是否处于代理模式
- 目标请求是否命中
filterUrl - 响应体是否为 Base64 编码
- App 是否存在本地缓存逻辑
每一步都可以通过抓包结果直接验证。
自定义脚本修改响应是为了:
- 验证客户端对异常数据的处理
- 模拟后端未就绪的接口
- 快速复现边界条件