Fiddler抓包和修改WebSocket數(shù)據(jù),支持wss

記錄一下用FiddlerWebSocket收發(fā)的數(shù)據(jù)進行抓包分析和篡改數(shù)據(jù),只找到這么一個方法,能用就行吧。
時間:2019-3-29
環(huán)境: win7 + Fiddler 5.0

Fiddler抓取WebSocket數(shù)據(jù)

Fiddler中雙擊WebSocket Session即可查看此連接收發(fā)的數(shù)據(jù)。可惜此選項卡內(nèi)沒有帶發(fā)送數(shù)據(jù)的功能(一個輸入框(HEX文本) + 一個按鈕),要是有就基本完美了。

開啟https支持

如果需要抓取httpswss請求,需要在Fiddler菜單Tools > Options > HTTPS 中開啟HTTPS支持。在Actions菜單中,設(shè)置電腦系統(tǒng)信任Fiddler的根證書。

手機簡單支持

如果需要抓取手機中的數(shù)據(jù),需要在Tools > Options > Connections中設(shè)置允許客戶端連接,然后在手機wifi連接中設(shè)置使用電腦的ipFiddler監(jiān)聽的端口作為代理。

然后手機瀏覽器訪問電腦ip + 端口 進入Fiddler頁面下載根證書,并信任(安裝)此證書。

完成以上操作才有可能監(jiān)控httpswss請求,大部分是能監(jiān)控的。

修改WebSocket數(shù)據(jù)

Fiddler界面中并未找到修改WebSocket數(shù)據(jù)的地方,搜索也沒找到多少直接的資料信息,不過寫怎么打印WebSocket數(shù)據(jù)日志的倒蠻多(Fiddler 4.5開始已沒有這個必要了)。另外看到一篇利用fiddler core api 攔截修改 websocket 數(shù)據(jù)的。兩個綜合一下就大功告成了。

Fiddler菜單Rules > Customize Rules中實現(xiàn)Handlers類的OnWebSocketMessage方法,此方法可以得到WebSocket收發(fā)的數(shù)據(jù),而且可以修改。另:Fildder主界面中FildderScript也可以直接修改腳本代碼。

腳本語法

Fiddler采用的JScript.Net語法,這個語法不熟?沒關(guān)系,我也不熟,但對JavaScriptC#任意一個熟就行了。

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

簡單點,把JScript當(dāng)做IE 6來寫就ojbk了,絕對的原味,反正下面的例子里面js代碼居多。參考文章結(jié)尾的測試代碼,不要在意那些拼音或者縮寫的奇丑變量名。

Echo測試結(jié)果

測試完整代碼在文章結(jié)尾。

發(fā)送echo測試數(shù)據(jù)test edit:ddd,結(jié)果截圖:


Log中已打印我們的修改日志信息,可以看到echo響應(yīng)中完全包含了被修改后的發(fā)送數(shù)據(jù),我特意用不同顏色標記了一下。


Fiddler自己的WebSocket記錄信息,它記錄的為我們修改之后的。

WebSocket發(fā)送數(shù)據(jù)

沒找到方法,不知道怎么用Fiddler來發(fā)送WebSocket數(shù)據(jù),參考第一節(jié)中的遺憾。

附:測試代碼

class Handlers
{
    //實現(xiàn)此方法,攔截處理數(shù)據(jù)
    static function OnWebSocketMessage(oMsg: WebSocketMessage) {
        var arr=oMsg.PayloadAsBytes();
        var bs=Utilities.ByteArrayToString(arr);
        var txt=bytesToViewText(arr);//此文本為英文,可讀的文本信息,不可讀的亂碼、中文都過濾掉了
        var newTxt="";
        
        //假設(shè)的修改場景,只要收發(fā)的數(shù)據(jù)中包含了 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的方法,應(yīng)該是沒有公開
        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");
    }
    
    //以下為一些功能函數(shù)
    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抓包分析和篡改數(shù)據(jù),比較土,完.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容