背景:app上報計數時,上報的參數加密了。fiddler抓包只能看到加密後的文件。每次都要從客戶端log裏才能看到報數。爲了解決這個問題,在fiddler腳本文件中對計數請求的參數進行解密,這樣,fiddler抓包就能看到明文的log了。
當然,前提是要知道加密的規則。
編寫腳本前提:
1、安裝fiddler;
2、安裝fiddler的fiddler script插件(fiddlersyntaxsetup.exe);
http://www.telerik.com/docs/default-source/fiddler/addons/fiddlersyntaxsetup.exe
注:這個是有語法提示的,並且有語法錯誤時保存時會報錯,對編寫fiddler腳本有很大的幫助。
編寫腳本:
在CustomRules.js文件的class中添加解碼函數。放在OnBeforeRequest方法外面。一定注意加“public static”。
public static function decodeDT(str){ var decrypt_str=' !_#$%&\'()*+,-.ABCDEFGHIJKLMNOP?@/0123456789:;<=>QRSTUVWXYZ[\\]^"`nopqrstuvwxyzabcdefghijklm{|}~'; var new_str = ""; for(var i=0; i<str.length; i++) { var ch = str[i]; if(ch >= 32 && ch <= 126){ new_str += decrypt_str[int(ch)-32]; } else{ new_str += ch; } } return new_str; }
- 在OnBeforeRequest方法中處理url請求:
- 獲取url的路徑和參數
- 拆分路徑和參數
- 獲取單個參數
- 單個參數值解密
- 拼接參數和請求路徑
- 替換url的請求參數和路徑
代碼如下:
//參數解碼
if(oSession.uriContains("xxx.com")){
oSession["ui-color"] = "blue";
var qstr = oSession.PathAndQuery.Split('?');
var qpath = qstr[0];
var qarg = qstr[1];
//FiddlerObject.alert(qstr[0]);
//FiddlerObject.alert(qstr[1]);
var args = qarg.Split('&');
var enc = args[0].Split('=')[1];
var appkey = args[1].Split('=')[1];
var ltype = args[2].Split('=')[1];
var log = args[3].Split('=')[1];
//FiddlerObject.alert(enc);
//FiddlerObject.alert(appkey);
//FiddlerObject.alert(ltype);
//FiddlerObject.alert(log);
ltype = decodeDT(ltype);
log = decodeDT(log);
log = log.Replace("%D1", ",");
log = log.Replace("%I0", "{");
log = log.Replace("%DD", "_");
log = log.Replace("%I2", "}");
log = log.Replace("%DB", " ");
log = log.Replace("%D4", "A");
log = log.Replace("%E3", "P");
//FiddlerObject.alert(ltype);
//FiddlerObject.alert(log);
args[0] = 'enc=' + enc;
args[1] = 'appkey=' + appkey;
args[2] = 'ltype=' + ltype;
args[3] = 'log=' + log;
qarg = args.join('&');
//FiddlerObject.alert(qarg);
qstr = [qpath,qarg].join('?');
//FiddlerObject.alert(qstr);
oSession.PathAndQuery = qstr;
}
編寫過程中遇到的問題:
自定義函數放在哪裏?
放在OnBeforeRequest方法外面。一定注意加“public static”。否則會報錯。獲取字符的ascii碼值不能直接用js的charCodeAt()去獲取。
可能因爲Fiddler本身是C#寫的:js中字符獲取ascii碼值直接取int()就行,不需要單獨獲取;函數定義時,要加public static;js中對象獲取方法和屬性是用的是C#的System對象。