Eric's blog

随笔记录

Fiddler抓包指南:结合Proxifier实现Windows应用抓包

本文简单介绍如何使用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才能顺利抓包解密。

具体设置步骤如下:

参考文档:

  1. Fiddler抓包指南:结合Proxifier工具