Fiddler抓包和修改WebSocket数据,支持wss
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Fiddler抓包和修改WebSocket数据,⽀持wss
记录⼀下⽤Fiddler对WebSocket收发的数据进⾏抓包分析和篡改数据,只找到这么⼀个⽅法,能⽤就⾏吧。
时间:2019-3-29
环境: win7+Fiddler 5.0
Fiddler抓取WebSocket数据
Fiddler中双击WebSocket Session即可查看此连接收发的数据。
可惜此选项卡内没有带发送数据的功能(⼀个输⼊框(HEX⽂本) + ⼀个按钮),要是有就基本完美了。
开启https⽀持
如果需要抓取https、wss请求,需要在Fiddler菜单Tools>Options>HTTPS 中开启HTTPS⽀持。
在Actions菜单中,设置电脑系统信任Fiddler的根证书。
⼿机简单⽀持
如果需要抓取⼿机中的数据,需要在Tools>Options>Connections中设置允许客户端连接,然后在⼿机wifi连接中设置使⽤电脑的ip和Fiddler监听的端⼝作为代理。
然后⼿机浏览器访问电脑ip+ 端⼝ 进⼊Fiddler页⾯下载根证书,并信任(安装)此证书。
完成以上操作才有可能监控https和wss请求,⼤部分是能监控的。
修改WebSocket数据
在Fiddler界⾯中并未找到修改WebSocket数据的地⽅,搜索也没找到多少直接的资料信息,不过写怎么打印WebSocket数据⽇志的倒蛮多(Fiddler 4.5开始已没有这个必要了)。
另外看到⼀篇利⽤fiddler core api 拦截修改 websocket 数据的。
两个综合⼀下就⼤功告成了。
在Fiddler菜单Rules>Customize Rules中实现Handlers类的OnWebSocketMessage⽅法,此⽅法可以得到WebSocket收发的数据,⽽且可以修改。
另:Fildder主界⾯中FildderScript也可以直接修改脚本代码。
脚本语法
Fiddler采⽤的语法,这个语法不熟?没关系,我也不熟,但对JavaScript和C#任意⼀个熟就⾏了。
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抓包分析和篡改数据,⽐较⼟,完.。