Fiddler抓包工具

909 阅读5分钟

Fiddler是一款免费的windows系统的抓包工具,可以将网络传输发送与接受的数据包进行截获、重发、编辑、转存等操作。我是在项目中需要代理项目的前端打包文件时接触到的,目前都在使用,为了防止忘记了一些功能,还是记录下来。

一、下载安装

www.telerik.com/download/fi…

官网下载的话要翻墙,还是在国内找资源吧,还是很多地方都有链接的!

二、原理

Fiddler是位于客户端和服务器端之间的HTTP代理, 它能够记录客户端和服务器之间的所有 HTTP(S)请求,可以针对特定的HTTP(S)请求,分析网络传输的数据,还可以设置断点、修改请求的数据和服务器返回的数据

Fiddler在浏览器与服务器之间建立一个代理服务器,Fiddler工作于七层中的应用层,能够捕获通过的HTTP(S)请求。Fiddler启动后会自动将代理服务器设置成本机,默认端口为8888。Fiddler不仅能记录PC上浏览器的网络请求数据,还可以记录同一网络中的其他设备的HTTP(S)请求数据。数据传递流程大致如下:

三、Fiddler抓取HTTPS原理

现在APP中的数据传输基本上都使用HTTS传输,传输的数据都是经过加密的,这增加了我们分析数据包的难度,还好Fiddler除了可以抓取HTTP数据包,还可以抓取HTTPS数据包。由于HTTPS传输需要使用到CA证书,所以抓取抓取HTTPS数据包时需要做一些特殊配置。Fiddler截取HTTPS报文的流程大致如下:

1) 客户端请求建立HTTPS链接,发送客户端支持的加密协议及版本列表等信息给服务器端
2) Fiddler接受客户端请求并伪装成客户端向WEB服务器发送相同的请求
3) WEB服务器收到Fiddler的请求以后,从请求中筛选合适的加密协议并返回服务器CA证书,证书中包括公钥信息
4) Fiddler收到WEB服务器的响应后保存服务器证书并自签名一个CA证书,伪装成服务器,把该证书下发给客户端
5) 客户端验证证书合法性Fiddler能否抓取到HTTPS报文关键看这一步)
6) 客户端生产对称密钥,通过证书的公钥加密发送给服务器
7) Fiddler拦截客户端的请求以后,使用私钥解密该报文,获取对称加密秘钥,并使用服务器证书中带的公钥加密该对称密钥发送给WEB服务器此时对称密钥已经泄露了,以后可以使用该秘钥界面客户端和服务器端传输的数据
8) WEB服务器接收到客户端发送的加密的对称密钥后使用私钥解密,并使用对称密钥加密测试数据传给客户端
9) Fiddler使用前面获取的对称密钥解密报文
10) 客户端验证数据无误以后HTTPS连接就建立完成,客户端开始向服务器发送使用对称密钥加密的业务数据
11) Fiddler使用前面获取的对称密钥解密客户端发送的数据并重新加密转发给客户端
  • 设置解密HTTPS的网络数据

解密HTTPS需要手动开启,依次点击:

  1. Tools –> Fiddler Options –> HTTPS

  1. 勾选Decrypt HTTPS Traffic

  1. 点击OK

四、Fiddler界面介绍

www.cnblogs.com/csmashang/p…

五、设置代理

右边栏的AutoResponder允许你拦截指定规则的求情,并返回本地资源或Fiddler资源,从而代替服务器响应。你可以理解成用本地的文件替换请求下来的文件,然后在浏览器中执行,其实对网站没有任何副作用,只不过我们自己骗自己罢了!我们就是用这个来调试、预览,保证和线上一致后,就可以发布迭代。

  • 1、精确匹配 EXACT:

这个场景就是我们已经明确要代理哪个文件,换句话说,就是已经知道需要本地哪个文件替换网站哪个文件,使用EXACT模式,也就是精确匹配模式。

  • 2、正则匹配 regex:

比如需要将某个网站里的图片都匹配出来替换成我们自己的图片

regex:.+.(jpg | gif | bmp ) $

  • 3、正则匹配出来的值,想在替换的链接中使用

比如我们使用umiJs开发,打包文件有js、css、gif、jpg、png...,我们不可能一个一个的写他们的规则,直接把它们的后缀匹配上去不是万事大吉吗,说干就干:

regex:(?inx)^https.*(/myCom).*\.(?<name>.*)$
*redir:http://192.168.1.1:8080/${name}

  • 注意:具体正则怎么写,还是要跟你的使用场景有关,这只是一个思路

六、解决一些代理后跨域

在使用fiddler之后,有的资源会出现跨域的情况,我们需要针对这类资源设置响应头

  • 1、从工具栏菜单的 Rules->Customize Rules 进入

  • 2、使指定URL支持CORS跨域请求

支持 CORS 跨域,就是要为请求的返回头增加 Access-Control-Allow-Origin 属性,因此需要修改 OnBeforeResponse函数,在该函数的末尾添加 CORS 逻辑, 代码:

static function OnBeforeResponse(oSession: Session) {
    ...

    if(oSession.uriContains("要处理的url")){
        oSession.oResponse["Access-Control-Allow-Origin"] =  "*";
        oSession.oResponse["Access-Control-Allow-Credentials"] = true;
    }
}

上面修改代码意思就是,如果资源中包含要处理的url(可以填写域名),就设置响应头为 * ,就不会跨域了。

参考文献

上面都是我使用到的功能,fiddler功能远不止这些,其他功能及介绍可参考以下文献: