本文简单介绍如何使用Fiddler抓取HTTP和HTTPS协议的包,同时解决了当Windows应用无法使用默认代理时,如何通过Proxifier工具来强制代理实现抓包的问题。
1、HTTP抓包
前往https://www.telerik.com/fiddler,下载Fiddler v5.0
Windows 7无法打开需要安装 Net4.6.1

Fiddler抓包的原理,实际上就是相当于给windows设置了一个HTTP/HTTPS代理,类似于在IE浏览器中设置了代理
首先打开选项确认Fiddler在8888端口提供HTTP/HTTPS代理服务。

进入Windows代理设置,位于[Internet 选项] — [连接] — [局域网设置] — [高级]中设置代理[127.0.0.1:8888]

2、HTTPS抓包
针对HTTPS的抓包,需要开启Fiddler的HTTPS抓包功能,否则只能看到HTTP请求的内容,因为HTTPS请求的是密文。
在Fiddler中点击[Tools] — [Options] — [HTTPS]勾选如下设置:

如果是抓包本机,则点击信用根证书即可:

如果是抓包局域网机器,则需要在Connections里勾选允许远程主机访问:

然后用浏览器打开对应的URL:192.168.1.107:8888,点击下载证书,安装证书的时候,安装到受信任的根证书机构


以上几步完成以后,就可以在Fiddler里看到HTTPS请求的明文内容了
3、针对Windows应用程序进行HTTPS抓包
开启 [All Processes] 抓包后,我们运行第三方程序,会发现有的HTTP/HTTPS包可以抓到,而有的却抓不到,这是怎么回事?那是因为Fiddler的这种设置全局代理的方式,只对以下几种情况有效:
IE、Chrome等浏览器
程序使用Windows提供的WinInet库进行HTTP/HTTPS通信
程序内嵌WebBrowser,比较常用的是IE控件和CEF
例如如果应用程序中使用的是libcurl库进行HTTP(s)请求,则fiddler就抓不到包了(解决方法下面会介绍),因为libcurl没有使用windows的WinInet库,而是自己实现了http(s)协议的封装。
如果有程序源码,可以在源码中设置Libcurl使用fiddler作为本地代理,如:
1 | curl_easy_setopt(curl, CURLOPT_PROXY, "192.168.1.107:8888"); |
如果是第三方程序,又不走系统代理的情况下,要怎么抓包呢?这就需要用到其它软件给它设置代理,比如:Proxifier:https://www.proxifier.com
在Proxifier中添加[192.168.1.107:8888]这个Fiddler提供的HTTPS代理服务器


特别需要注意的是,就是在Proxifier中,设置[Profile] — [Name Resolution] — 勾选 [Resolve hostnames through proxy],让域名解析的工作交给代理服务器,而不是在Proxifier上解析。默认情况下Proxifier自行解析域名,比如 www.baidu.com 解析为 180.97.33.108,然后发请求给Fiddler:
1 | CONNECT 180.97.33.108:443 HTTP/1.1 |
这样Fiddler并不知道它请求的是哪个域名,于是返回给客户端的伪造证书时,伪造的是为 180.97.33.108 颁发的证书,有的客户端会做校验,发现这个证书是颁发给 180.97.33.108 的,而不是颁发给 www.baidu.com 的,然后客户端就会报错。例如Chrome就会出现 NET::ERR_CERT_COMMON_NAME_INVALID
修改Proxifier设置后,把域名解析的工作交给代理服务器,Proxifier会直接向Fiddler发送请求:
1 | CONNECT www.baidu.com:443 HTTP/1.1 |
这样Fiddler就知道客户端请求的是 www.baidu.com,从而返回客户端伪造的 www.baidu.com 证书,客户端不报错,Fiddler才能顺利抓包解密。
具体设置步骤如下:


参考文档: