当前问题:

  在我们日常的Web/App测试过程中, Fiddler是一大辅助利器;在我们团队,也经常使用Fiddler进行App抓包测试。

  艺龙 App使用的REST(内部称为Mapi)接口,在使用过程中有如下特点:

    1、接口请求入参;不论是GET还是POST接口;为保证隐私及数据安全,其入参均会经过一次AES加密;然后做一次Encode处理;

      比如:

      

      好吧,不经过解密,我也不知道req参数中又臭又长的到底是什么鬼;

    2、接口响应,一般是经过Gzip或lzss压缩的;

  这就导致在使用Fiddler辅助测试的时候,无法查看请求参数以及响应内容;总是返回一堆乱码; 使用起来极为不便;

  按之前的做法,如要查看出入参,一般通过App端Debug工具查看,或通过Mapi的日志;

  而要在Fiddler中查看响应内容,按我们以前的做法需分三步:

    1、将Response Body保存到本地,并以 .gz作为文件后缀;

    2、解压该gz文件;

    3、用文本工具打开;

  操作繁琐,效率低下;

  为解决以上问题;提高测试效率,并充分利用Fiddler的强大功能;我们开发了一个Fiddler插件;使用该插件,则可在Fiddler中直接查看解密后的入参请求以及响应内容;相比上文中所述的一些测试方法要更加便捷。

  

  目前已实现功能为:

    1. 同时支持GET或POST类型Mapi请求入参及响应内容的查看;

    2. 出入参格式化输出;

    3. 文本查找、保存(Gzip、文本)功能

 

一、先说一下使用方法:

  1、将2个Dll拷贝到Fiddler安装目录中的Inspectors文件夹下;

  2、重新打开Fiddler;设置手机代理

  3、然后按如下图方式查看即可(可以看出Inspectors标签下,多出两个子标签“查看Mapi入参”及“查看Mapi响应”,狠狠点击这2个标签,就能看到格式化之后的响应内容)    

  

二、踩坑过程

  0)先来说下Fiddler中对Gzip自带的解压功能;

    对于普通HTTP请求,如果它的Response Header中,带有Content-Encoding: gzip 时,在Fiddler中是支持解压查看response内容的;这时Fiddler中一般会出现这样一个按钮 ;

    

    我们只需要点击它就可以查看解压后的响应内容;

    

哟~,Niubility !!! So,既然Fiddler已经这么D炸天,而且大部分Mapi响应也是Gzip压缩的,为什么我们还要再搞个插件,多此一举?

让我们回头看下Mapi,看看它的坑爹之处;

以获取点评接口为例,我们先看一下它的Response的Header:

    

细心的你可能已经看到了;它的header中没有 Content-Encoding: gzip 这一项!!!

这样Fiddler就犯二了;它就不会给你自动解压Gzip流内容;我们在TextView或Raw面板中查看时仍就会看到一堆乱码;

    

    根据这个原理,让老夫先做如下尝试

  1)在Response的Header中,自动添加Content-Encoding: gzip

如何在Response中添加Header呢,让开发来改,先醒醒吧;等开发改完,花儿都要谢了;

是时候请出来我们的FiddlerScript了;对,又是它;上回测HTTPS替换任务时也是它;

我们在OnBeforeResponse方法中,添加如下代码;然后用手机代理访问Elong App;

ps:从该方法名也可知晓,它是在响应返回给Fiddler,被Fiddler截获,但还未返回给代理客户端时,进行一系列的篡改处理过程;

从下图中我们可以看到,Response Header中已经添加了Content-Encoding: gzip 这一项;而且熟悉的Decode按钮也回来了;

  点击中间那条长长的Decode按钮;切换到TextView标签 ;果然,已经可以看到返回的响应内容了;

 

So Easy ~~~ 鼓掌!撒花!

But,我们回头瞧一眼手机,Whats the F*****K ;

原来App端对于Header中加了Content-Encoding: gzip的响应在处理时发生了异常;别拦着我,让我先哭一会儿~~~

 

2)插件开发;Fiddler扩展的瑞士军刀

做为即将34岁,快要被淘汰劝退的老年人来讲;我们还得想想别的办法,尽量发挥一下余热;

既然连FiddlerScript这个以前无往不胜的Geek功能都搞不定;只好再深一步;请出终极武器---Fiddler插件来了;

