360Qtest团队 教你玩转 Fiddler 插件开发

willys · 2017年09月07日 · 最后由 小啄 回复于 2021年09月15日 · 6420 次阅读

前言

Fiddler 是一款 HTTP 协议调试代理工具,因为功能强大,交互友好,使用方便,fiddler 已经成为功能测试同学不可或缺的抓包工具。与此同时,fiddler 具备良好的可扩展性,测试同学可以基于 fiddler 提供的接口开发符合自身业务需求的插件。通过 fiddler 插件开发可以实现对 http request 和 response 的自动修改,并且可以定制自己的检查规则对网络请求进行校验。

最近 sdk 业务出于安全性考虑,对部分网络请求进行了加密,以密文形式进行传输。而 sdk 打点数据完整性和正确性校验是业务测试同学的测试重点,密文形式的数据传输极大影响了测试同学的测试进度。因此,笔者临危受命为功能测试同学解决请求加密问题。考虑到功能测试同学平常使用 fiddler 进行抓包校验,因此笔者决定开发一款 fiddler 插件对 sdk 请求进行解密,然后以明文显示在 UI 上,方便测试同学校验。下面,笔者就来唠一唠如何进行 fiddler 插件开发。

环境准备

工欲善其事必先利其器,着手开发之前,我们需要将开发环境部署好。

  • .net framework
    • 本文安装使用的是.net framework v4.5.2
  • visual studio
    • fiddler 官方推荐 visual studio 2010 以上版本
    • 本文使用 visual studio 2015
  • fiddler 安装
    • 本文安装了 fiddler4

开发宝典

网上关于 fiddler 插件开发资料较少。大家可以通过以下方式获取 fiddler 插件开发知识:

  • 开发者文档
    • fiddler 的官网文档
    • 官网提供了较全面的 fiddler 插件开发步骤和相应的 api 知识。
  • 开源项目
    • 大家可以在 github 上通过 fiddler 等关键字搜索优秀的开源项目,学习前人的插件开发经验。
  • 官方插件
    • 反编译 fiddler 自带的插件(.dll)文件。
    • 笔者使用的是:.net reflector反编译软件
    • 例如,在 fiddler 中查看 Inspectors 对应的插件。选中 Inspectors 中任意一个 tab,然后右键点击 “inspector properties",查看 inspector 对应的插件。
    • 使用 reflector 反编译 standard.dll 文件,可以了解 fiddler 提供的接口更详细的信息。

开启 fiddler debug 功能

  • 在 fiddler 命令行工具中开启 debug 功能

  • 显示错误和异常信息

    prefs set fiddler.debug.extensions.showerrors True

  • 显示 log 信息

    prefs set fiddler.debug.extensions.verbose True

    • 开启 log 显示后,开发者输出的 log 信息显示在 fiddler 右侧的 log tab 的界面中。
    • 开发者可以使用如下接口显示日志信息: FiddlerApplication.Log.LogString()

新建 C# 工程

  1. 在 visual studio 中创建一个 C# 类库工程

    • 选择 C# 类型项目
      • fiddler 自身基于 C# 进行开发
    • 选择类库
      • 插件以.dll 形式进行加载
  2. 添加 fiddler 引用

    • 为项目添加引用
    • 选择 fiddler.exe
      添加 fiddler 引用,为插件开发提供库函数支持和接口 api。
  3. 设置 Fiddler.RequiredVersion 属性

    • 在 AssemblyInfo.cs 文件中添加 fiddler 要求的版本号 [assembly: Fiddler.RequiredVersion("4.6.20171.9220")]
    • 具体的版本号,视本地安装 fiddler 版本而定。

构建插件

  1. fiddler 接口知识

    在进一步开发之前,需要明确 fiddler 插件开发的一些规则和特点,算是避坑指南。

    • 接口分类
      • fiddler 提供的接口有多种类别,例如 IFiddlerExtension,IAutoTamper,Inspector2,IHandleExecAction 等。开发者应该根据具体的业务需求,在插件中实现不同的接口逻辑。
      • IFiddlerExtension:该接口在 fiddler 启动时便会调用。
      • IAutoTamper: 对于每个 http request 和 response 都会自动调用该接口。
      • Inspector2: 当用户选中某一个网络请求,触发该接口逻辑处理。
      • IHandleExecAction:用户在 QuickExec 输入命令时,会触发该接口执行。
    • 插件存放位置
      • fiddler 不同类型的插件存放在不同的位置。
      • IFiddlerExtension、IAutoTamper 接口扩展插件主要存放在 fiddler 安装目录的 Scripts 文件夹下。
      • Inspector2 接口扩展插件主要存放在 fiddler 安装目录 Inspectors 文件夹下。

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;
}
  • body 数据和 header 数据在 body、headers 函数中接口会自动注入。
  • Inspectors2 接口需要用户实现 UI 逻辑,开发者可以定制自己的 UI 显示:
    • 选中项目-->右键-->添加-->用户控件。
    • 选中用户控件,在控件中实现 UI 逻辑。
    • 用户实现了自身业务逻辑,基本上完成了 fiddler 插件开发。
    • 项目工程见 github 地址:https://github.com/willysys/SDKDecryption.git

3.运行&调试

  • 自动部署插件
    为了避免每次生成.dll 都要拷贝到 Inspectors 文件夹下,可以在 VS 中配置 build 之后的执行动作,自动拷贝.dll 到指定目录。
    copy "$(TargetPath)" "XXXXXXXX\fiddler\Fiddler4\Inspectors\$(TargetFilename)"

  • 调试配置
    开发者调试的过程可以自动调起 fiddler 进行插件加载。

4.成品

最后上一张插件图,对比解密前后效果。DecryptionFormatJson 对加密请求进行解密,并以 json 格式进行显示。方便功能测试人员进行校验。

写在最后

  • 业务测试中,在 fiddler 不能满足业务需求的情况下,或者需要对数据包进行自动校验和 mock,可以定制有特殊业务需求的 fiddler 插件。
  • 各位测试同学,如果你的业务也有这样的需求,赶紧动手吧~~

更多干货,扫码关注Qtest公众号

Qtest公众号|center

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 10 条回复 时间 点赞

移动端业务经常要测试请求字段 request 和 response 的完整性、准确性,对于一些产品中需要 RSA、BASEB4、MD5 加密的项目,在抓包的时候会增加测试人员的使用成本,fiddler 插件可以说是个灵活实用的方法

如果没广告 就加精了 不过代理方案最好用跨平台的

谢谢,思寒的建议。
哈哈哈,顺带推广了一下公众号。
自动化测试中代理方案是跨平台的。功能测试同学平常主要使用 fiddler 抓包,所以开发了 fiddler 插件对加密请求进行解密,方便测试同学进行打点校验。

期待后面的关于 fiddler 的插件开发的分享

哈哈,如果又了 新的收货,会及时分享的。

最近刚好做了一个类似的解密插件,本来想分享下,没想到已经有了。😂

雨夜狂奔 回复

欢迎分享啊

平常也在用 fiddler 抓包,想知道 fiddler 有没有那种读取本地文件的一条数据和发出请求的参数做对比的功能。

zhanglimin 回复

fiddler 插件可以做的

插件开发的代码中快捷键如何设置

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册