基于NDIS中間層驅(qū)動程序的網(wǎng)絡(luò)嗅探器
1 引 言
網(wǎng)絡(luò)嗅探器(Sniffer)是利用計算機網(wǎng)絡(luò)接口截獲所需網(wǎng)絡(luò)內(nèi)部數(shù)據(jù)報文的一種工具,他廣泛地應(yīng)用于流量分析、安全監(jiān)控、網(wǎng)管分析、防火墻等的實現(xiàn)中。Sniffer主要被用來在網(wǎng)絡(luò)上截獲位于OSI協(xié)議模型中各個協(xié)議層次上的數(shù)據(jù)包,通過對截獲數(shù)據(jù)包的分析,嗅探器可以掌握目標(biāo)主機的信息。由于與具體平臺的網(wǎng)絡(luò)協(xié)議棧密切相關(guān),并涉及網(wǎng)絡(luò)安全的敏感問題,網(wǎng)絡(luò)嗅探一般沒有通用的實現(xiàn)方法。
隨著計算機網(wǎng)絡(luò)應(yīng)用的普及,和Windows 2000/XP網(wǎng)絡(luò)操作系統(tǒng)的廣泛應(yīng)用,使得在Window 2000/XP下保障網(wǎng)絡(luò)通信安全成為一個迫切需要解決的問題。本文基于NDIS中間層驅(qū)動程序?qū)崿F(xiàn)網(wǎng)絡(luò)嗅探器,為滿足上述需求提供了充分的可能。
2 網(wǎng)絡(luò)嗅探器的基本工作原理
網(wǎng)絡(luò)嗅探器利用的是共享式的網(wǎng)絡(luò)傳輸介質(zhì)。共享即意味著網(wǎng)絡(luò)中的一臺機器可以嗅探到傳遞給本網(wǎng)段(沖突域)中的所有機器的報文。例如最常見的以太網(wǎng)就是一種共享式的網(wǎng)絡(luò)技術(shù),以太網(wǎng)卡收到報文后,通過對目的地址進行檢查,來判斷是否是傳遞給自己的,如果是,則把報文傳遞給操作系統(tǒng);否則,將報文丟棄,不進行處理;網(wǎng)卡存在一種特殊的工作模式,在這種工作模式下,網(wǎng)卡不對目的地址進行判斷,而直接將他收到的所有報文都傳遞給操作系統(tǒng)進行處理,這種特殊的工作模式,就稱之為混雜模式。網(wǎng)絡(luò)嗅探器通過將網(wǎng)卡設(shè)置為混雜模式來實現(xiàn)對網(wǎng)絡(luò)的嗅探。
一個實際的主機系統(tǒng)中,數(shù)據(jù)的收發(fā)是由網(wǎng)卡來完成的,當(dāng)網(wǎng)卡接收到傳輸來的數(shù)據(jù)包時,網(wǎng)卡內(nèi)的單片程序首先解析數(shù)據(jù)包的目的網(wǎng)卡物理地址,然后根據(jù)網(wǎng)卡驅(qū)動程序設(shè)置的接收模式判斷該不該接收,認(rèn)為該接收就產(chǎn)生中斷信號通知CPU,認(rèn)為不該接收就丟掉數(shù)據(jù)包,所以不該接收的數(shù)據(jù)包就被網(wǎng)卡截斷了,上層應(yīng)用根本就不知道這個過程。CPU如果得到網(wǎng)卡的中斷信號,則根據(jù)網(wǎng)卡的驅(qū)動程序設(shè)置的網(wǎng)卡中斷程序地址調(diào)用驅(qū)動程序接收數(shù)據(jù),并將接收的數(shù)據(jù)交給上層協(xié)議軟件處理。
3 NDIS中間層驅(qū)動程序
訪問位于網(wǎng)絡(luò)底層的傳輸協(xié)議是網(wǎng)絡(luò)嗅探器的基本功能。網(wǎng)絡(luò)嗅探器必須能夠接收并分析來自數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層等底層的數(shù)據(jù)包,本文介紹的網(wǎng)絡(luò)嗅探器采用了網(wǎng)絡(luò)驅(qū)動程序接口規(guī)范(NDIS)中間層驅(qū)動程序技術(shù)設(shè)計。
NDIS是Windows網(wǎng)絡(luò)協(xié)議棧構(gòu)件間的接口規(guī)范,基于NDIS的核心態(tài)包過濾技術(shù)具有較高的結(jié)構(gòu)性和可擴展性。從NDIS4.0開始,NDIS開始支持中間層驅(qū)動程序(Intermediate Driver),為NDIS體系帶來了很多的靈活性,他是位于一個或者多個NIC驅(qū)動之上和傳輸層驅(qū)動之下的驅(qū)動程序,即位于鏈路層和協(xié)議層之間,對上面的協(xié)議層提供一個虛擬的微端口網(wǎng)卡驅(qū)動接口(MiniportDriver),而對下面的鏈路層則提供一個協(xié)議驅(qū)動接口(Protocol Driver)。所有經(jīng)過網(wǎng)卡發(fā)送到網(wǎng)絡(luò)和從網(wǎng)絡(luò)接收的數(shù)據(jù)包都要由此通過,因此中間層驅(qū)動程序可以對所有網(wǎng)絡(luò)數(shù)據(jù)包進行過濾和處理。從NDIS中間層在Windows中的位置來看,其處于核心層,處于與操作系統(tǒng)同等級別的核心態(tài),如圖1所示。
本文使用微軟提供的驅(qū)動程序開發(fā)包DDK進行NDIS中間層驅(qū)動程序編程。具體流程為:
(1)NDIS驅(qū)動程序在主入口函數(shù)DirverEntry中調(diào)用NdisMinitializeWrapper函數(shù)注冊輸出函數(shù)集入口,得到設(shè)備句柄;
(2)輸入(1)得到的句柄調(diào)用NdisIMRegisterLayeredMiniport,為NDIS中間層驅(qū)動程序注冊一套Miniport回調(diào)函數(shù),這樣上層Protocol協(xié)議就認(rèn)為中間層驅(qū)動程序是網(wǎng)卡,并通過NDIS庫調(diào)用這些回調(diào)函數(shù);
(3)調(diào)用NdisRegisterProtocol,為NDIS中間層驅(qū)動程序注冊一套Protocol回調(diào)函數(shù),這樣下層網(wǎng)卡就認(rèn)為中間層驅(qū)動程序是一個協(xié)議,并通過NDIS庫調(diào)用這些函數(shù);
(4)當(dāng)操作系統(tǒng)發(fā)現(xiàn)NIC時,NDIS調(diào)用中間層驅(qū)動程序注冊的ProtocolAdapterBind函數(shù),該函數(shù)內(nèi)部需要調(diào)用NdisOpenAdapt打開適配器,保證了網(wǎng)卡和中間層的綁定關(guān)系;
(5)調(diào)用PtReceivePacket接收網(wǎng)卡收到的數(shù)據(jù)包;
(6)數(shù)據(jù)包與所設(shè)置過濾規(guī)則進行比較,不滿足規(guī)則時調(diào)用函數(shù)返回NDIS_STATUS_NOT_ACCEPTED,該宏在ndis.h中定義,這樣就結(jié)束了本接收函數(shù)的調(diào)用。
4 基于NDIS中間層驅(qū)動程序的網(wǎng)絡(luò)嗅探器實現(xiàn)
4.1 網(wǎng)絡(luò)嗅探器的結(jié)構(gòu)模型
本文實現(xiàn)的網(wǎng)絡(luò)嗅探器主要由運行于Ring0層的NDIS中間層驅(qū)動程序模塊和運行于Ring3層的應(yīng)用層包處理模塊構(gòu)成。在Windows 2000平臺下實現(xiàn)了對流經(jīng)指定網(wǎng)絡(luò)適配器的各種網(wǎng)絡(luò)協(xié)議、任意/指定IP地址和端口的數(shù)據(jù)包的嗅探,如圖2所示。
(1)應(yīng)用層包處理模塊:處于應(yīng)用層,負(fù)責(zé)過濾準(zhǔn)則的設(shè)置和數(shù)據(jù)包的處理分析。
(2)數(shù)據(jù)包捕獲及過濾實現(xiàn)模塊:基于NDIS中間層驅(qū)動程序完成底層數(shù)據(jù)的截獲功能,并依據(jù)數(shù)據(jù)包過濾準(zhǔn)則實現(xiàn)對數(shù)據(jù)包的接收過濾,向上層應(yīng)用程序遞交數(shù)據(jù)包。
{{分頁}}
4.2 應(yīng)用層包過濾準(zhǔn)則設(shè)置
網(wǎng)絡(luò)嗅探器中采用包過濾技術(shù)的目的主要是為了有選擇地接收網(wǎng)絡(luò)數(shù)據(jù)包,屏蔽偵聽者不關(guān)心的網(wǎng)絡(luò)數(shù)據(jù)包,從而提高系統(tǒng)的監(jiān)聽效率,減輕高層應(yīng)用對數(shù)據(jù)包的分析處理負(fù)擔(dān)。數(shù)據(jù)包的過濾是對捕獲的數(shù)據(jù)包的報頭進行分析,依據(jù)過濾準(zhǔn)則來決定數(shù)據(jù)包是否需要提交高層應(yīng)用進行處理。
過濾準(zhǔn)則的設(shè)置主要分為IP地址過濾、協(xié)議過濾、端口過濾三個方面,可分別進行設(shè)置,并通過CFile::Open(″../data/filter″,CFile::modeCreate|CFile::modeRead-Write)和CFiIe::Write(&m_Filter,sizeof(m_Filter))分別寫入配置文件。過濾準(zhǔn)則依照以下方式進行工作:
(1)當(dāng)數(shù)據(jù)包到達(dá)NIC時,對數(shù)據(jù)包的各級包頭進行協(xié)議分析。
(2)過濾準(zhǔn)則無設(shè)置時,默認(rèn)接收該準(zhǔn)則權(quán)限內(nèi)的所有數(shù)據(jù)包。
(3)若3個過濾準(zhǔn)則中的任一個有設(shè)置,數(shù)據(jù)包將依次與IP地址過濾準(zhǔn)則、協(xié)議過濾準(zhǔn)則、端口過濾準(zhǔn)則匹配,若存在一條準(zhǔn)則拒絕接收該數(shù)據(jù)包,并丟棄。
(4)如果一個數(shù)據(jù)包滿足所有數(shù)據(jù)包過濾準(zhǔn)則,則該數(shù)據(jù)包被提交給高層應(yīng)用。
4.3 數(shù)據(jù)包捕獲及過濾實現(xiàn)
當(dāng)過濾規(guī)則設(shè)置完成后,核心態(tài)的驅(qū)動程序就可以根據(jù)上層的要求來截獲數(shù)據(jù)包。具體步驟為:
(1)用戶態(tài)程序啟動驅(qū)動服務(wù)程序;
(2)用戶態(tài)程序調(diào)用CFile::Read(&m_Filter,sizeof(m_Filter))讀取過濾準(zhǔn)則;
(3)調(diào)用DeviceloControl(hFile,IOCTL_ENUM_ADAPTERS,NULL,0,buffer,MAX_ADAPTERS*256,&BytesTxd,NULL)從注冊表中獲取網(wǎng)絡(luò)適配器的信息,并顯示到用戶界面;
(4)用戶選擇適配器綁定并設(shè)置適配器為混雜模式;
(5)創(chuàng)建事件對象,接收數(shù)據(jù)包線程ReadProcessProc()和發(fā)送讀請求線程ReadRequestProc()使用事件機制來同步、協(xié)調(diào)工作,使得讀隊列不太長,也不為空;
(6)ReadRequestProc()調(diào)用WaitForSingleObject函數(shù)等待事件發(fā)生,當(dāng)讀請求隊列長度小于設(shè)定的最小長度時,調(diào)用SetEvent沒置事件為有信號狀態(tài),線程不斷地發(fā)出讀請求,保持驅(qū)動程序的讀隊列不為空,防止丟包發(fā)生;當(dāng)讀請求隊列長度超出設(shè)定的最大長度時,調(diào)用ResetEvent設(shè)置事件為無信號狀態(tài),線程停止發(fā)送讀請求;
(7)ReadProcessProc()檢查完成端口狀態(tài),有讀請求時,在PtReceive/PtReceivePacket函數(shù)中處理收到的數(shù)據(jù)包,當(dāng)有數(shù)據(jù)包符合所有的過濾條件時,將其復(fù)制到共享內(nèi)存,收取數(shù)據(jù)并按照過濾準(zhǔn)則考慮是否通知用戶界面程序讀取數(shù)據(jù);
(8)應(yīng)用層接到NDIS中間層驅(qū)動程序的事件通知后,獲取共享內(nèi)存隊列中的數(shù)據(jù),做進一步的處理,繼續(xù)循環(huán)等待。
5 結(jié) 語
采用本文介紹的設(shè)計思想,實現(xiàn)基于NDIS中間層驅(qū)動程序的網(wǎng)絡(luò)嗅探器,具有良好的結(jié)構(gòu)性、擴展性、并行性、效率性和可編程性,能夠?qū)W(wǎng)絡(luò)中的各層進行訪問,并且能收發(fā)基于這些層的各種協(xié)議數(shù)據(jù)包。該嗅探器運行于系統(tǒng)的核心層,最大限度地提高了系統(tǒng)的數(shù)據(jù)處理效率,在單位內(nèi)部網(wǎng)絡(luò)安全監(jiān)控以及網(wǎng)絡(luò)入侵檢測等方面發(fā)揮了重要的作用。
評論