2009-12-07 51 views
7

我想捕獲我的機器的所有傳入HTTP數據包。爲此,我使用了一個WinPcap包裝器SharpPcap。如何使用SharpPcap捕獲HTTP數據包

SharpPcap工作得很好,但它捕獲了TCP數據包,而且這個級別太低而無法達到我想要的水平。有誰知道我怎麼能輕鬆地從所有這些TCP數據包中獲得完整的HTTP請求/響應?

感謝

回答

8

SharpPcap已經能夠以與wireshark相同的方式捕獲數據包(只是在代碼而不是GUI中)。您可以直接解析它們,也可以使用通用.pcap文件格式將它們轉儲到驅動器。

解析捕獲的步驟是:

  • 選擇一個接口
  • 開啓在混雜模式的連接
  • 開始捕獲或者使用一個while循環或事件回調
  • 解析原包你想

如果您正在閱讀.pcap翻鬥類型文件的過程幾乎是同一封除非你打電話給一個離線捕捉閱讀器,不需要選擇一個界面,也不需要設置混雜模式。 SharpPcap支持wireshark,tcpdump和大多數其他Pcap框架所使用的所有標準過濾器。爲了參考這些檢查tcpdump的人。

目前不支持直接解析HTTP,但解析TCP數據包非常容易。

當您收到原始數據包(非解析)做到這一點:

TCPPacket packet = TCPPacket.GetEncapsulated(rawPacket); 

包。Net(SharpPcap的一個單獨和包含的組件)解析器即使通信由VPN,PPoE或PPP封裝,也能夠直接拔出TCP部分。

一旦你有了TCPPacket解析就抓住packet.PayloadBytes爲一個字節數組中的有效載荷,應該包含可以轉換爲正確的文本格式的原始字節的HTTP頭(我不太確定HTTP頭在該級別使用UTF-8或ASCII編碼)。應該有大量免費的工具/庫來解析HTTP標頭。


從TCP提取HTTP數據包:

您需要收集連接的TCP數據包,因爲他們進來,如果數據被分段(大於1500個字節)您需要重新組裝內存中的部件。要發現哪些部分以什麼順序進行,您需要仔細跟蹤序列/確認編號。

這是用SharpPcap完成的一件不平凡的事情,因爲您正在使用堆棧的較低部分並手動重新組裝連接。

Wireshark的對如何在C.

由於做到這一點,現在,SharpPcap不支持TCP有效載荷解析一篇有趣的文章。


如果您正在尋找易於遵循如何使用SharpPcap下載源代碼樹,並期待在包括項目的例子例子。還有一個tutorial for SharpPcap on codeproject

如果您有更多問題和/或想要對項目提出任何功能請求,請隨時在SourceForge項目上發佈。它遠未死亡,並繼續處於積極發展之中。

注意:Chris Morgan是項目主管,我是SharpPcap/Packet.Net的開發人員之一。

更新:代碼項目的教程項目現在是最新的以匹配當前的API。

+0

'GetEncapsulated'等於'Packet.ParsePacket(e.Packet.LinkLayerType,e.Packet.Data);'對嗎? – C4u 2016-07-09 11:51:22

0

我認爲你是接近的解決方案:如果你有從HTTP流量的TCP數據包,你只需要提取TCP負載,以重建HTTP請求/響應。看到這個SO entry在一個可能的方式來做到這一點。

2

將TCP流解碼爲HTTP請求/響應對是非平凡的。像WireShark這樣的工具可以付出相當大的努力。

我爲Ruby寫了一個WireShark包裝器(不是那對你有幫助),但在寫之前我嘗試過使用tshark(命令行版本的WireShark)。這並沒有解決我的問題,但它可能適用於你。這裏是如何:

你捕獲數據包並將它們寫入pcap文件(SharpPcap可能有辦法做到這一點)。在某個點關閉cap文件並開始另一個文件,然後在舊文件上運行帶有HTTP通信過濾器的tshark,並顯示一個標誌,指示您希望以PDML格式輸出。您會發現這是一種XML格式,可以使用System.Xml工具輕鬆解析,該工具包含各種格式的每個HTTP字段的值。您可以編寫C#代碼來生成tshark,並將其StdOut流傳送到XML閱讀器中,以便在數據包出現時從tshark中取出數據包。我不建議使用DOM解析器,因爲大型捕獲文件的PDML輸出可能會很快變得瘋狂。

除非您的要求很複雜(如我的要求),否則這可能是您所需要的。

+0

有趣的是,PDML是一種衆所周知的標準格式或應用程序特定的一次性。 SharpPcap的上限可以通過兩種方式完成:對於低/中等流量,可以實時捕獲/解析數據包;對於高流量捕獲(如ftp傳輸),最好的選擇是將原始上限轉儲到.pcap文件和後處理。 SharpPcap基本上只是一個跨平臺框架,用於在C#應用程序中構建類似Wireshark的捕獲。現在SharpPcap是pcap包裝器,Packet.Net是解析器庫。 – 2012-03-22 23:06:36

+0

您是否將代碼發佈到某處(例如GitHub)?如果是這樣,我想在某個時候看看它。我想看看管理TCP重組步驟需要多少代碼/精力。 – 2012-03-22 23:11:51

+0

我不知道PDML是一個標準還是wirehark特有的東西;無論如何,它很容易處理。 – anelson 2012-03-23 23:38:45