本文轉自:https://blog.csdn.net/china_jeffery/article/details/93000824
本文介紹如何使用Fiddler抓取HTTP和HTTPS協議的包,同時還介紹了如何結合Proxifier工具來處理Filddler無法抓取到包的情況。
一、HTTP基本抓包
Fiddler官網下載安裝:https://www.telerik.com/fiddler
對瀏覽器的抓包,就不再贅述,打開這個軟件就一目了然了,本文主要講對普通Windows桌面應用程序的抓包,點擊左下角的兩個小圖標,讓Fiddler進入抓包狀態,而且作用於[All Processes]。
Fiddler抓包的原理,實際上就是相當於給windows設置了一個HTTP/HTTPS代理,類似於在IE瀏覽器中設置了代理,如
[Internet 選項] — [連接] — [局域網設置] — [高級]中設置代理[127.0.0.1:8888],Fiddler在8888端口提供HTTP/HTTPS代理服務。
二、HTTPS抓包
針對HTTPS的抓包,需要開啟Fiddler的HTTPS抓包功能,否則只能看到HTTP請求的內容,因為HTTPS請求的是密文。
在Fiddler中點擊[Tools] — [Options] — [HTTPS]勾選如下設置:

點擊[Actions] — [Trust Root Certificate] 讓系統信任Fiddler的根證書,這是HTTPS抓包解密的關鍵,接下來就可以愉快的觀看HTTPS請求明文內容了。
三、為什么抓不到有些應用程序的HTTP(s)的包?
開啟 [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作為本地代理,如:
curl_easy_setopt(curl, CURLOPT_PROXY, "127.0.0.1:8888");
- 1
四、處理Fiddler無法抓到包的情況
4.1 設置代理
上面說到了,Fiddler抓包的原理是在本機的8888端口開啟HTTP/HTTPS代理,任何通過Fiddler代理的HTTP/HTTPS通信內容都會被解析,那么只要能給目標程序設置HTTP/HTTPS代理,目標程序的HTTP(s)通訊內容就可以被Fiddler抓到。

仔細查看軟件設置,其實有些第三方軟件比如 [百度網盤] 本身是可以設置HTTP/HTTPS代理的,只要設置為Fiddler的代理端口即可截獲它的HTTP/HTTPS通訊內容。
4.2 結合Proxifier
但是有的第三方軟件就是沒有代理功能,怎么辦?既然應用程序不支持設置代理,我們就借助其它軟件給它設置代理,比如:
Proxifier: https://www.proxifier.com
以 [網易有道詞典] 為例:

在Proxifier中添加[127.0.0.1:8888] 這個Fiddler提供的HTTPS代理服務器
設置Proxifier規則,讓 [網易有道詞典] 通過代理訪問網絡。
有一點設置通常容易被忽略,就是在Proxifier中,設置[Profile] — [Name Resolution] — 勾選 [Resolve hostnames through proxy],讓域名解析的工作交給代理服務器,而不是在Proxifier上解析。默認情況下Proxifier自行解析域名,比如www.baidu.com解析為180.97.33.108,然后發請求給Fiddler:
CONNECT 180.97.33.108:443 HTTP/1.1
- 1
這樣Fiddler並不知道它請求的是哪個域名,於是返回給客戶端的偽造證書時,偽造的是為180.97.33.108頒發的證書,有的客戶端會做校驗,發現這個證書是頒發給180.97.33.108的,而不是頒發給www.baidu.com的,然后報錯處理。
修改Proxifier設置后,把域名解析的工作交給代理服務器,Proxifier會直接向Fiddler發送請求:
CONNECT www.baidu.com:443 HTTP/1.1
- 1
這樣Fiddler就知道客戶端請求的是 www.baidu.com,從而返回客戶端偽造的www.baidu.com證書,客戶端不報錯,Fiddler才能順利抓包解密。
具體設置步驟如下:

4.3 解決Host為“Tunnel to”的問題
按照4.2中介紹的方法,抓取python請求https://www.baidu.com的包,此時在fiddler中會顯示“Tunnel to”,無法獲取到包的內容,如圖:
從python的提示中,可以看到是SSL證書驗證錯誤,所以python requests的請求也失敗了。
Fiddler之所以能抓到並解密HTTPS包的內容,是因為Fiddler使用了中間人攻擊的手段,該手段要能成功實施,有一個前提條件,就是客戶端信任Fiddler提供的根證書,之前我們通過[Actions] — [Trust Root Certificate] 讓系統信任Fiddler的根證書后,大部分瀏覽器以及基於WinInet庫進行HTTP通信的程序,都會信任操作系統中我們添加的Fiddler根證書。但如果第三方程序使用其它HTTP庫進行通信,比如libcurl,JAVA的URLConnection庫,C#的System.Net.Http,Python的requests,這些HTTP庫一般自帶了一套可信任的SSL根證書,它們不使用操作系統自帶的SSL根證書,更不會使用我們向操作系統中添加的Fiddler根證書,於是就驗證出錯了。
以Python為例,這一點可以在requests文檔中得到證實:
https://2.python-requests.org/en/master/user/advanced/#ca-certificates
Requests bundled a set of root CAs that it trusted, sourced from the Mozilla trust store. The certificates were only updated once for each Requests version.
- 1
下面詳細給出解決這種問題的2種方法:
- 在請求時禁用證書驗證。
- 在請求時,指定自己生成的證書。
4.3.1 請求時禁用證書驗證
以python為例:
import requests
requests.get("https://www.baidu.net", verify = False)
- 1
- 2
4.3.2 請求時信任自己的證書
訪問http://127.0.0.1:8888/,下載Fiddler的根證書,如圖:
然后使用第三方工具轉換成對應庫可以支持的證書類型,這里以python的requests為例,使用openssl工具轉換成其支持的.pem格式:
openssl x509 -inform der -in FiddlerRoot.cer -out fiddler.pem
- 1
import requests requests.get("https://www.baidu.net", verify = "./fiddler.pem")
- 1
- 2

