FIddler : CustomRules.js腳本解析get請求被加密的參數

背景: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腳本有很大的幫助。

編寫腳本:

  1. 在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;
        }
  2. 在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;

            }

編寫過程中遇到的問題:

  1. 自定義函數放在哪裏?
    放在OnBeforeRequest方法外面。一定注意加“public static”。否則會報錯。

  2. 獲取字符的ascii碼值不能直接用js的charCodeAt()去獲取。

可能因爲Fiddler本身是C#寫的:js中字符獲取ascii碼值直接取int()就行,不需要單獨獲取;函數定義時,要加public static;js中對象獲取方法和屬性是用的是C#的System對象。

發佈了104 篇原創文章 · 獲贊 26 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章