先去官方的插件库里找了一下;没有针对该场景的插件,看来我们的需求也是有点奇葩的;

在面对绝境时,人民币上的老爷子教导我们 - - - 自己动手,丰衣足食!

先打开Fiddler二次开发官网,打开VSCode,回想一下三年没敲过的C#;

然后飞速敲下一行惊天地泣鬼神的经典代码:

Console.WriteLine("Hello World!");

 

废话这么多,是时候给出来我们的解决方案了;

入参查看实现方式:

    1. 对于GET类型,利用Fiddler Api 获取Get中URL;解析出Request参数;

    2. POST类型Api;截获Body数据;

    3. 从Header中获取clienttype和appversion;

    4. 对1和2 中获取的参数,做一次Decode处理;

    5. 调用内部Husky中http://192.168.14.206:8206/husky/system/aes中的AES解密接口; 利用1、2、3中获取的数据进行参数拼接;获取解密后的数据;

     主要代码如下:

  注:

1、 查看Mapi入参功能,只能在内网使用;因为调用了内部Husky的AES解密 接口;

2、 使用接口解密而不是算法解密的原因是:算法解密需要配置密钥,维护略有些麻烦;

另外,内网的接口解密速度较快;且只有在查看入参这个Tab时,才会调用一次;不激活不调用;且对于非Mapi请求也不会调用。

  查看接口响应的实现方法:

  1. 获取Response Body数据;并实现Gzip流读取方法;使用到了.Net的GZipStream类,返回解压后的真实文本内容

  2. 实现Json格式化功能,使用到Newtonsoft.Json类库

  Fiddler插件的实现方法:

1、实现该插件需要继承Inspector2基类和IRequestInspector2、IResponseInspector2接口;覆写或实现其中的一些关键方法;

继承和实现IRequestInspector2接口,可在Fiddler处理请求过程中的一些入参、Header的修改及查看;

而继承和实现IResponseInspector2接口,可在Fiddler处理响应过程中,对响应内容、响应Header的修改及查看;

2、需要实现一个自定义控件;作为插件集成到Fiddler窗体中;用于展示解密后的请求入参,以及解压后Response内容;

 

补充说明:

Fiddler是支持4种扩展开发方式;本插件使用的是第2种;

1 IFiddlerExtension,IAutoTamper,IAutoTamper2,IAutoTamper3

      1、这几个接口都是面向一个全局的插件,

      2、插件出现的位置和Log,TimeLine同级

      3、插件编译成dll只能放到 Scripts文件夹下

2 Inspector2,IResponseInspector2,IRequestInspector2

      1、这几个接口是面向于单独一个连接

      2、插件会出现Inspector这个菜单下 和 Headers,TextView 同级

      3、插件编译成dll只能放到 Inspectors 文件夹下

3 IHandleExecAction 这个接口可以让你的控件接收到命令行传来的命令,这个接口

4 ISessionExporter,ISessionImporter

      1、顾名思义 批量对请求经行导入导出操作。例如批量导出为txt之类的

      2、位置出现在右键菜单Save-Selectd Session-中 和File-ImportSession 弹出的菜单中

      3、dll需要放到ImportExport中

  参考资料:

官方文档:

http://docs.telerik.com/fiddler/Extend-Fiddler/ExtendWithDotNet

GitHub上一些插件源码:

https://github.com/jessemcdowell/FiddlerMessagePackViewer

https://github.com/waf/WCF-Binary-Message-Inspector

