Fiddler抓包和修改WebSocket資料,支援wss

xiangyuecn發表於2019-03-28

記錄一下用FiddlerWebSocket收發的資料進行抓包分析和篡改資料,只找到這麼一個方法,能用就行吧。 時間:2019-3-29 環境: win7 + Fiddler 5.0

Fiddler抓取WebSocket資料

Fiddler中雙擊WebSocket Session即可檢視此連線收發的資料。可惜此選項卡內沒有帶傳送資料的功能(一個輸入框(HEX文字) + 一個按鈕),要是有就基本完美了。

Fiddler抓包和修改WebSocket資料,支援wss

開啟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抓包和修改WebSocket資料,支援wss

指令碼語法

Fiddler採用的JScript.Net語法,這個語法不熟?沒關係,我也不熟,但對JavaScriptC#任意一個熟就行了。

Classic ASP 使用者可能對JScript和它的好基友VBScript比較熟,這兩個除了寫ASP外,Windows上的vbs js指令碼程式碼也是主力使用方向。

簡單點,把JScript當做IE 6來寫就ojbk了,絕對的原味,反正下面的例子裡面js程式碼居多。參考文章結尾的測試程式碼,不要在意那些拼音或者縮寫的奇醜變數名。

Echo測試結果

測試完整程式碼在文章結尾。

傳送echo測試資料test edit:ddd,結果截圖:

Fiddler抓包和修改WebSocket資料,支援wss
Log中已列印我們的修改日誌資訊,可以看到echo響應中完全包含了被修改後的傳送資料,我特意用不同顏色標記了一下。

Fiddler抓包和修改WebSocket資料,支援wss
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抓包分析和篡改資料,比較土,完.

相關文章