天天看點

WinPcap 中文技術文檔(4.1.2) 第四章

1.  WinPcap核心資料

1.1.  較長的描述

這部分指南從最底層的子產品開始,描述了WinPcap的核心結構與接口。這部分内容的适合那些想要擴充或修改本軟體的人,或者是那些對WinPcap的工作原理感興趣的人。是以,那些隻希望在他們的軟體中,使用WinPcap的開發人員,不需要閱讀此部分的内容。

1.2.  WinPcap 結構

引用WinPcap首頁上的一段内容:

WinPcap是一個Win32平台的,用于捕獲資料包和進行網絡分析的體系結構。它包括了一個核心級的資料包過濾器,一個低層動态連結庫(packet.dll),一個高層的且依賴于系統的庫(wpcap.dll)。

為什麼我們使用術語“體系結構”而不是“庫”呢?因為資料捕獲是一個低層的行為,它需要和網絡擴充卡,及作業系統的資訊交換,特别是網絡的實作。是以,一個簡單的庫是實作不了的。

以下結構顯示了WinPcap的不同的元件:

首先,捕獲系統需要占用作業系統的協定棧來通路通過網絡的原始資料。這就需要有部分内容要運作在作業系統核心中,可以直接通路網絡接口驅動。這部分内容非常依賴于系統,在我們的解決方案中,它被認為是裝置驅動,稱為Netgroup Packet Filter(NPF);我們為Windows 95,Windows98,Windows ME, Windows NT 4, Windows 2000 和 Windows XP提供了不同版本的驅動。這些驅動都提供了相同的基本功能,比如資料捕獲和發送,也提供了一些進階功能,比如可程式設計的過濾系統和一個監聽引擎,前者可以被用來擷取過濾後的資料流(比如,可以從指定的端口,僅捕獲ftp資料流),後者提供了一個強大的,但很簡單的方式來擷取資料流的統計資訊。(比如擷取網絡流量或者兩個主機間交換資料的總大小)。

其次,捕獲系統必須輸出一個端口,以便使用者級應用程式利用核心驅動所提供的特性。WinPcap提供了兩個不同的庫:packet.dll 和 wpcap.dll。

第一個動态庫提供了低層的API,它可以直接通路驅動的函數,并且依賴于微軟作業系統的可程式設計接口。

第二個動态庫提供了更多強大的,高層次的,和libpcap(一個知名的Unix捕獲庫)相容的捕獲原語。這些函數捕可以在不考慮網絡硬體和作業系統的情況下捕獲資料。

縱觀本文檔,我們會首先使用PacketDriver API 或 packet.dll的函數,然後才是wpcap, wpcap.dll 或 libpcap的。

1.3.  如何編譯WinPcap

 這部分内容會告訴你,在不同的win32平台上如何編譯WinPcap。源代碼可以在WinPcap 網站上獲得。

1.3.1.  編譯驅動

編譯NPF時,有兩個主要的路徑:WindowsNTx和Windows 9x。注意,因為NPF驅動是與平台相關的,是以,為了連接配接正确的DDK庫,我們強烈建議編譯的時候,要選擇将來會被使用的那個作業系統。比如,如果你使用Windows NT 4 DDK庫賴編譯驅動,那麼在Windows2000或其他作業系統上運作,将不會那麼順利了。

1.3.1.1.           在Windows NT4平台上編譯驅動

軟體需求:

1)  Microsoft Driver Developer Kit (DDK) for Windows NT4

2)  能在VisualStudio 6上編譯的Microsoft Platform Software Development Kit (SDK)的較新的版本(最新的平台釋出于2003年2月)。這個版本的PSDK在Microsoft的網站上提供,參見:http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm。同時,它也可以線上訂閱:http://www.qmedia.ca/launch/psdk.htm,同時,在微軟的使用者下載下傳網站裡,也為微軟MSDN使用者提供了訂閱。

3)  Microsoft Visual C++ 6.0 with Service Pack 5 or 6 (這兩個版本在微軟的網站上都有提供).

