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