Fiddler插件 --- 解密Elong Mapi请求参数及响应内容的更多相关文章

  1. 【C#】WebApi 添加过滤器,实现对请求参数和响应内容的日志记录

    filter的介绍 filter在Web API中经常会用到,主要用于记录日志,安全验证,全局错误处理等:Web API提供两种过滤器的基本类型:actionfilterattribute,excep ...

  2. WebApi中对请求参数和响应内容进行URL编码解码

    项目经测试,发现从IE提交的数据,汉字会变成乱码,实验了网上很多网友说的给ajax加上contentType:"application/x-www-form-urlencoded; char ...

  3. SpringMVC请求参数和响应结果全局加密和解密

    前提 前段时间在做一个对外的网关项目,涉及到加密和解密模块,这里详细分析解决方案和适用的场景.为了模拟真实的交互场景,先定制一下整个交互流程.第三方传输(包括请求和响应)数据报文包括三个部分: 1.t ...

  4. springboot springmvc拦截器 拦截POST、PUT、DELETE请求参数和响应数据,并记录操作日志

    1.操作日志实体类 @Document(collection = "operation_log") @Getter @Setter @ToString public class O ...

  5. spring boot使用@Aspect记录日志(请求参数,响应结果)

  6. Fiddler插件---将Mapi请求自动转为HTTPRunner测试用例(YAML格式)

    背景 继之前鼓捣出了Mapi解密插件之后,在团队内已经使用了三年之久,一跃成为团队最爱欢迎的测试工具之一(加个之一,低调谦虚一点). 随着团队推行HttpRunner搞接口自动化:编写和维护Case带 ...

  7. [Java] 两种发起POST请求方法,并接收返回的响应内容的处理方式

    1.利用apache提供的commons-httpclient-3.0.jar包 代码如下: /** * 利用HttpClient发起POST请求,并接收返回的响应内容 * * @param url ...

  8. java中两种发起POST请求,并接收返回的响应内容的方式  (转)

    http://xyz168000.blog.163.com/blog/static/21032308201162293625569/ 2.利用java自带的java.net.*包下提供的工具类 代码如 ...

  9. python接口自动化26-参数关联和JSESSIONID(上个接口返回数据作为下个接口请求参数)

    前言 参数关联是接口测试和性能测试最为重要的一个步骤,很多接口的请求参数是动态的,并且需要从上一个接口的返回值里面取出来,一般只能用一次就失效了. 最常见的案例就是网站的登录案例,很多网站的登录并不仅 ...

随机推荐

  1. 老李分享:SSL协议相关证书

    老李分享:SSL协议相关证书   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9088214 ...

  2. 老李分享:Web Services 架构 2

    服务传输层 这一层负责应用之间的消息传输.目前,该层包括了超文本传输协议(HTTP).简单邮件传输协议(SMTP).文件传输协议(FTP).以及一些新兴协议,比如块可扩展交换协议(BEEP). XML ...

  3. GEF开发eclipse插件,多页编辑器实现delete功能

    基于GEF开发,多页签编辑器实现 有两种方案: 方案一 继承FormEditor或MultiPageEditorPart,在其中嵌入自定义的继承自GraphicalEditor的子类的编辑器(作为一个 ...

  4. Python可视化学习(2):Matplotlib快速绘图基础

    Matplotlib将大部分的绘图对象都封装成为对象,故理论上所有的图表元素(如Line2D, Text,Label等)都是对象,都可以将其在图表中提取出来并配置实例的属性.同时,Matplotlib ...

  5. 倒排索引的AND操作

    这是一道来自百度的面试题.倒排索引的AND操作. 倒排索引是以关键词作为索引项来索引文档的一种机制,如图中Brutus.Calpurnia.Caesar为关键词,2.4.8等等为文档ID. 现在有一个 ...

  6. 由if-else,switch代替方案引起的思考

    关键词:条件判断,多态,策略模式,哈希表,字典map 笔者在用python实现事件驱动后,发现python是没有提供switch语句,python官方推荐多用字典来代替switch来实现,这让我就觉得 ...

  7. Webdriver API之操作(二)

    一.窗口截图 dirver.get_screenshot_as_file("D:\\report\\image\\xxx.jpg") 二.关闭窗口 dirver.close() # ...

  8. Apache2.4.23+PHP5.6.30+MySQL5.7.18安装教程

    最近在工作中常常接触到PHP,自己也写过一些简单的PHP页面.我们知道PHP是在服务器端运行的脚本语言,因此我们需要配置服务器环境.之前为了省事直接使用的是wamp集成环境,但是突然某一天领导要求我们 ...

  9. 使用 ItextSharp HTML生成Pdf(C#)

    以前生成pdf的时候.因为生成的pdf数据是固定的,所以先做好pdf模板,动态的数据可以先用占位符 生成的时候.找到占位符坐标.把数据填充进去 优点:先做好模板.生成的pdf 表格.文.内容会好看一些 ...

  10. AspNet.OData 协议概述

    1. 什么是OData? OData 全称 Open Data Protocol,字面理解为开放数据协议,是一个基于Http协议且API实现为Restful风格的协议标准,目前由微软支持大力推广,你可 ...