Sniffer 實現之二——用 WinPcap 實現 Sniffer

Sniffer 實現之二——用 WinPcap 實現 Sniffer

○、序

  這篇文章寫於1年前,因爲某些原因,沒有把它完成。今天整理一下 shadowstar's home,偶然發現這篇未完的文章。雖是年前的東西,但現在仍沒有過時,對想了解 Sniffer 的朋友應該有所幫助。爸爸說做事情要有始有終,今天是端午節,謹以此文給遠隔千里的親人送一份心意。

一、引言

  上一次介紹了用 Raw Socket 實現 Sniffer 的方法,實現起來比較簡單,但有個缺點就是隻能截獲 IP 層以上的包,數據包頭不含幀信息。對一些特殊的要求就不能滿足了,其中很重要的一條就是不能對 ARP 包進行處理。用 NDIS 驅動程序可以實現對整個以太網包的截獲,但複雜的驅動程序讓好多人望而卻步。沒關係,有現成的東西幹嘛不好好利用呢?在微軟的 DDK 裏提供了一個 Packet 的例子,Packet.sys 可以對網卡進行任意的操作,Packete32.dll 提供給應用程序一個方便的接口,而與驅動程序通訊相關的複雜的內部操作由 DLL 完成,面向應用層的程序員不需要了解這些細節。可惜我按 Packet32.dll 的提供的接口一步一步的做下去,卻總也得不到想要的結果,一抓包就死在那兒不動了。看來它是不想給我幹活了:(還是不想自已寫驅動程序……

  幸運的是有一套 WinPcap 的東東,專門用來在 Win32 平臺下抓包的,可以在 http://winpcap.polito.it 上下載到。而且接口基本上和微軟的 Packet 是一樣的。哈哈,這下好了,原來的代碼還可以用,一試就靈!下面就介紹怎樣利用 WinPcap 直接對網卡進行操作及對接收到的數據進行分析。

二、Windows 系統中的網絡通信結構

1.Windows 系統中的網絡通信結構

CSDN_Dev_Image_2003-6-4845280.jpg

  圖1的上層應用程序包括 IE、Outlook 等各種基於網絡的軟件,網絡驅動協議?TCP/IP、NETBEUI 等各種 Windows 支持的網絡層、傳輸層協議,NDIS 是 Windows 操作系統網絡功能驅動的關鍵部分,下面對 NDIS 進行介紹。

2.NDIS及其特點

  NDIS(Network Driver Interface Specification) 是 Microsoft 和 3Com 公司聯合制定的網絡驅動規範,並提供了大量的操作函數。它爲上層的協議驅動提供服務,屏蔽了下層各種網卡的差別。

  NDIS 向上支持多種網絡協議,比如 TCP/IP、NWLink IPX/SPX、NETBEUI 等,向下支持不同廠家生產的多種網卡。NDIS 還支持多種工作模式,支持多處理器,提供一個完備的 NDIS 庫(Library)。 但庫中所提供的各個函數都是工作在覈心模式下的,用戶不宜直接操作,這就需要尋找另外的接口。

三、WinPcap 簡介

1. WinPcap結構圖

CSDN_Dev_Image_2003-6-4845282.png

2. WinPcap 包括三個部分

  • 第一個模塊NPF(Netgroup Packet Filter),是一個虛擬設備驅動程序文件。它的功能是過濾數據包,並把這些數據包原封不動地傳給用戶態模塊,這個過程中包括了一些操作系統特有的代碼。
  • 第二個模塊packet.dll爲win32平臺提供了一個公共的接口。不同版本的Windows系統都有自己的內核模塊和用戶層模塊。Packet.dll用於解決這些不同。調用Packet.dll的程序可以運行在不同版本的Windows平臺上,而無需重新編譯。
  • 第三個模塊 Wpcap.dll是不依賴於操作系統的。它提供了更加高層、抽象的函數。

3. packet.dll和Wpcap.dll

  • packet.dll直接映射了內核的調用。
  • Wpcap.dll提供了更加友好、功能更加強大的函數調用。

4. WinPcap的優勢

  • 提供了一套標準的抓包接口,與libpcap兼容,可使得原來許多UNIX平臺下的網絡分析工具快速移植過來
    便於開發各種網絡分析工具
  • 充分考慮了各種性能和效率的優化,包括對於NPF內核層次上的過濾器支持
  • 支持內核態的統計模式
  • 提供了發送數據包的能力

四、Packet.dll 的使用

  WinPcap的主頁:http://winpcap.polito.it/你可以到這裏下載它的驅動、DLLs和開發包。這裏只是對WinPcap實現Sniffer做一個簡單的介紹,不做深入研究。你只需要把下載回來的驅動安裝到你的計算機上,用你的程序調用Packet.dll就可以了。Packet.dll在安裝的時候會被拷貝到你的系統目錄下,也可以用WinRAR打開安裝包,可以看到裏面的文件,直接提取你想要的Packet.dll。

  Packet.dll提供了一套完整的、功能強大的API,其接口形式與Microsoft DDK提供的Packet32.dll基本一致。開發過Windows應用程序的人,對調用DLL一定不會莫生,如果你還不知道怎麼使用DLL請參考相關書籍,這裏不多講了。新建一個DLL工程命名爲sniffer2,保存到硬盤。把開發包裏的include、lib目錄拷貝到工程目錄中。如果你用的是Visual C++,可以直接使用lib裏面的引入庫。shadowstar用的是C++Builder,需要用C++Builder提供的implib工具爲Packet.dll生成一個lib文件,命令行如下:

  implib -a packet.lib packet.dll

五、簡單實現

  shadowstar用C++Builder寫了一個簡單的演示程序,這裏只給出主要部分的代碼,完整的代碼可以到http://shadowstar.126.com/下載。

六、結束語

  如果在一個繁忙的網絡上進行截獲,而且不設置任何過濾,那得到的數據包是非常多的,可能在一秒鐘內得到上千的數據包。如果應用程序不進行必要的性能優化,那麼將會大量的丟失數據包,下面就是我對性能的一個優化方案。

  這個方案使用了多線程來處理數據包。在程序中建立一個公共的數據包緩衝池,這個緩衝池是一個LILO的隊列。程序中使用三個線程進行操作:一個線程只進行捕獲操作,它將從驅動程序獲得的數據包添加到數據包隊列的頭部;另一個線程只進行過濾操作,它檢查新到的隊尾的數據包,檢查其是否滿足過濾條件,如果不滿足則將其刪除出隊列;最後一個線程進行數據包處理操作,象根據接收的數據包發送新數據包這樣的工作都由它來進行。上面三個線程中,考慮儘可能少丟失數據包的條件,應該是進行捕獲操作的線程的優先級最高,當然具體問題具體分析,看應用的側重點是什麼了。

2003-06-04 08:03

<script src="../../bottom.js"></script>
發佈了33 篇原創文章 · 獲贊 3 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章