胡昊南,張治中
(重慶郵電大學通信網與測試技術重點實驗室,重慶 400065)
網絡嗅探器是利用共享式的網絡傳輸介質,能夠捕獲和解析來自數據鏈路層、網絡層和傳輸層等底層網絡數據包的工具。隨著網絡需求和網絡規模的日益增大,保持網絡的高性能運行難度增大,網絡嗅探器能夠監測網絡的運行狀況,快速定位和解決網絡故障,保證網絡高速有效運行。由于嵌入式設備在網絡評估和監測中得到了廣泛應用,在嵌入式系統中實現網絡數據包的捕獲和分析具有重要的意義[1-2]。
本文分析了Winpcap(Windows Packet Capture)庫函數的架構和網絡數據包的傳遞流程,研究了NDIS(Network Driver Interface Standard)網絡驅動程序與該實現方案的聯系,給出了一種基于WinCE嵌入式系統網絡嗅探器的設計和實現方案,該方案具有良好的兼容性和適用性,能夠滿足實際網絡監測的要求[3-4]。
網卡混雜模式是網卡的一種特殊工作模式,在該工作模式下,網卡不對目的地址進行判斷,而直接將收到的所有數據包傳遞給上層進行處理[5]。必須將網卡置于混雜模式才能實現網絡嗅探器。
NDIS是網絡驅動程序接口規范的簡稱。它橫跨數據鏈路層、網絡層和傳輸層,定義了網卡驅動程序與上層協議驅動程序之間的通信接口規范,屏蔽了底層物理硬件的不同所帶來的影響,使上層協議驅動程序可以和底層任何型號的網卡進行通信[6]。NDIS支持三種類型的驅動程序,分別為協議驅動程序、中間驅動程序和微端口驅動程序。
Winpcap是Windows平臺下一個免費為應用程序提供訪問網絡底層能力的系統。微軟為WinCE系統提供了開源的 PacketCE。PacketCE由 DRIVER,DLL和 SampleApp三個工程組成,其依賴關系如圖1所示。其中DRIVER工程是一個流驅動程序;DLL工程為上層應用程序提供流驅動程序的封裝接口;SampleApp是可參照的示例程序。目前最高版本的PacketCE不能直接在操作系統WinCE5.0中使用,因此需要修改源碼進行移植。

圖1 PacketCE結構圖
實現網絡嗅探器有兩種方案。一種方案是使用Windows Socket編程中的原始套接字。原始套接字和其他套接字的不同之處在于它可工作在網絡層或數據鏈路層,而其他類型的套接字只能工作在傳輸層,所以使用原始套接字能夠監聽數據鏈路層的數據。但操作系統WinCE5.0中不支持使用原始套接字。
另一種方案是使用微軟提供的Winpcap函數庫,在WinCE中微軟提供的開源軟件PacketCE,因目前最高版本的PacketCE不能直接在操作系統WinCE5.0中使用,需自己搭建編譯環境、修改源碼對其進行移植。Winpcap的核心是NDIS中間驅動程序,與Windows Socket相比,NDIS具備更高的效率和功能擴展性。在Windows平臺下,使用NDIS是捕獲網絡數據包最好的方法[6]。
本文采用的是移植微軟提供的Winpcap函數庫的方案,即使用NDIS中間驅動程序實現網絡嗅探器。
軟件部分主要由網卡驅動程序、NDIS網絡驅動程序、操作系統和應用程序組成。其結構模型如圖2所示。本系統所使用的網卡芯片型號為DM9000,嵌入式ARM芯片的型號為S3C2440。經分析知DM9000驅動程序由網卡驅動程序和NDIS微端口驅動程序組成,PacketCE由NDIS中間驅動程序、NDIS協議驅動程序和DLL接口組成。
網卡驅動程序通過處理網卡寄存器維持網卡的正常工作。中間驅動程序為微端口驅動程序提供協議驅動程序接口,為協議驅動程序提供微端口驅動程序接口[7]。DLL接口向上層應用程序提供驅動程序接口。數據包的捕獲基于NDIS中間層驅動程序實現,并依據過濾準則實現數據包的接收過濾,向上層傳遞數據包。應用層程序進行過濾準則的設置和數據包的處理分析以及數據統計和結果顯示。
系統采用了模塊化的設計方法,各模塊之間相互獨立,便于功能的修改和擴展,提高了系統的可移植性、可維護性和可升級性。其軟件模塊結構如圖3所示。

圖2 軟件結構模型