如果你的系統符合上面的三個要求,那麼請按照下列步驟:

1. 從Windows NT 開始 菜單,選擇 程式 然後選擇 DevelopmentKits, 然後選擇 Windows NT4 DDK. 在這裡,如果你想建立一個調試版本,你可以選擇Checked Build Environment ,如果你想建立一個釋出版本,你可以選擇Free Build Environment 。

2.一個指令提示框将被打開。用cd指令移到WinPcap檔案夾下的PacketNTx檔案夾,輸入指令:

CompileDriver

這個腳本會産生一個驅動 (npf.sys),然後,二進制資料會被放入下列檔案夾中的一個◦

Free BuildEnvironment: winpcap\PacketNTx\driver\bin\NT4\i386\free

Checked BuildEnvironment: winpcap\PacketNTx\driver\bin\NT4\i386\checked

警告: 有時,在編譯驅動的過程中,會産生很多'last line incomplete'錯誤提示。忽略這些錯誤,并且讓編譯過程繼續進行。它們的産生是由于某些版本的DDK的bug所引起的。

1.3.1.2.           在Windows 2000/XP/2003/Vista(32位和64位AMD64)平台上編譯驅動

軟體需求:

1)  Microsoft Driver Developer Kit (DDK) for Windows Windows XP orWindows Server 2003. 對于 WinPcap 4.0, 最合适的 DDK environment 是 "DDK for Windows Server 2003SP1", 也可以稱作 DDK3790.1830.

注意: 在Windows 2000下使用舊的DDK是可以的,但是,你需要手動地修改編譯腳本來禁用PREfast。(PREfast是一個靜态代碼分析工具,捆綁在較新的DDK中)

如果你的系統滿足以上需求,那麼請按下列步驟進行:

1.從Windows NT 開始 菜單,選擇 程式 然後選擇 DevelopmentKits, 然後選擇 Windows XXX DDK., XXX 就是你的目的系統,然後選擇 BuildEnvironments.

1) 32bit 驅動: 選擇 Windows2000 ,然後,如果你想建立一個釋出版本的程式,請選擇 Windows 2000 Free Build Environment,如果你想建立一個調試版本的程式,請選擇Windows 2000 Checked Build Environment 。

2) 64bit AMD64 驅動: 選擇 WindowsServer 2003 然後,如果你想建立一個釋出版本的程式,請選擇 Windows Server 2003 Free  x64Build Environment 如果你想建立一個調試版本的程式,請選擇 Windows Server 2003 Checked x64 Build Environment 。

2.一個指令提示框将被打開。用cd指令移到WinPcap檔案夾下的PacketNTx檔案夾,輸入指令:

CompileDriver

這個腳本會産生一個驅動 (npf.sys),然後,二進制資料會被放入下列檔案夾中的一個

1)      32bit driver (both Free andChecked Build): winpcap\PacketNTx\driver\bin\2k\i386

2)      64bit AMD64 driver (both Freeand Checked Build): winpcap\PacketNTx\driver\bin\xp\amd64

1.3.1.3.           在Windows 9x平台上編譯驅動

注意: WinPcap已經不再支援這個Windows平台。然而,一些在代碼包中,基于這些作業系統的源代碼還是可用的。

要在Windows 9x上編譯驅動,你需要:

1)      Driver Developer Kit (DDK) forWindows 95/98/ME

2)      能在Visual Studio 6上編譯的Microsoft Platform Software Development Kit (SDK)的較新的版本(最新的平台釋出于2003年2月)。這個版本的PSDK在Microsoft的網站上提供,參見:http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm。同時,它也可以線上訂閱:http://www.qmedia.ca/launch/psdk.htm,同時,在微軟的使用者下載下傳網站裡,也為微軟MSDN使用者提供了訂閱。

3)      Microsoft Visual C++ 6.0 withService Pack 5 or 6 (這兩個版本在微軟的網站上都有提供).

然後,按下列步驟進行:

1.打開DOS

