自定义脚本修改响应,从观看数据到修改数据的调试

0 阅读4分钟

在网络调试中,能抓到包只是第一步。 当问题指向客户端行为异常、状态分支不符合预期,或者需要验证条件时,只看请求和响应已经不够了。

这类场景需要在数据返回给 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 是否存在本地缓存逻辑

每一步都可以通过抓包结果直接验证。


自定义脚本修改响应是为了:

  1. 验证客户端对异常数据的处理
  2. 模拟后端未就绪的接口
  3. 快速复现边界条件

参考链接:www.sniffmaster.net/tutorial/zh…