圖3 軟件模塊設計圖
各個模塊的的作用如下:
1)過濾模塊
設置過濾準則,可選擇性地接收網絡數據包,屏蔽不關心的數據包,減輕對數據包的分析處理負擔,提高系統的監聽效率。
2)數據包捕獲模塊
數據包解析模塊的基礎,實現網絡數據包的捕獲。主要完成網卡信息列表的讀取、打開指定網卡、抓包的開始和停止功能。
3)數據包解析模塊
網絡嗅探器系統的核心是實現數據包協議的解碼并保存解碼后的信息。保存的信息包括數據包捕獲的時間、最高級協議類型、目的MAC地址和源MAC地址、目的IP地址和源IP地址、幀長度等信息。
4)控制模塊
控制整個系統的開始與停止,協調各個模塊之間的交互,完成對系統信息的設置,例如系統MAC地址、IP地址以及工作速率模式的設置。
5)顯示模塊
實現捕獲結果及測試過程附加信息的呈現。能夠顯示數據包解析模塊所保存的全部信息、接收的總包數量、測試起始時間和測試持續時間,并限制顯示的包詳細信息總數,節省占用的內存。
為了確保所捕獲的網絡數據包信息的正確性,了解網絡數據包在系統中的傳遞流程,監測網絡數據包在各個位置的信息正確性成為必要。本文主要分析了系統中網絡數據包從網卡驅動,流經NDIS驅動程序,直至DLL接口的整個傳遞流程,如圖4所示。

圖4 網絡數據包傳遞過程圖
當網絡數據包到達網卡時,因初始化中斷,對網卡數據包的接收進行了監控,所以首先調用網卡驅動層中的Dm9LookupRxBuffer()函數,判斷是否有有效的網絡數據包到達,并且調用DeviceReadString()函數完成對網卡接收寄存器中的網絡數據包內數據的讀取,然后調用NDIS微端口驅動層中負責與NDIS中間驅動層交互的Ndis-MIndicateReceivePacket()函數,進而調用NDIS中間驅動層中的PacketRecieve()/ProtocalReceiveComplete()函數,完成數據從網卡寄存器到內核緩沖區的轉移。這里的內存緩沖區是一個PNDIS_PACKET結構體類型的變量,該結構體類型是指向PNDIS_BUFFER結構體類型的一個鏈表。DLL接口向上層應用程序提供PackeRecievePacket()函數,該函數調用NDIS協議驅動層的PKTRead()函數,PKTRead()函數與PacketReceive()函數通過一個全局句柄進行交互,完成從內核緩沖區的數據拷貝至用戶緩沖區的功能。
總結上述過程,當有網絡數據包到達網卡時,先將網卡接收寄存器中的數據包復制到內核緩沖區中,然后通過上層調用,將內核緩沖區中的數據拷貝到用戶緩沖區中,最后再交給應用程序加工提取出有用的信息。在實現過程中,可根據上述流程進一步分析驗證網絡數據包信息的正確性,定位網絡數據包信息錯誤的原因,對理解NDIS網絡驅動程序的工作流程具有指導意義。
通過PacketGetAdapterNames()函數獲取網卡列表信息,所有信息以字符串的形式存儲在字符數組中。選擇并打開已選擇的網卡接口,通過設置Packet結構體類型變量中緩存的大小、超時時間等信息,初始化接收參數設置。通過PacketRecievePacket()函數接收網絡數據包,網絡數據包的所有數據存儲在Packet結構體類型變量的參數Buffer中。其捕獲流程如圖5所示。

圖5 網絡數據包捕獲流程圖
利用NDIS中間驅動程序捕獲的數據包處在數據鏈路層,依次經過了傳輸層、網絡層和數據鏈路層的封裝。因此,需要對所接收到的數據包進行進一步解析才能得到所需要的信息。本系統依次分析數據鏈路層、網絡層和傳輸層的部分關鍵信息,不分析應用層的信息。
在數據包解析過程中,根據各種協議數據包包頭的格式,讀取接收網絡數據包中相應位置的包頭,分析出該協議的各個字段值。在數據鏈路層信息解析過程中,首先根據以太網幀結構的協議類型字段判斷幀的類型,主要判斷的類型有ARP,RARP以及IP[8]。如果幀類型是IP,則需繼續根據IP數據報結構的協議類型字段判斷該數據報的傳輸層信息,主要判斷的類型是ICMP,IGMP,TCP以及UDP,再根據對應的包頭格式獲取有用的字段信息。
本系統中在接收的數據包信息前增加了20 byte的自定義信息(8 byte的幀接收時間信息、4 byte的Captured Portion Length信息、4 byte的Packet Original Length信息、2 byte的Bpf Header Length信息以及2 byte的邊緣對齊填充數據),可直接從該自定義信息中獲取所接收幀長度、幀接收時間的信息,需要考慮自定義信息對數據包解析過程所帶來的影響。網絡數據包解析顯示結果如圖6所示。

