iOS 抓包自动修改请求,把调试从 手动修改 变成 自动执行规则

0 阅读3分钟

在接口调试阶段,经常会遇到这样几种需求:

  • 固定把某个参数改成测试值
  • 强制把版本号改成旧版本
  • 自动给请求 Header 加 token
  • 重定向某个域名到测试环境

如果每次都手动断点修改,效率会很低。 更稳定的方式是:让代理自动改请求。

前提是流量必须经过代理。


一、确认流量是否经过代理

在开始写脚本之前,需要确认请求路径。

操作步骤

  1. 在电脑上启动代理工具(Charles / Proxyman / SniffMaster 代理模式)
  2. 确认监听端口已开启
  3. iPhone 与电脑连接同一 Wi-Fi
  4. 在 iPhone Wi-Fi 设置中填写代理地址与端口
  5. 安装并信任代理证书
  6. 用 Safari 打开 HTTPS 网站验证

如果 Safari 可以正常解密 HTTPS,就是走代理了。


二、验证目标 App 是否走代理

打开目标 App,触发网络请求。

如果请求出现在代理工具中:

  • 说明可以继续写自动规则
  • 修改将在代理层生效

如果没有请求出现,需要先解决“流量是否走代理”的问题。


三、为什么自动修改只能在代理模式下进行

自动修改请求的前提是:

  • 请求在到达服务器前被代理截获
  • 数据在代理中以明文形式存在

设备本机抓包只负责采集数据,不参与转发,因此不能修改。

这一点需要提前确认。


四、使用 Charles / Proxyman 的规则功能

在 Charles 中可以使用 Rewrite 或 Breakpoints。 在 Proxyman 中可以使用 Rewrite Rule 或 Script。

举一个实际示例:

需求: 把所有 /api/v1/login 请求的 version=2 改为 version=1

在 Charles Rewrite 中配置:

  • 匹配 URL:/api/v1/login
  • 替换参数:version=2version=1

保存后再次触发请求。

验证方式:

  • 在代理工具中查看请求参数
  • 对比服务器响应是否改变

五、使用 SniffMaster 进行自动修改请求

在 SniffMaster 中,自动修改请求通过 拦截器(仅代理模式下可用) 实现。

进入代理抓包模式

  1. 启动 SniffMaster
  2. 选择设备或本机
  3. 进入 HTTPS 代理抓包模式
  4. 确认流量可正常显示

打开拦截器

  • 在代理抓包界面右侧点击插件图标
  • 打开拦截器日志界面
  • 开启拦截功能开关
  • 点击“编辑拦截器” 拦截器

编写修改请求的脚本

拦截器结构固定:

function handleRequest(request) {
    return request
}

function handleResponse(response) {
    return response
}

function filterUrl() {
    return []
}

假设需求是:

  • 将某个接口的请求参数 role=user 改为 role=admin

可以这样写:

function handleRequest(request) {
    if (!request.IsBase64Body) {
        let body = request.Body
        body = body.replace("role=user", "role=admin")
        request.Body = body
    }
    return request
}

function handleResponse(response) {
    return response
}

function filterUrl() {
    return ["https://api.example.com/v1/*"]
}

保存脚本后再次触发请求。


六、验证修改是否成功

验证步骤必须明确:

  1. 在代理记录中查看修改后的请求体
  2. 对比服务器响应是否变化
  3. 观察 App 行为是否不同

如果参数被替换,服务器响应通常会不同。

这是判断规则是否生效的直接方式。 拦截器日志


七、处理 Base64 编码的请求体

如果请求体为二进制数据:

  • request.IsBase64Body 会为 true
  • request.Body 为 Base64 字符串

修改时需要:

  1. 解码 Base64
  2. 修改数据
  3. 重新编码
  4. 保持 IsBase64Body 为 true

否则服务器可能拒绝请求。


八、自动重定向接口地址

另一个常见需求是:

  • 把生产域名改为测试域名

在拦截器中可以直接修改 URL:

function handleRequest(request) {
    request.URL = request.URL.replace(
        "api.prod.com",
        "api.test.com"
    )
    return request
}

再次触发请求后,可以在代理记录中看到新地址。


九、自动修改 Header

如果需要统一加调试标识:

function handleRequest(request) {
    request.Header["X-Debug"] = "1"
    return request
}

保存后,每一次匹配到的请求都会自动带上该 Header。


自动修改请求的意义在于:

  • 模拟不同服务端返回条件
  • 验证客户端分支逻辑
  • 在后端未准备完成前进行联调

每一条规则都应该能通过抓包记录验证。

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