fiddler classic 默认不支持直接编辑websocket消息,因其将websocket视为有状态长连接而非http请求,ui仅展示只读帧;需通过customize rules脚本(如onwebsocketmessage钩子)或fiddlercore api修改payload,并注意方向判断、masking处理及帧头重算。

不能直接在Fiddler界面里编辑WebSocket消息发送——这是最常被卡住的第一步。Fiddler Classic 本身不提供 WebSocket 的“重发+编辑”输入框,必须通过脚本或 API 层干预才能修改内容。
为什么 Fiddler 默认不显示 WebSocket 编辑功能
Fiddler 把 WebSocket 当作长连接会话管理,而非单次 HTTP 请求。它能捕获、解码、展示帧(Text/Binary),但 UI 层没暴露 payload 编辑入口。你双击一个 ws:// 或 wss:// 会话,看到的是只读的 Frames 列表,没有 Send 按钮或 HEX 输入区。
- 这不是 bug,是设计取舍:WebSocket 是全双工、有状态、带 masking 的协议,简单替换 payload 容易破坏帧结构
- UI 不支持 ≠ 无法修改:Fiddler 提供了
OnWebSocketMessage事件钩子,这才是真正可操作的入口 - FreeHttp 插件虽能图形化编辑,但它本质也是 hook 了同一事件,且依赖 .NET Framework 版本兼容性,容易在新版 Fiddler Classic 中失效
用 Customize Rules 修改 WebSocket 消息(推荐)
打开 Rules > Customize Rules,定位到 class Handlers 区域,在里面添加:
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
static function OnWebSocketMessage(oMsg: WebSocketMessage) {
if (!oMsg.IsReceivedFromServer && oMsg.PayloadAsString().Contains("token")) {
// 只改客户端发出去的、含 token 的文本帧
var sNew = oMsg.PayloadAsString().replace('"token":"abc123"', '"token":"xyz789"');
oMsg.SetPayload(sNew);
}
}
-
oMsg.IsReceivedFromServer必须判断方向:true 是服务器→客户端,false 是客户端→服务器;改错方向会导致逻辑混乱 -
PayloadAsString()仅对 Text 帧有效;Binary 帧需用oMsg.Payload(byte[])手动处理,不能直接字符串替换 - 修改后必须调用
oMsg.SetPayload(...),否则无效;传入字符串会自动 UTF-8 编码,传入byte[]则原样写入 - 改完保存,Fiddler 会自动重载脚本——无需重启,但旧连接不会回溯生效,需新建 WebSocket 连接
用 FiddlerCore API 做更精细控制(如长度变更、二进制处理)
如果你需要替换 Hex 字符串、处理 masking、或应对 payload 长度变化(比如把 10 字节替成 32 字节),纯 FiddlerScript 不够稳,得用 C# 编写宿主程序,注册 FiddlerApplication.OnWebSocketMessage。
- 关键点:
e.oWSM.MaskingKey == null表示这是服务端发来的帧(客户端发的一定有 masking key),改服务端帧时不能假设 masking 存在 - 长度变化必须小心:
SetPayload()会自动重算 WebSocket 帧头(FIN、opcode、length 字段),但若原始帧是分片(continuation),自行拼接可能出错 - 示例中
hexStringToBytes("77-65-69-...")函数要自己实现,且注意 FiddlerCore 默认不引用BCCertMaker,HTTPS 解密需额外配置证书信任链 - 启动时必须调用
FiddlerApplication.Startup(端口, true, true),第二个true表示启用 HTTPS 解密,第三个true表示允许远程连接(手机抓包必需)
wss 流量抓不到?先检查这三处
WebSocket over TLS(wss://)抓包失败,90% 是 HTTPS 解密环节断在中间。
- 确认
Tools > Options > HTTPS中勾选了Decrypt HTTPS traffic,且点击了Actions > Trust Root Certificate - 手机抓包时,手机 Wi-Fi 设置代理后,必须用手机浏览器访问
http://ipv4.fiddler:8888(不是 https!)下载并安装证书,iOS 还需进「设置 → 已下载描述文件」手动信任 - 某些游戏或 App 使用了证书固定(Certificate Pinning),Fiddler 的根证书会被拒绝;此时需配合 Frida 或 Xposed 绕过校验,Fiddler 单独无解
真正难的不是写那几行替换逻辑,而是理解 WebSocket 帧格式约束和 TLS 握手链路中哪一环被卡住——尤其当 payload 替换后连接立刻断开,大概率是 masking 处理错误或长度字段没对齐。