2.進入 VisualC++BIN 目錄 (比如 C:\DEVSTUDIO\VC\BIN) 并執行指令

Vcvars32

3.進入 SDK 目錄 (比如 C:\MSSDK) 并執行指令

setenv sdk_path

sdk_path 是 SDK 目錄(比如 SetenvC:\MSSDK)

4.進入 DDK 目錄 (比如 C:\DDK) 并執行指令

ddkenv 32 net

5.進入驅動源代碼所在目錄,并執行指令

nmake rtl

來獲得釋出版本,或者執行

nmake

來獲得調試版本

釋出版本的 packet.vxd 将會出現在 retail 目錄下, 調試版本将會出現在debug 目錄下

警告: 在一些系統中, NMAKE使用工具并不能啟動 ADRC2VXD, 這一位着驅動二進制資料的産生是正确的,不過沒有版本資訊。我們還不知道引起這個問題的原因。

1.3.2.  編譯 packet.dll

這個DLL的源路徑在PacketNTx\dll\

注意: WinPcap已經不再支援這個Windows平台。然而,一些在代碼包中,基于這些作業系統的源代碼還是可用的。

軟體需求:

1)      能在Visual Studio 6上編譯的Microsoft Platform Software Development Kit (SDK)的較新的版本(最新的平台釋出于2003年2月)。這個版本的PSDK在Microsoft的網站上提供,參見:http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm。同時,它也可以線上訂閱:http://www.qmedia.ca/launch/psdk.htm,同時,在微軟的使用者下載下傳網站裡,也為微軟MSDN使用者提供了訂閱。

注意: 如果你使用Microsoft Visual Studio .NET ,那麼平台SDK是不需要編譯packet.dll的。

2)      Microsoft Visual C++ 6.0 withService Pack 5 or 6 (這兩個版本在微軟的網站上都有提供).

3)      如果你想用WinPcap建立一個支援CACE無線包捕獲技術的程式,你需要從http://www.cacetech.com/products/airpcap.htm下載下傳AirPcapdeveloper's pack。The AirPcap developer's pack需要被解壓到和WinPcap同一個目錄下。

要編譯 PACKET.DLL, 在Visual C++平台下,加載一個包含了目錄PacketNTx\dll\project 的工程。以下是一些工程的配置:

1)      PacketNT - Win32 Release: 标準發行版配置

2)      PacketNT - Win32 Debug: 标準調試版配置

3)      PacketNT - Win32 Release NoAirPcap: 标準發行版配置,不支援AirPcap

4)      PacketNT - Win32 Debug NoAirPcap: 标準調試版配置, 不支援AirPcap

5)      PacketNT - Win32 NT4 Release: 運作于NT4的發行版本配置,不包括對Wan和IP helperAPI的支援。

6)      PacketNT - Win32 NT4 Debug: 運作于NT4的調試版本配置,不包括對Wan和IP helperAPI的支援。

7)      PacketNT - Win32 Release Vista:運作于Vista的發行版本配置,不包括對Wan的支援(以及NetMon API)。

8)      PacketNT - Win32 Debug Vista: 運作于Vista的調試版本配置,不包括對Wan的支援(以及NetMon API)。

9)      WanPacket - Win32 Release: 使用WanPacket 庫的發行版本,用于同NetMonAPI進行廣域網捕捉。

10)  WanPacket - Win32 Debug: 使用WanPacket 庫的調試版本,用于同NetMonAPI進行廣域網捕捉。

選擇一種需要的配置,并建立工程來擷取二進制檔案。

1.3.3.  編譯 wpcap.dll

wpcap.dll 可以在任何 Win32 平台下編譯,産生的dll是平台相關的。

系統需求:

1)      Microsoft Visual C++ 6.0 withService Pack 5 or 6 (這兩個版本在微軟的網站上都有提供).

2)      能在Visual Studio 6上編譯的Microsoft Platform Software Development Kit (SDK)的較新的版本(最新的平台釋出于2003年2月)。這個版本的PSDK在Microsoft的網站上提供,參見:http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm。同時,它也可以線上訂閱:http://www.qmedia.ca/launch/psdk.htm,同時,在微軟的使用者下載下傳網站裡,也為微軟MSDN使用者提供了訂閱。

