FIddler : CustomRules.js脚本解析get请求被加密的参数

来源:互联网 发布:数据挖掘 常用模型 编辑:程序博客网 时间:2024/05/18 22:17

背景: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的请求参数和路径
      代码如下:
//dt报数参数解码            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对象。

0 0