Fiddler抓包和修改WebSocket数据,支持wss

记录一下用FiddlerWebSocket收发的数据进行抓包分析和篡改数据,只找到这么一个方法,能用就行吧。
时间:2019-3-29
环境: win7 + Fiddler 5.0

Fiddler抓取WebSocket数据

Fiddler中双击WebSocket Session即可查看此连接收发的数据。可惜此选项卡内没有带发送数据的功能(一个输入框(HEX文本) + 一个按钮),要是有就基本完美了。

开启https支持

如果需要抓取httpswss请求,需要在Fiddler菜单Tools > Options > HTTPS 中开启HTTPS支持。在Actions菜单中,设置电脑系统信任Fiddler的根证书。

手机简单支持

如果需要抓取手机中的数据,需要在Tools > Options > Connections中设置允许客户端连接,然后在手机wifi连接中设置使用电脑的ipFiddler监听的端口作为代理。

然后手机浏览器访问电脑ip + 端口 进入Fiddler页面下载根证书,并信任(安装)此证书。

完成以上操作才有可能监控httpswss请求,大部分是能监控的。

修改WebSocket数据

Fiddler界面中并未找到修改WebSocket数据的地方,搜索也没找到多少直接的资料信息,不过写怎么打印WebSocket数据日志的倒蛮多(Fiddler 4.5开始已没有这个必要了)。另外看到一篇利用fiddler core api 拦截修改 websocket 数据的。两个综合一下就大功告成了。

Fiddler菜单Rules > Customize Rules中实现Handlers类的OnWebSocketMessage方法,此方法可以得到WebSocket收发的数据,而且可以修改。另:Fildder主界面中FildderScript也可以直接修改脚本代码。

脚本语法

Fiddler采用的JScript.Net语法,这个语法不熟?没关系,我也不熟,但对JavaScriptC#任意一个熟就行了。

Classic ASP 用户可能对JScript和它的好基友VBScript比较熟,这两个除了写ASP外,Windows上的vbs js脚本代码也是主力使用方向。

简单点,把JScript当做IE 6来写就ojbk了,绝对的原味,反正下面的例子里面js代码居多。参考文章结尾的测试代码,不要在意那些拼音或者缩写的奇丑变量名。

Echo测试结果

测试完整代码在文章结尾。

发送echo测试数据test edit:ddd,结果截图:

Log中已打印我们的修改日志信息,可以看到echo响应中完全包含了被修改后的发送数据,我特意用不同颜色标记了一下。


Fiddler自己的WebSocket记录信息,它记录的为我们修改之后的。

WebSocket发送数据

没找到方法,不知道怎么用Fiddler来发送WebSocket数据,参考第一节中的遗憾。

附:测试代码

class Handlers
{
	//实现此方法,拦截处理数据
	static function OnWebSocketMessage(oMsg: WebSocketMessage) {
		var arr=oMsg.PayloadAsBytes();
		var bs=Utilities.ByteArrayToString(arr);
		var txt=bytesToViewText(arr);//此文本为英文,可读的文本信息,不可读的乱码、中文都过滤掉了
		var newTxt="";
		
		//假设的修改场景,只要收发的数据中包含了 test edit: 就干它
		var edit=false;
		if(txt.indexOf("test edit:")+1){
			var nbs=bs;
			var m1=/(test edit:)(.*)/.exec(txt)||[];
			nbs=nbs.Replace(strToHex(m1[0]||""),strToHex(m1[1]+(oMsg.IsOutbound?"send":"onmessage")+" change:"+m1[2]));
			
			edit=true;
			oMsg.SetPayload(hexToBytes(nbs));
			
			newTxt=bytesToViewText(oMsg.PayloadAsBytes());
		}
		
		//并未直接提供获取SessionID的方法,应该是没有公开
		var all=oMsg.ToString();
		var m1=/#(\d+)/.exec(all)||[];
		var sessionID=m1[1]||-1;
		
		FiddlerApplication.Log.LogString(
			sessionID+":["+oMsg.ID+"]"
			+"["+(oMsg.IsOutbound?"出":"入")+"]"
			+"["+(edit?"改:"+newTxt:"")+"]"
			+txt+"\n");
	}
	