注意: 如果你使用Microsoft Visual Studio .NET ,那麼平台SDK是不需要編譯wpcap.dll的。

3)      WinPcap源代碼的工程檔案位于winpcap\wpcap\prj . 從 Visual C++ 開發平台上加載wpcap.dsw并建構程式。

4)      如果你想用WinPcap建立一個支援CACE無線包捕獲技術的程式,你需要從http://www.cacetech.com/products/airpcap.htm下載下傳AirPcapdeveloper's pack。The AirPcap developer's pack需要被解壓到和WinPcap同一個目錄下。

 以下是八種工程的配置:

不支援遠端捕獲,支援AirPcap,不支援DAG,

1)      Wpcap debug: 目錄輸出:winpcap\wpcap\prj\Debug

2)      Wpcap release: 目錄輸出:winpcap\wpcap\prj\Release

支援遠端捕獲,不支援AirPcap,不支援DAG

3)      Wpcap debug REMOTE NO AIRPCAP: 目錄輸出:winpcap\wpcap\prj\Debug_REMOTE_NO_AIRPCAP

4)      Wpcap release REMOTE NOAIRPCAP: 目錄輸出: winpcap\wpcap\prj\Release_REMOTE_NO_AIRPCAP

支援遠端捕獲,支援AirPcap,不支援DAG

5)      Wpcap debug REMOTE: 目錄輸出:winpcap\wpcap\prj\Debug_REMOTE

6)      Wpcap release REMOTE: 目錄輸出:winpcap\wpcap\prj\Release_REMOTE

支援遠端捕獲,支援AirPcap,支援DAG

7)      Wpcap debug REMOTE DAG: 目錄輸出:winpcap\wpcap\prj\Debug_REMOTE_DAG

8)      Wpcap release REMOTE DAG: 目錄輸出:winpcap\wpcap\prj\Release_REMOTE_DAG

注意: wpcap.dll 包含了來自www.tcpdump.org 的libpcap的源代碼,對于遠端捕獲有一些修改。你能包含和建構一個不同版本的libpcap,隻需要簡單地把它拷貝到winpcap\wpcap\prj下的WinPcap源代碼中即可,但是,你必須使用"Debug(調試)"或"Release(發行)"進行配置。

1.3.4.  Packet.dll — 資料包驅動API

 Packet.dll 是一個動态連結庫,并提供了一些低層的函數,用來: •安裝,啟動和停止NPF裝置驅動

1)  從NPF驅動接收資料包

2)  通過NPF驅動發送資料包

3)  擷取可用的網絡擴充卡清單

4)  擷取擴充卡的不同資訊,比如裝置描述,位址清單和掩碼

5)  查詢并設定一個低層的擴充卡參數

packet.dll有兩個版本:第一個運作于Windows 95/98/ME, 第二個運作于  Windows NT/2000/XP。

提供了對WinPcap的低層函數的通路,這種通路依賴于系統。這個庫維護了所有的依賴于系統的細節(比如管理裝置,協助作業系統管理擴充卡,在系統資料庫中查找資訊等),并且輸出一個可以在所有Windows作業系統中通用的API。這樣,作業系統和庫就可以在所有的 Windows作業系統下重新編譯并運作了。

然而,不是所有的packet.dll的API是完全可移植的:有些進階特性,比如核心模式下的輸出處理,隻能運作在WinNTx版本的WinPcap,Win9x的packet.dll不提供這樣的功能。換種說法就是,NTx版本要比9x版本功能強大,也就是說,在Win9x版本中提供的所有函數,在WinNTx中都有。

這個庫的另一個重要特性,就是維護了NPF驅動。當程式試圖通路擴充卡時,Packet.dll在背景安裝和啟動了驅動,這些對程式設計人員來說,是透明的。這就避免了使用者通過控制台,手動安裝驅動程式。

繼續閱讀