关于websocket抓包时的注意事项

本文详细解析了WebSocket客户端和服务端的数据交互过程,重点介绍了客户端和服务端如何通过掩码进行数据的异或运算,确保数据的安全传输,并解释了Sec-WebSocket-Key、Sec-WebSocket-Protocol和Sec-WebSocket-Accept等关键字段的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总是需要一些原因,需要查看客户端和服务端的websocket数据交互,为了使得查看方便,客户端和服务端使用ws而非wss。
服务端部署在linux上,用tcpdump抓包后,在windows上用wireshark打开,如下所示:
在这里插入图片描述
红色部分的是客户端发往服务端的,蓝色部分是服务端发往客户端的,很明显,客户端发往服务端的字符串无法看懂。

这是一些安全的原因,从客户端发送到服务端的帧全部要与掩码进行异或运算过才有效,而服务端发送到客户端的帧不需要进行异或运算

所以客户端发往服务端的数据是真实数据经过异或后处理的。

如下所示,是客户端发往服务端的wireshark的抓包截图,可以看到Masked payload,这是客户端发给服务端的真实数据,不具备可读性,wireshark根据Masking-Key和Masked payload得到Payload,这个是就是异或前的数据,具有可读性。
在这里插入图片描述

下面接着看下服务端发往客户端的抓包,如下所示,很明显,没有Masked payload,说明服务端发往客户端的数据没有进行异或运算,具备可读性。
在这里插入图片描述

下面说明下客户端发往服务端时,原始数据的异或运算规则
假设payload长度为pLen,masking-key长度为mLen,i作为payload的游标,j作为masking-key的游标,代码如下:

for (i = 0; i < pLen; i++){    int j = i % mLen;
    maskedPayload[j] = payload[j] ^ maskingKey[j];
}

下面用抓包的数据进行演示:
如下所示:Maked payload是经过掩码处理的,第一个字节是16进制的76。
在这里插入图片描述
现在我们鼠标点击Payload,查看其情况,如下所示,第一个字符是16进制的7b
在这里插入图片描述

现在来验证下原始数据中的第一个字节7b经过掩码的异或运算变为76.

对照前面发的掩码运算代码,masking-key是0d02747e,4个字节。
maskedPayload[0] = payload[0] ^ maskingKey[0];

payload[0]为7b,二进制表示为0111 1011
而maskingKey是0d02747e,则maskingKey[0]为0d,二进制表示为0000 1101
这两个二进制进行异或,结果的二进制表示为0111 0110,16进制表示即为76。

下面就websocket中的开始交互时的报文做下阐述,如下所示,是交互的过程

GET / HTTP/1.1
Connection: Upgrade
Host: 10.0.0.197:9002
Sec-WebSocket-Key: tUR8nKgcWk3ObiwSAkJXSw==
Sec-WebSocket-Protocol: janus-protocol
Sec-WebSocket-Version: 13
Upgrade: websocket
User-Agent: WebSocket++/0.8.2

HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Sec-WebSocket-Accept: YMmVJR32roxutjWu514lSm++izY=
Server: WebSocket++/0.8.2
Upgrade: websocket

本人此处想解释客户端发的Sec-WebSocket-Key,Sec-WebSocket-Protocol,以及服务端回复的Sec-WebSocket-Accept这三个字段。

首先Sec-WebSocket-Protocol代表着协议,比如大名鼎鼎的janus,要求必须填写此字段,否则无法连接到janus服务端。

我们看下janus中的如下代码
在这里插入图片描述
很明显,其支持http-only和janus-protocol两种连接方式,如果ws客户端不指定Sec-WebSocket-Protocol,或者指定值出错,则janus拒绝。

Sec-WebSocket-Key和Sec-WebSocket-Accept主要用于客户端校验服务端确实是ws服务端,这里的校验规则如下:
服务端将Sec-WebSocket-Key 的内容与标准定义的唯一GUID字符(258EAFA5-E914-47DA-95CA-C5AB0DC85B11)串拼接起来,计算出SHA1散列值,结果是一个base-64编码的字符串,把这个字符串发给客户端即可

