Fiddler 是一款 HTTP 协议调试代理工具,因为功能强大,交互友好,使用方便,fiddler 已经成为功能测试同学不可或缺的抓包工具。与此同时,fiddler 具备良好的可扩展性,测试同学可以基于 fiddler 提供的接口开发符合自身业务需求的插件。通过 fiddler 插件开发可以实现对 http request 和 response 的自动修改,并且可以定制自己的检查规则对网络请求进行校验。
最近 sdk 业务出于安全性考虑,对部分网络请求进行了加密,以密文形式进行传输。而 sdk 打点数据完整性和正确性校验是业务测试同学的测试重点,密文形式的数据传输极大影响了测试同学的测试进度。因此,笔者临危受命为功能测试同学解决请求加密问题。考虑到功能测试同学平常使用 fiddler 进行抓包校验,因此笔者决定开发一款 fiddler 插件对 sdk 请求进行解密,然后以明文显示在 UI 上,方便测试同学校验。下面,笔者就来唠一唠如何进行 fiddler 插件开发。
工欲善其事必先利其器,着手开发之前,我们需要将开发环境部署好。
网上关于 fiddler 插件开发资料较少。大家可以通过以下方式获取 fiddler 插件开发知识:
在 fiddler 命令行工具中开启 debug 功能
显示错误和异常信息
prefs set fiddler.debug.extensions.showerrors True
显示 log 信息
prefs set fiddler.debug.extensions.verbose True
FiddlerApplication.Log.LogString()
在 visual studio 中创建一个 C# 类库工程
添加 fiddler 引用
设置 Fiddler.RequiredVersion 属性
[assembly: Fiddler.RequiredVersion("4.6.20171.9220")]
fiddler 接口知识
在进一步开发之前,需要明确 fiddler 插件开发的一些规则和特点,算是避坑指南。
2.扩展接口
下面回到正题,业务的需求是需要对 sdk 的加密请求进行解密,并且以明文显示在界面中。所以,笔者需要实现 Inspector2,IRequest2 接口。并且在抽象方法中实现自己的业务逻辑。
主要接口扩展代码如下:
public class Decryption : Inspector2, IRequestInspector2, IBaseInspector2{
private DecryptionViewer myControl; //UI 展示类
private bool m_bDirty;
private bool m_bReadOnly;
private byte[] m_entityBody;
private HTTPRequestHeaders m_Headers;
//构造函数
public Decryption()
{
FiddlerApplication.Log.LogString("in constructor Decryption()");//在log tab中输出log信息
this.myControl=new DecryptionViewer();
}
public bool bDirty
{
get
{
return this.m_bDirty;
}
}
//http 请求body数据
public byte[] body
{
get
{
return this.m_entityBody;
}
set
{
//body数据注入
this.m_entityBody = value;
this.DoDecryption();
}
}
public void DoDecryption()
{
//解密逻辑实现
}
public bool bReadOnly
{
get
{
return this.m_bReadOnly;
}
set
{
this.m_bReadOnly = value;
}
}
//http请求headers数据
public HTTPRequestHeaders headers
{
get
{
return m_Headers;
}
set
{
this.m_Headers = value; //数据注入
}
}
//主要实现UI逻辑
public override void AddToTab(TabPage o)
{
o.Text = "Decryption"; //UI tab显示名称
o.Controls.Add(this.myControl); //将自定义UI界面加入Inspectors中,作为一项tab
o.Controls[0].Dock = DockStyle.Fill;
}
//对数据进行清理
public void Clear()
{
this.m_entityBody = null;
this.myControl.clearText();
}
public override int GetOrder() =>
100;
}
3.运行&调试
自动部署插件
为了避免每次生成.dll 都要拷贝到 Inspectors 文件夹下,可以在 VS 中配置 build 之后的执行动作,自动拷贝.dll 到指定目录。
copy "$(TargetPath)" "XXXXXXXX\fiddler\Fiddler4\Inspectors\$(TargetFilename)"
调试配置
开发者调试的过程可以自动调起 fiddler 进行插件加载。
4.成品
最后上一张插件图,对比解密前后效果。DecryptionFormatJson 对加密请求进行解密,并以 json 格式进行显示。方便功能测试人员进行校验。
更多干货,扫码关注Qtest公众号