侧边栏壁纸
博主头像
一朵云的博客博主等级

拥抱生活,向阳而生。

  • 累计撰写 67 篇文章
  • 累计创建 25 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

Fiddler 学习纪要(一)-- FiddlerScript 的使用

一朵云
2022-06-02 / 0 评论 / 1 点赞 / 11777 阅读 / 7440 字

背景

  为什么要学习 FiddlerScript ? 学它能帮助我们做什么?

  FiddlerScript 是 Fiddler 抓包工具中的一个拓展功能,是通过 http://JScript.NET 语言写的,能帮助我们丰富 Fiddler UI ,制造网络延时,自动修改 Http Request 和 Response 等等。

目标

  1. 熟悉 fiddler 软件,熟悉 fiddlerscript 语法及常用方法;
  2. 编写一个列来区分数据源来自pc端,或是移动端;
  3. 结合反编译知识,解决fiddler无法查看加密接口数据的问题,并编写成一个属于自己的fiddler插件。

Fiddler 工具介绍

  Fiddler 是用 C# 写出来的,它包含一个简单却功能强大的基于JScript .NET 事件脚本子系统,它的灵活性非常棒,可以支持众多的http调试任务,并且能够使用.net框架语言进行扩展。

  Fiddler 常用于服务端与移动客户端之间,在前后端bug归属问题上起着关键作用。我们还可以利用它制造网络延迟、重放攻击、断点拦截、篡改接口数据等。

FiddlerScript 基本介绍

前言:

  原生的 Fiddler 工具已经为我们提供了十分便捷的功能,但随着工具的深入使用,往往会产生些个性化的需求,例如,抓包时想实时区分数据源是来自pc端,或是手机端的;自动拦截特定接口数据,并替换为指定数据等。此时,我们便可以考虑使用 FiddlerScript 功能来拓展了。

常见方法

FiddlerScript 中的函数方法命名十分形象,我们还是比较好认的,下面将分别讲述其作用范围:

1、OnBeforeRequest

作用于fiddler转发请求前,可用于修改请求参数。

示例演示

  一个查询商品剩余数量的接口,原本询问“是否有1瓶牛奶”,我们通过 FiddlerScript 的函数 OnBeforeRequest 监测,自动修改为“是否有100瓶牛奶”。

if (oSession.url=="81.68.234.171:9990/checkStock?productName=%E7%89%9B%E5%A5%B6&number=1") {
		FiddlerObject.alert("in1!!!");
        oSession.url = "81.68.234.171:9990/checkStock?productName=%E7%89%9B%E5%A5%B6&number=100";
}

注意:

2、OnBeforeResponse

作用于fiddler转发响应前,可用于修改响应参数。

示例演示

  查询商品剩余数量的接口“/checkStock”,直接将该接口的所有响应参数统一改为库存不足。

if (oSession.fullUrl.Contains("81.68.234.171:9990/checkStock")) { 
            FiddlerObject.alert("in2!!!");
            var response = oSession.GetResponseBodyAsString();
            FiddlerObject.log("响应参数:"+response);
            
            //将接口的响应数据转换为可操作的json对象
            var jsonStr = Fiddler.WebFormats.JSON.JsonDecode(response);
            jsonStr.JSONObject["msg"] = "库存不足";
            jsonStr.JSONObject["data"] = false;
            
            var newResponse = Fiddler.WebFormats.JSON.JsonEncode(jsonStr.JSONObject);
            oSession.utilSetResponseBody(newResponse);
        }

3、OnPeekAtRequestHeaders

在客户端发送请求头(Request Header)之后,fiddler 接收到其请求头后进入该处理函数。

示例演示

  前端通常会使用Options预请求一次(跨域预检),我们想忽略Options请求方式。


4、OnPeekAtResponseHeaders

在服务器返回响应头(Response Headers)之后,fiddler 接收到响应头后进入该处理函数,之后将请求头转发给客户端。

示例演示

  忽略捕获大文件流,避免网络阻塞。

if (oSession.ResponseHeaders["Content-Length"] > 102400) {
        oSession.Ignore();
}

至此,上述四个函数的先后顺序,通过打日志的方式可看出,如下图:

image

5、OnExecAction

OnExecAction函数由Fiddler窗口中的QuickExec框调用,或由ExecAction.exe命令行程序执行。
该接口在 fiddler 启动时加载,可基于QuickExec框添加关键字指令。

示例演示

  我想实时检测url中出现了包含addProductStock关键字的链接,并让它加粗展示。

  • 第一步:FiddlerScript 中找到OnExecAction函数,并新增日志FiddlerObject.log(“-------- OnExecAction bold in!”);

image-1665221580236

  • 第二步:QuickExec 输入框输入“bold addProductStock”后,回车

image-1665221622312

  • 第三步:查看log控制台是否打印了“-------- OnExecAction bold in!”。

image-1665222832538

  • 第四步:重新发起个url中带有关键字“addProductStock”的请求,查看行是否加粗展示。

image-1665222933897

6、OnAttach

fiddler 注册成系统代理时调用。

7、OnDetach

fiddler 断开系统代理时调用。

8、OnBoot

与OnExecAction相同,在fiddler启动时会调用,但该OnBoot只会调用一次,且调用顺序也排在首次OnExecAction后面。

9、OnShutdown

在fiddler关闭时调用。

实战练手

  抓包窗口新增一列,用于区分此数据来源于pc端还是说移动端。(基于设备ua来区分)

    public BindUIColumn("设备标识",200)
    
    static function getUserAgent(oSession:Session) {
        
        var ua = oSession.oRequest["User-Agent"].toLowerCase();
       
        FiddlerObject.log("-------- ua === "+ua);
        
        if(new RegExp("android").test(ua)){
            return "安卓手机";
        }else if (new RegExp("iphone").test(ua)){
            return "苹果手机";
        }else if (new RegExp("window").test(ua)){
            return "windows电脑";    
        }else if (new RegExp("mac").test(ua)){
            return "Mac电脑";
        }else{
            return "未知设备";
        }   
    }

image-1665484389330

效果如下:

image-1665484502811

1

评论区