胡昊南,張治中
(重慶郵電大學(xué)通信網(wǎng)與測(cè)試技術(shù)重點(diǎn)實(shí)驗(yàn)室,重慶 400065)
網(wǎng)絡(luò)嗅探器是利用共享式的網(wǎng)絡(luò)傳輸介質(zhì),能夠捕獲和解析來自數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層和傳輸層等底層網(wǎng)絡(luò)數(shù)據(jù)包的工具。隨著網(wǎng)絡(luò)需求和網(wǎng)絡(luò)規(guī)模的日益增大,保持網(wǎng)絡(luò)的高性能運(yùn)行難度增大,網(wǎng)絡(luò)嗅探器能夠監(jiān)測(cè)網(wǎng)絡(luò)的運(yùn)行狀況,快速定位和解決網(wǎng)絡(luò)故障,保證網(wǎng)絡(luò)高速有效運(yùn)行。由于嵌入式設(shè)備在網(wǎng)絡(luò)評(píng)估和監(jiān)測(cè)中得到了廣泛應(yīng)用,在嵌入式系統(tǒng)中實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)包的捕獲和分析具有重要的意義[1-2]。
本文分析了Winpcap(Windows Packet Capture)庫函數(shù)的架構(gòu)和網(wǎng)絡(luò)數(shù)據(jù)包的傳遞流程,研究了NDIS(Network Driver Interface Standard)網(wǎng)絡(luò)驅(qū)動(dòng)程序與該實(shí)現(xiàn)方案的聯(lián)系,給出了一種基于WinCE嵌入式系統(tǒng)網(wǎng)絡(luò)嗅探器的設(shè)計(jì)和實(shí)現(xiàn)方案,該方案具有良好的兼容性和適用性,能夠滿足實(shí)際網(wǎng)絡(luò)監(jiān)測(cè)的要求[3-4]。
網(wǎng)卡混雜模式是網(wǎng)卡的一種特殊工作模式,在該工作模式下,網(wǎng)卡不對(duì)目的地址進(jìn)行判斷,而直接將收到的所有數(shù)據(jù)包傳遞給上層進(jìn)行處理[5]。必須將網(wǎng)卡置于混雜模式才能實(shí)現(xiàn)網(wǎng)絡(luò)嗅探器。
NDIS是網(wǎng)絡(luò)驅(qū)動(dòng)程序接口規(guī)范的簡(jiǎn)稱。它橫跨數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層和傳輸層,定義了網(wǎng)卡驅(qū)動(dòng)程序與上層協(xié)議驅(qū)動(dòng)程序之間的通信接口規(guī)范,屏蔽了底層物理硬件的不同所帶來的影響,使上層協(xié)議驅(qū)動(dòng)程序可以和底層任何型號(hào)的網(wǎng)卡進(jìn)行通信[6]。NDIS支持三種類型的驅(qū)動(dòng)程序,分別為協(xié)議驅(qū)動(dòng)程序、中間驅(qū)動(dòng)程序和微端口驅(qū)動(dòng)程序。
Winpcap是Windows平臺(tái)下一個(gè)免費(fèi)為應(yīng)用程序提供訪問網(wǎng)絡(luò)底層能力的系統(tǒng)。微軟為WinCE系統(tǒng)提供了開源的 PacketCE。PacketCE由 DRIVER,DLL和 SampleApp三個(gè)工程組成,其依賴關(guān)系如圖1所示。其中DRIVER工程是一個(gè)流驅(qū)動(dòng)程序;DLL工程為上層應(yīng)用程序提供流驅(qū)動(dòng)程序的封裝接口;SampleApp是可參照的示例程序。目前最高版本的PacketCE不能直接在操作系統(tǒng)WinCE5.0中使用,因此需要修改源碼進(jìn)行移植。
圖1 PacketCE結(jié)構(gòu)圖
實(shí)現(xiàn)網(wǎng)絡(luò)嗅探器有兩種方案。一種方案是使用Windows Socket編程中的原始套接字。原始套接字和其他套接字的不同之處在于它可工作在網(wǎng)絡(luò)層或數(shù)據(jù)鏈路層,而其他類型的套接字只能工作在傳輸層,所以使用原始套接字能夠監(jiān)聽數(shù)據(jù)鏈路層的數(shù)據(jù)。但操作系統(tǒng)WinCE5.0中不支持使用原始套接字。
另一種方案是使用微軟提供的Winpcap函數(shù)庫,在WinCE中微軟提供的開源軟件PacketCE,因目前最高版本的PacketCE不能直接在操作系統(tǒng)WinCE5.0中使用,需自己搭建編譯環(huán)境、修改源碼對(duì)其進(jìn)行移植。Winpcap的核心是NDIS中間驅(qū)動(dòng)程序,與Windows Socket相比,NDIS具備更高的效率和功能擴(kuò)展性。在Windows平臺(tái)下,使用NDIS是捕獲網(wǎng)絡(luò)數(shù)據(jù)包最好的方法[6]。
本文采用的是移植微軟提供的Winpcap函數(shù)庫的方案,即使用NDIS中間驅(qū)動(dòng)程序?qū)崿F(xiàn)網(wǎng)絡(luò)嗅探器。
軟件部分主要由網(wǎng)卡驅(qū)動(dòng)程序、NDIS網(wǎng)絡(luò)驅(qū)動(dòng)程序、操作系統(tǒng)和應(yīng)用程序組成。其結(jié)構(gòu)模型如圖2所示。本系統(tǒng)所使用的網(wǎng)卡芯片型號(hào)為DM9000,嵌入式ARM芯片的型號(hào)為S3C2440。經(jīng)分析知DM9000驅(qū)動(dòng)程序由網(wǎng)卡驅(qū)動(dòng)程序和NDIS微端口驅(qū)動(dòng)程序組成,PacketCE由NDIS中間驅(qū)動(dòng)程序、NDIS協(xié)議驅(qū)動(dòng)程序和DLL接口組成。
網(wǎng)卡驅(qū)動(dòng)程序通過處理網(wǎng)卡寄存器維持網(wǎng)卡的正常工作。中間驅(qū)動(dòng)程序?yàn)槲⒍丝隍?qū)動(dòng)程序提供協(xié)議驅(qū)動(dòng)程序接口,為協(xié)議驅(qū)動(dòng)程序提供微端口驅(qū)動(dòng)程序接口[7]。DLL接口向上層應(yīng)用程序提供驅(qū)動(dòng)程序接口。數(shù)據(jù)包的捕獲基于NDIS中間層驅(qū)動(dòng)程序?qū)崿F(xiàn),并依據(jù)過濾準(zhǔn)則實(shí)現(xiàn)數(shù)據(jù)包的接收過濾,向上層傳遞數(shù)據(jù)包。應(yīng)用層程序進(jìn)行過濾準(zhǔn)則的設(shè)置和數(shù)據(jù)包的處理分析以及數(shù)據(jù)統(tǒng)計(jì)和結(jié)果顯示。
系統(tǒng)采用了模塊化的設(shè)計(jì)方法,各模塊之間相互獨(dú)立,便于功能的修改和擴(kuò)展,提高了系統(tǒng)的可移植性、可維護(hù)性和可升級(jí)性。其軟件模塊結(jié)構(gòu)如圖3所示。
圖2 軟件結(jié)構(gòu)模型
圖3 軟件模塊設(shè)計(jì)圖
各個(gè)模塊的的作用如下:
1)過濾模塊
設(shè)置過濾準(zhǔn)則,可選擇性地接收網(wǎng)絡(luò)數(shù)據(jù)包,屏蔽不關(guān)心的數(shù)據(jù)包,減輕對(duì)數(shù)據(jù)包的分析處理負(fù)擔(dān),提高系統(tǒng)的監(jiān)聽效率。
2)數(shù)據(jù)包捕獲模塊
數(shù)據(jù)包解析模塊的基礎(chǔ),實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)包的捕獲。主要完成網(wǎng)卡信息列表的讀取、打開指定網(wǎng)卡、抓包的開始和停止功能。
3)數(shù)據(jù)包解析模塊
網(wǎng)絡(luò)嗅探器系統(tǒng)的核心是實(shí)現(xiàn)數(shù)據(jù)包協(xié)議的解碼并保存解碼后的信息。保存的信息包括數(shù)據(jù)包捕獲的時(shí)間、最高級(jí)協(xié)議類型、目的MAC地址和源MAC地址、目的IP地址和源IP地址、幀長(zhǎng)度等信息。
4)控制模塊
控制整個(gè)系統(tǒng)的開始與停止,協(xié)調(diào)各個(gè)模塊之間的交互,完成對(duì)系統(tǒng)信息的設(shè)置,例如系統(tǒng)MAC地址、IP地址以及工作速率模式的設(shè)置。
5)顯示模塊
實(shí)現(xiàn)捕獲結(jié)果及測(cè)試過程附加信息的呈現(xiàn)。能夠顯示數(shù)據(jù)包解析模塊所保存的全部信息、接收的總包數(shù)量、測(cè)試起始時(shí)間和測(cè)試持續(xù)時(shí)間,并限制顯示的包詳細(xì)信息總數(shù),節(jié)省占用的內(nèi)存。
為了確保所捕獲的網(wǎng)絡(luò)數(shù)據(jù)包信息的正確性,了解網(wǎng)絡(luò)數(shù)據(jù)包在系統(tǒng)中的傳遞流程,監(jiān)測(cè)網(wǎng)絡(luò)數(shù)據(jù)包在各個(gè)位置的信息正確性成為必要。本文主要分析了系統(tǒng)中網(wǎng)絡(luò)數(shù)據(jù)包從網(wǎng)卡驅(qū)動(dòng),流經(jīng)NDIS驅(qū)動(dòng)程序,直至DLL接口的整個(gè)傳遞流程,如圖4所示。
圖4 網(wǎng)絡(luò)數(shù)據(jù)包傳遞過程圖
當(dāng)網(wǎng)絡(luò)數(shù)據(jù)包到達(dá)網(wǎng)卡時(shí),因初始化中斷,對(duì)網(wǎng)卡數(shù)據(jù)包的接收進(jìn)行了監(jiān)控,所以首先調(diào)用網(wǎng)卡驅(qū)動(dòng)層中的Dm9LookupRxBuffer()函數(shù),判斷是否有有效的網(wǎng)絡(luò)數(shù)據(jù)包到達(dá),并且調(diào)用DeviceReadString()函數(shù)完成對(duì)網(wǎng)卡接收寄存器中的網(wǎng)絡(luò)數(shù)據(jù)包內(nèi)數(shù)據(jù)的讀取,然后調(diào)用NDIS微端口驅(qū)動(dòng)層中負(fù)責(zé)與NDIS中間驅(qū)動(dòng)層交互的Ndis-MIndicateReceivePacket()函數(shù),進(jìn)而調(diào)用NDIS中間驅(qū)動(dòng)層中的PacketRecieve()/ProtocalReceiveComplete()函數(shù),完成數(shù)據(jù)從網(wǎng)卡寄存器到內(nèi)核緩沖區(qū)的轉(zhuǎn)移。這里的內(nèi)存緩沖區(qū)是一個(gè)PNDIS_PACKET結(jié)構(gòu)體類型的變量,該結(jié)構(gòu)體類型是指向PNDIS_BUFFER結(jié)構(gòu)體類型的一個(gè)鏈表。DLL接口向上層應(yīng)用程序提供PackeRecievePacket()函數(shù),該函數(shù)調(diào)用NDIS協(xié)議驅(qū)動(dòng)層的PKTRead()函數(shù),PKTRead()函數(shù)與PacketReceive()函數(shù)通過一個(gè)全局句柄進(jìn)行交互,完成從內(nèi)核緩沖區(qū)的數(shù)據(jù)拷貝至用戶緩沖區(qū)的功能。
總結(jié)上述過程,當(dāng)有網(wǎng)絡(luò)數(shù)據(jù)包到達(dá)網(wǎng)卡時(shí),先將網(wǎng)卡接收寄存器中的數(shù)據(jù)包復(fù)制到內(nèi)核緩沖區(qū)中,然后通過上層調(diào)用,將內(nèi)核緩沖區(qū)中的數(shù)據(jù)拷貝到用戶緩沖區(qū)中,最后再交給應(yīng)用程序加工提取出有用的信息。在實(shí)現(xiàn)過程中,可根據(jù)上述流程進(jìn)一步分析驗(yàn)證網(wǎng)絡(luò)數(shù)據(jù)包信息的正確性,定位網(wǎng)絡(luò)數(shù)據(jù)包信息錯(cuò)誤的原因,對(duì)理解NDIS網(wǎng)絡(luò)驅(qū)動(dòng)程序的工作流程具有指導(dǎo)意義。
通過PacketGetAdapterNames()函數(shù)獲取網(wǎng)卡列表信息,所有信息以字符串的形式存儲(chǔ)在字符數(shù)組中。選擇并打開已選擇的網(wǎng)卡接口,通過設(shè)置Packet結(jié)構(gòu)體類型變量中緩存的大小、超時(shí)時(shí)間等信息,初始化接收參數(shù)設(shè)置。通過PacketRecievePacket()函數(shù)接收網(wǎng)絡(luò)數(shù)據(jù)包,網(wǎng)絡(luò)數(shù)據(jù)包的所有數(shù)據(jù)存儲(chǔ)在Packet結(jié)構(gòu)體類型變量的參數(shù)Buffer中。其捕獲流程如圖5所示。
圖5 網(wǎng)絡(luò)數(shù)據(jù)包捕獲流程圖
利用NDIS中間驅(qū)動(dòng)程序捕獲的數(shù)據(jù)包處在數(shù)據(jù)鏈路層,依次經(jīng)過了傳輸層、網(wǎng)絡(luò)層和數(shù)據(jù)鏈路層的封裝。因此,需要對(duì)所接收到的數(shù)據(jù)包進(jìn)行進(jìn)一步解析才能得到所需要的信息。本系統(tǒng)依次分析數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層和傳輸層的部分關(guān)鍵信息,不分析應(yīng)用層的信息。
在數(shù)據(jù)包解析過程中,根據(jù)各種協(xié)議數(shù)據(jù)包包頭的格式,讀取接收網(wǎng)絡(luò)數(shù)據(jù)包中相應(yīng)位置的包頭,分析出該協(xié)議的各個(gè)字段值。在數(shù)據(jù)鏈路層信息解析過程中,首先根據(jù)以太網(wǎng)幀結(jié)構(gòu)的協(xié)議類型字段判斷幀的類型,主要判斷的類型有ARP,RARP以及IP[8]。如果幀類型是IP,則需繼續(xù)根據(jù)IP數(shù)據(jù)報(bào)結(jié)構(gòu)的協(xié)議類型字段判斷該數(shù)據(jù)報(bào)的傳輸層信息,主要判斷的類型是ICMP,IGMP,TCP以及UDP,再根據(jù)對(duì)應(yīng)的包頭格式獲取有用的字段信息。
本系統(tǒng)中在接收的數(shù)據(jù)包信息前增加了20 byte的自定義信息(8 byte的幀接收時(shí)間信息、4 byte的Captured Portion Length信息、4 byte的Packet Original Length信息、2 byte的Bpf Header Length信息以及2 byte的邊緣對(duì)齊填充數(shù)據(jù)),可直接從該自定義信息中獲取所接收幀長(zhǎng)度、幀接收時(shí)間的信息,需要考慮自定義信息對(duì)數(shù)據(jù)包解析過程所帶來的影響。網(wǎng)絡(luò)數(shù)據(jù)包解析顯示結(jié)果如圖6所示。
圖6 網(wǎng)絡(luò)嗅探器結(jié)果顯示圖(截圖)
分析PacketCE中DRIVER工程的OpenClose.c和Packet.c的源碼可知,DRIVER是一個(gè)NDIS中間驅(qū)動(dòng)程序,在本質(zhì)上是一個(gè)流驅(qū)動(dòng)程序,所以在Platform Builder5.0軟件中搭建了PacketCE的編譯環(huán)境。
在動(dòng)態(tài)鏈接庫被加載后,流接口驅(qū)動(dòng)程序的入口函數(shù)會(huì)第一個(gè)被調(diào)用,入口函數(shù)主要完成硬件的初始化工作。該流接口驅(qū)動(dòng)程序的入口函數(shù)DWORD PKT_Init()首先定義并初始化了NDIS_PROTOCOL_CHARACTERISTICS類型結(jié)構(gòu)體變量ProtocalChar,然后通過調(diào)用Ndis-RegisterProtocol()函數(shù)完成了NDIS協(xié)議驅(qū)動(dòng)程序的注冊(cè)。網(wǎng)卡驅(qū)動(dòng)程序不僅完成了對(duì)DM9000網(wǎng)卡芯片的驅(qū)動(dòng),還完成了對(duì)NDIS微端口驅(qū)動(dòng)程序的實(shí)現(xiàn)和注冊(cè)。
移植時(shí)需分析在DRIVER工程中會(huì)調(diào)用到的微端口驅(qū)動(dòng)程序,然后在微端口驅(qū)動(dòng)程序中增加適當(dāng)?shù)暮瘮?shù)并注冊(cè),防止引起異常;在中間驅(qū)動(dòng)程序中修改版本號(hào)等信息,并根據(jù)數(shù)據(jù)包交互流程,在對(duì)應(yīng)的函數(shù)中作出相應(yīng)的修改,重新編譯生成Packet.dll和Winpcap.dll動(dòng)態(tài)鏈接庫,加載至WinCE操作系統(tǒng)中,配置好環(huán)境后,應(yīng)用程序便可直接調(diào)用Winpcap庫函數(shù)。
在PC機(jī)端運(yùn)行的Wireshark抓包軟件和在WinCE嵌入式系統(tǒng)運(yùn)行的網(wǎng)絡(luò)嗅探器同時(shí)監(jiān)測(cè)統(tǒng)計(jì)同一個(gè)實(shí)際網(wǎng)絡(luò)中的數(shù)據(jù)包信息,以Wireshark的統(tǒng)計(jì)數(shù)據(jù)作為實(shí)際測(cè)試環(huán)境數(shù)據(jù),將網(wǎng)絡(luò)嗅探器的接收包數(shù)量測(cè)試結(jié)果與其對(duì)比,計(jì)算出丟包率,結(jié)果如表1所示。
表1 測(cè)試驗(yàn)證結(jié)果
從表中可得知,當(dāng)發(fā)送包數(shù)量小于10000時(shí),網(wǎng)絡(luò)嗅探器未出現(xiàn)丟包的情況。當(dāng)發(fā)送包數(shù)量大于10000時(shí),由于硬件CPU頻率和內(nèi)存大小的限制,導(dǎo)致出現(xiàn)輕微的丟包現(xiàn)象。未出現(xiàn)丟包情況時(shí),Wireshark測(cè)試結(jié)果和網(wǎng)絡(luò)嗅探測(cè)試結(jié)果中對(duì)應(yīng)編號(hào)的包協(xié)議類型、長(zhǎng)度、源及目的MAC、源及目的IP均相同,所以該網(wǎng)絡(luò)嗅探器能夠基本滿足實(shí)際網(wǎng)絡(luò)中網(wǎng)絡(luò)數(shù)據(jù)包捕獲的正確性和性能要求。
網(wǎng)絡(luò)嗅探器是多個(gè)模塊組成的系統(tǒng),能夠監(jiān)測(cè)網(wǎng)絡(luò)運(yùn)行狀況,是分析網(wǎng)絡(luò)性能、解決網(wǎng)絡(luò)故障的基礎(chǔ)。本文介紹了NDIS網(wǎng)絡(luò)驅(qū)動(dòng)程序的基本結(jié)構(gòu),通過對(duì)NDIS驅(qū)動(dòng)和Winpcap庫函數(shù)的分析,在WinCE嵌入式系統(tǒng)中實(shí)現(xiàn)了網(wǎng)絡(luò)嗅探器的功能,著重闡述了網(wǎng)路數(shù)據(jù)包的傳遞流程、軟件結(jié)構(gòu)設(shè)計(jì)和Winpcap的移植。本方案可在保證獲取信息正確的前提下修改移植的庫函數(shù),在數(shù)據(jù)包前增加自定義信息,具有良好的結(jié)構(gòu)性、擴(kuò)展性和效率性,并能夠收發(fā)基于各層的各種協(xié)議數(shù)據(jù)包,接收獲取網(wǎng)絡(luò)中各層的信息。
[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防火墻與網(wǎng)絡(luò)封包截獲技術(shù)[M].北京:電子工業(yè)出版社,2002.
[4]楊智君,馬駿驍,田地,等.基于NDIS的IP安全協(xié)議的研究與實(shí)現(xiàn)[J]. 計(jì)算機(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.計(jì)算機(jī)網(wǎng)絡(luò)[M].5th ed. 北京:機(jī)械工業(yè)出版社,2011.