圖6 網絡嗅探器結果顯示圖(截圖)
分析PacketCE中DRIVER工程的OpenClose.c和Packet.c的源碼可知,DRIVER是一個NDIS中間驅動程序,在本質上是一個流驅動程序,所以在Platform Builder5.0軟件中搭建了PacketCE的編譯環境。
在動態鏈接庫被加載后,流接口驅動程序的入口函數會第一個被調用,入口函數主要完成硬件的初始化工作。該流接口驅動程序的入口函數DWORD PKT_Init()首先定義并初始化了NDIS_PROTOCOL_CHARACTERISTICS類型結構體變量ProtocalChar,然后通過調用Ndis-RegisterProtocol()函數完成了NDIS協議驅動程序的注冊。網卡驅動程序不僅完成了對DM9000網卡芯片的驅動,還完成了對NDIS微端口驅動程序的實現和注冊。
移植時需分析在DRIVER工程中會調用到的微端口驅動程序,然后在微端口驅動程序中增加適當的函數并注冊,防止引起異常;在中間驅動程序中修改版本號等信息,并根據數據包交互流程,在對應的函數中作出相應的修改,重新編譯生成Packet.dll和Winpcap.dll動態鏈接庫,加載至WinCE操作系統中,配置好環境后,應用程序便可直接調用Winpcap庫函數。
在PC機端運行的Wireshark抓包軟件和在WinCE嵌入式系統運行的網絡嗅探器同時監測統計同一個實際網絡中的數據包信息,以Wireshark的統計數據作為實際測試環境數據,將網絡嗅探器的接收包數量測試結果與其對比,計算出丟包率,結果如表1所示。

表1 測試驗證結果
從表中可得知,當發送包數量小于10000時,網絡嗅探器未出現丟包的情況。當發送包數量大于10000時,由于硬件CPU頻率和內存大小的限制,導致出現輕微的丟包現象。未出現丟包情況時,Wireshark測試結果和網絡嗅探測試結果中對應編號的包協議類型、長度、源及目的MAC、源及目的IP均相同,所以該網絡嗅探器能夠基本滿足實際網絡中網絡數據包捕獲的正確性和性能要求。
網絡嗅探器是多個模塊組成的系統,能夠監測網絡運行狀況,是分析網絡性能、解決網絡故障的基礎。本文介紹了NDIS網絡驅動程序的基本結構,通過對NDIS驅動和Winpcap庫函數的分析,在WinCE嵌入式系統中實現了網絡嗅探器的功能,著重闡述了網路數據包的傳遞流程、軟件結構設計和Winpcap的移植。本方案可在保證獲取信息正確的前提下修改移植的庫函數,在數據包前增加自定義信息,具有良好的結構性、擴展性和效率性,并能夠收發基于各層的各種協議數據包,接收獲取網絡中各層的信息。
[1]TANG Dongming,LI Juguang,LU Xianliang.Efficient packet capture on windows CE[C]//Proc.2nd International Conference on Intelligent Control and Information Processing.Harbin:IEEE Press,2011:110-114.
[2]SMITH M,LOGUINOV D.Enabling high-performance internet-wide measurements on windows[C]//Proc.11th International Conference on Passive and Active Measurement.Hammamet:IEEE Press,2001:686-693.
[3]宋雁輝.Widnows防火墻與網絡封包截獲技術[M].北京:電子工業出版社,2002.
[4]楊智君,馬駿驍,田地,等.基于NDIS的IP安全協議的研究與實現[J]. 計算機工程,2007,33(22):166-168.
[5]QADEER M A,ZAHID M,IQBAL A,et al.Network Traffic Analysis and Intrusion Detection using Packet Sniffer[C]//Proc.2010 Second International Conference on Communication Software and Networks.Singapore:IEEE Press,2010:313-317.
[6]HU Yin,LIN Pei.Reserch and implementation of packet classification based on NDIS intermediate layer under windows platform[C]//Proc.2011 International Symposium on Intelligence Information Processing and Trusted Computing.Wuhan,Hubei:IEEE Press,2011:157-160.
[7]WANG Xiaoling,ZHOU Gang.Defence design for ARP spoofing based on NDIS intermediate driver[C]//Proc.2012 International Conference on Computer Distributed Control and Intelligent Environmental Monitoring.Changsha,Hunan:IEEE Press,2012:218-220.
[8]TANENBAUM A S,WETHERALL D J.計算機網絡[M].5th ed. 北京:機械工業出版社,2011.