1. 程式人生 > >FiddlerCoreAPI開發(一)源碼分析

FiddlerCoreAPI開發(一)源碼分析

報文 就是 obj pre 一段 int cal ssi write

1.前言

前一段時間想利用fiddlercore截取本地HTTPS的流量做一些分析,按照樣例代碼的註釋學習了一下,沒搞清楚怎麽實現,後來又在網上查了些資料,對HTTPS的處理提及很少,都沒有解決我的問題,主要是HTTPS證書的問題,索性自己研究了一下,終於解決了問題。我會在下篇文章中分享下我的思路,本篇文章先簡單分析下fiddlercore自帶樣例的代碼,幫助剛接觸fiddlercore的人快速入門,如果有說的不對的地方,歡迎批評指正。

2.源碼分析

首先從官網下載FiddlerCoreAPI
https://www.telerik.com/purchase/fiddlercore

下載下來是一個安裝文件,解壓後有demo和FiddlerCoreAPI庫,打開樣例代碼工程,開始分析。

從主函數開始。

List<Fiddler.Session> oAllSessions = new List<Fiddler.Session>();

定義了一個fiddler的Session類的List,裏面存放的是客戶端和服務端的消息。

Fiddler.FiddlerApplication.SetAppDisplayName("FiddlerCoreDemoApp");

命名自己的應用程序。

Fiddler.FiddlerApplication.OnNotification += delegate(object sender, NotificationEventArgs oNEA) { Console.WriteLine("** NotifyUser: " + oNEA.NotifyString); };
Fiddler.FiddlerApplication.Log.OnLogString += delegate(object sender, LogEventArgs oLEA) { Console.WriteLine("** LogString: " + oLEA.LogString); };

這兩句,第一句綁定了用戶通知事件的函數,具體什麽時候觸發沒仔細研究,第二句綁定了FiddlerApplication.Log觸發的事件(FiddlerCore自己的日誌系統),後面打印內容都會用到,總之這兩句就是把內容打印在控制臺上。

Fiddler.FiddlerApplication.BeforeRequest += delegate(Fiddler.Session oS)
{
    // Console.WriteLine("Before request for:\t" + oS.fullUrl);
    oS.bBufferResponse = false;
    Monitor.Enter(oAllSessions);
    oAllSessions.Add(oS);
    Monitor.Exit(oAllSessions);
    
    if ((oS.oRequest.pipeClient.LocalPort == iSecureEndpointPort) && (oS.hostname == sSecureEndpointHostname))
    {
        oS.utilCreateResponseAndBypassServer();
        oS.oResponse.headers.SetStatus(200, "Ok");
        oS.oResponse["Content-Type"] = "text/html; charset=UTF-8";
        oS.oResponse["Cache-Control"] = "private, max-age=0";
        oS.utilSetResponseBody("<html><body>Request for httpS://" + sSecureEndpointHostname + ":" + iSecureEndpointPort.ToString() + " received. Your request was:<br /><plaintext>" + oS.oRequest.headers.ToString());
    }
};

BeforeRequest,顧名思義,就是在客戶端發送請求後攔截之,在此函數中可以獲取甚至修改請求的內容。

oS.fullUrl為請求的URL。

bBufferResponse這個屬性,要設置成true才可以修改服務器響應的內容。

接下來的if判斷,是一個例子,如果你訪問https://localhost:7777,他會攔截你的請求,並構造響應報文返回給你,服務端不會收到該請求。

Fiddler.FiddlerApplication.Startup(iPort, oFCSF);

開啟FiddlerCore在指定端口的監聽。

oSecureEndpoint = FiddlerApplication.CreateProxyEndpoint(iSecureEndpointPort, true, sSecureEndpointHostname);

建立在指定端口的HTTPS的監聽,這個函數下篇文章中還會說到。

至此,這個樣例的主要代碼就分析完了,它實現了簡單的http請求截獲和響應替換,剩余的代碼都是些與用戶的交互,這裏不再贅述。

3.註意

前面代碼執行完後,一定要調用Shutdown()函數關閉FiddlerCore應用,不然會導致瀏覽器還是通過Fiddler代理,上不了網。

Fiddler.FiddlerApplication.Shutdown();

在證書管理器中可以看到FiddlerCore安裝了自己的證書。

技術分享圖片

閱讀樣例代碼的註釋很有幫助,還有FiddlerCore的幫助文檔,裏面各個函數的功能說的很詳細。

FiddlerCoreAPI開發(一)源碼分析