本示例中的Sec-WebSocket-Key是tUR8nKgcWk3ObiwSAkJXSw==,跟GUID组合成下面字符串
tUR8nKgcWk3ObiwSAkJXSw==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
将此字符串进行sha1运算,得到如下字符串:
60c995251df6ae8c6eb635aee75e254a6fbe8b36
该字符串是16进制表示,很遗憾本人未能找到sha1后编码成base64的在线网页。
而实际上本人经过处理,发现60c995251df6ae8c6eb635aee75e254a6fbe8b36和YMmVJR32roxutjWu514lSm++izY=分别是同一个字符串的16进制表示和base64表示。

如下所示,本人将YMmVJR32roxutjWu514lSm++izY=还原,然后内存窗口中查看out地址,16进制展示,刚好对应。
在这里插入图片描述

<think>好的,我现在需要帮助用户了解如何对微信小程序进行抓包以调试或分析网络请求。首先,我得整理用户的问题,明确他们需要的是工具和方法,以及调试和分析网络请求的具体步骤。 根据用户提供的引用内容,我看到有提到Fiddler作为抓包工具,还有微信开发者工具的真机调试功能。这些应该是关键点。首先,我应该介绍常用的抓包工具,比如Fiddler和Charles,然后说明如何在微信开发者工具中使用Network面板进行抓包。此外,用户可能还需要知道如何在真机调试进行抓包,这可能涉及到代理设置和证书安装。 接下来,我需要考虑步骤的详细说明。例如,使用Fiddler需要设置代理,手机和电脑要在同一网络下,安装Fiddler的根证书,然后在微信小程序中操作以捕获请求。同,真机调试部分需要用户开启调试模式,并通过开发者工具的Network面板查看请求。另外,HTTPS请求的抓包可能需要额外的配置,比如解密HTTPS流量,这部分要提醒用户注意证书问题,避免出现安全警告或无法抓包的情况。 还要注意用户可能遇到的常见问题,比如抓不到包的情况,可能需要检查代理设置、证书是否安装正确,或者是否使用的是HTTPS但未配置解密。此外,微信小程序本身可能有安全限制,需要提醒用户遵循法律法规,不要用于非法用途。 最后,生成相关问题,确保覆盖用户可能进一步想知道的内容,比如HTTPS抓包配置、常见问题解决、与网页抓包的区别,以及如何结合抓包进行性能优化。这样用户可以得到全面的信息,并且有进一步探索的方向。</think>### 微信小程序抓包工具及方法详解 #### 一、常用抓包工具 1. **Fiddler** - 支持HTTP/HTTPS协议抓包,可分析请求头、响应内容、性能参数 - 提供断点调试、请求重放等高级功能[^2] - 配置方法: ```bash 1. 工具设置:Tools > Options > HTTPS 勾选"Decrypt HTTPS traffic" 2. 手机设置:连接与PC同一网络,配置代理为PC的IP:8888 3. 安装Fiddler根证书到移动设备 ``` 2. **Charles Proxy** - 可视化界面更友好,支持JSON格式自动美化 - 可模拟慢速网络环境测试性能 3. **Wireshark** - 适合底层协议分析,但学习曲线较陡峭 #### 二、微信开发者工具内置抓包 1. **本地调试模式** - 开发版小程序可直接使用开发者工具的 **Network面板** - 查看完整请求链路: $$请求间 = T_{DNS} + T_{TCP} + T_{SSL} + T_{传输}$$ - 支持过滤XHR/WebSocket请求类型 2. **真机调试模式**[^1] - 通过USB连接手机,选择"通过IP地址连接" - 在开发者工具控制台输入: ```javascript wx.request({ url: 'https://api.example.com', success: function(res) { console.log('响应数据:', res.data) } }) ``` - 抓包数据包含完整请求/响应头信息 #### 三、移动端抓包实战步骤 1. **Fiddler配置示例** ```python # 证书安装验证伪代码 if not has_valid_certificate(): install_root_certificate() else: start_capturing() ``` - 手机端访问 `http://<PC_IP>:8888` 下载证书 - 安卓需在设置-安全中手动启用证书 2. **小程序特殊处理** - 关闭证书验证(仅限调试): ```javascript wx.request({ url: 'https://example.com', enableHttp2: true, enableQuic: true, enableCache: true }) ``` - 使用测试环境域名白名单 #### 四、数据分析要点 1. **关键性能指标** - 首字节间(TTFB) - 资源加载瀑布图 - 重复请求检测 2. **安全注意事项** - 生产环境需恢复证书验证 - 敏感数据应进行加密传输 - 遵守微信小程序隐私政策
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值