	//以下为一些功能函数
	static function bytesToViewText(arr:byte[]){
		var s="";
		for(var i=0;i<arr.length;i++){
			if(arr[i]>=32 && arr[i]<=126){
				s+=String.fromCharCode(arr[i]);
			}
		}
		return s;
	}
	static function strToHex(str:String){
		var byts=new byte[str.Length];
		for(var i=0;i<str.Length;i++){
			byts[i]=(byte)(str.charCodeAt(i));
		}
		return Utilities.ByteArrayToString(byts);
	}
	static function hexToBytes(hexString:String)
	{
		hexString = hexString.Replace(" ", "");
		var length = hexString.Length / 2;
		var hexChars = hexString.ToCharArray();
		var d = new byte[length];
		for (var i = 0; i < length; i++)
		{
			var pos = i * 2;
			d[i] = (byte)(charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
		}
		return d;
	}
	static function charToByte(c:String)
	{
		return "0123456789ABCDEF".indexOf(c);
	}

.......

只找到这么一个方法对WebSocket抓包分析和篡改数据,比较土,完.

<think>嗯,用户想知道如何逆向分析快手直播间的评论数据抓取解析。首先,我得回想一下之前处理过类似的问题。根据提供的引用,特别是引用[3][4],快手直播弹幕使用了WebSocket协议,并且数据是用Protobuf序列化的。这可能意味着评论数据也是通过类似的机制传输的。 首先,用户需要抓取数据,可能需要使用WebSocket连接。引用[2]提到使用WSS直连来抓取直播弹幕,所以评论可能也是通过同样的途径。接下来,数据抓取后是Protobuf格式的,需要反序列化。引用[3]详细说明了如何反序列化SocketMessageSCWebFeedPush,这可能涉及到特定的Protobuf结构定义。 然后,逆向工程需要分析JavaScript代码,找到数据处理的入口点。引用[4]指出在common.js中寻找解码逻辑,这可能需要使用开发者工具进行断点调试,跟踪数据流的处理过程。用户可能需要定位到处理WebSocket消息的函数,查看如何解析二进制数据。 另外,数据可能经过加密或编码,如十六进制数组,需要根据协议解码。引用[4]提到收到的是十六进制数组,可能需要转换为二进制后再进行Protobuf反序列化。因此,用户需要先捕获原始的WebSocket流量,保存为二进制数据,然后用Protobuf定义文件来解析。 可能遇到的问题包括Protobuf结构未知,需要逆向出对应的.proto文件。这可能需要分析反序列化代码中的字段名称类型,或者通过动态调试来推断结构。此外,快手可能会更新协议,导致旧的解析方法失效,需要持续维护。 用户还需要注意法律风险,确保数据抓取符合当地法律平台规定。引用[2]提到该项目的应用场景,但必须强调合法合规的重要性。 总结步骤应该是:抓取WebSocket连接、拦截数据、解析Protobuf、逆向JS处理逻辑、处理加密或编码。同时,提供相关问题帮助用户深入理解,比如如何捕获WSS连接、如何处理加密数据等。</think>### 快手直播间评论数据抓取与逆向解析方法 #### 1. **数据抓取基础流程** - **WebSocket连接建立**:快手直播间评论数据通常通过WebSocket协议(wss)传输,需先建立长连接以接收实时数据流[^2][^3]。 - **数据包拦截**:使用开发者工具(如Chrome DevTools)或抓包工具(Wireshark/Fiddler)捕获WebSocket通信流量,定位包含评论数据的消息帧。 - **协议格式识别**:快手直播数据采用Protobuf序列化,需将二进制数据解析为结构化数据[^4]。 #### 2. **逆向工程核心步骤** - **定位数据入口**: 在快手网页端或客户端代码中(如JavaScript文件`common*.js`),通过关键字(如`WebSocket`、`onmessage`)搜索数据接收函数,设置断点调试跟踪数据流向。 - **Protobuf反序列化**: 捕获的二进制数据需通过Protobuf定义文件(`.proto`)解析。若官方未公开协议,需通过以下方式逆向: - **动态调试**:在JavaScript中定位反序列化函数(如`decode`方法),记录字段映射关系。 - **数据比对**:构造已知评论内容,对比二进制数据差异,推断字段含义。 - **字段解析示例**: ```python # 伪代码:使用Python Protobuf库解析评论数据 import comment_pb2 # 自定义逆向生成的Protobuf类 data = b'\x0a\x07\xe7\x94\xa8\xe6\x88\xb7...' # 捕获的二进制数据 msg = comment_pb2.CommentMessage() msg.ParseFromString(data) print(msg.user_id, msg.content, msg.timestamp) ``` #### 3. **关键技术与注意事项** - **加密处理**:部分数据可能经过AES或Base64编码,需在反序列化前解密(如通过逆向JavaScript中的密钥生成逻辑)。 - **会话维持**:需处理心跳包(`ping/pong`)身份验证令牌(`token`),避免连接中断。 - **反爬机制绕过**:模拟真实用户行为(如User-Agent、Cookie轮换),降低IP封禁风险。 #### 4. **法律与合规性** - **数据使用限制**:仅限合法用途(如学术研究),避免侵犯用户隐私或平台权益。 - **协议更新应对**:快手可能频繁更新通信协议,需持续监控数据格式变化。 ```python # 示例:Python WebSocket客户端(需补充协议头与解密逻辑) import websockets import asyncio async def capture_comments(url): async with websockets.connect(url) as ws: while True: data = await ws.recv() # 调用Protobuf解析函数 parse_comment(data) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值