基于NDIS中間層驅動(dòng)程序的網(wǎng)絡(luò )嗅探器
1 引 言
網(wǎng)絡(luò )嗅探器(Sniffer)是利用計算機網(wǎng)絡(luò )接口截獲所需網(wǎng)絡(luò )內部數據報文的一種工具,他廣泛地應用于流量分析、安全監控、網(wǎng)管分析、防火墻等的實(shí)現中。Sniffer主要被用來(lái)在網(wǎng)絡(luò )上截獲位于OSI協(xié)議模型中各個(gè)協(xié)議層次上的數據包,通過(guò)對截獲數據包的分析,嗅探器可以掌握目標主機的信息。由于與具體平臺的網(wǎng)絡(luò )協(xié)議棧密切相關(guān),并涉及網(wǎng)絡(luò )安全的敏感問(wèn)題,網(wǎng)絡(luò )嗅探一般沒(méi)有通用的實(shí)現方法。
隨著(zhù)計算機網(wǎng)絡(luò )應用的普及,和Windows 2000/XP網(wǎng)絡(luò )操作系統的廣泛應用,使得在Window 2000/XP下保障網(wǎng)絡(luò )通信安全成為一個(gè)迫切需要解決的問(wèn)題。本文基于NDIS中間層驅動(dòng)程序實(shí)現網(wǎng)絡(luò )嗅探器,為滿(mǎn)足上述需求提供了充分的可能。
2 網(wǎng)絡(luò )嗅探器的基本工作原理
網(wǎng)絡(luò )嗅探器利用的是共享式的網(wǎng)絡(luò )傳輸介質(zhì)。共享即意味著(zhù)網(wǎng)絡(luò )中的一臺機器可以嗅探到傳遞給本網(wǎng)段(沖突域)中的所有機器的報文。例如最常見(jiàn)的以太網(wǎng)就是一種共享式的網(wǎng)絡(luò )技術(shù),以太網(wǎng)卡收到報文后,通過(guò)對目的地址進(jìn)行檢查,來(lái)判斷是否是傳遞給自己的,如果是,則把報文傳遞給操作系統;否則,將報文丟棄,不進(jìn)行處理;網(wǎng)卡存在一種特殊的工作模式,在這種工作模式下,網(wǎng)卡不對目的地址進(jìn)行判斷,而直接將他收到的所有報文都傳遞給操作系統進(jìn)行處理,這種特殊的工作模式,就稱(chēng)之為混雜模式。網(wǎng)絡(luò )嗅探器通過(guò)將網(wǎng)卡設置為混雜模式來(lái)實(shí)現對網(wǎng)絡(luò )的嗅探。
一個(gè)實(shí)際的主機系統中,數據的收發(fā)是由網(wǎng)卡來(lái)完成的,當網(wǎng)卡接收到傳輸來(lái)的數據包時(shí),網(wǎng)卡內的單片程序首先解析數據包的目的網(wǎng)卡物理地址,然后根據網(wǎng)卡驅動(dòng)程序設置的接收模式判斷該不該接收,認為該接收就產(chǎn)生中斷信號通知CPU,認為不該接收就丟掉數據包,所以不該接收的數據包就被網(wǎng)卡截斷了,上層應用根本就不知道這個(gè)過(guò)程。CPU如果得到網(wǎng)卡的中斷信號,則根據網(wǎng)卡的驅動(dòng)程序設置的網(wǎng)卡中斷程序地址調用驅動(dòng)程序接收數據,并將接收的數據交給上層協(xié)議軟件處理。
3 NDIS中間層驅動(dòng)程序
訪(fǎng)問(wèn)位于網(wǎng)絡(luò )底層的傳輸協(xié)議是網(wǎng)絡(luò )嗅探器的基本功能。網(wǎng)絡(luò )嗅探器必須能夠接收并分析來(lái)自數據鏈路層、網(wǎng)絡(luò )層、傳輸層等底層的數據包,本文介紹的網(wǎng)絡(luò )嗅探器采用了網(wǎng)絡(luò )驅動(dòng)程序接口規范(NDIS)中間層驅動(dòng)程序技術(shù)設計。
NDIS是Windows網(wǎng)絡(luò )協(xié)議棧構件間的接口規范,基于NDIS的核心態(tài)包過(guò)濾技術(shù)具有較高的結構性和可擴展性。從NDIS4.0開(kāi)始,NDIS開(kāi)始支持中間層驅動(dòng)程序(Intermediate Driver),為NDIS體系帶來(lái)了很多的靈活性,他是位于一個(gè)或者多個(gè)NIC驅動(dòng)之上和傳輸層驅動(dòng)之下的驅動(dòng)程序,即位于鏈路層和協(xié)議層之間,對上面的協(xié)議層提供一個(gè)虛擬的微端口網(wǎng)卡驅動(dòng)接口(MiniportDriver),而對下面的鏈路層則提供一個(gè)協(xié)議驅動(dòng)接口(Protocol Driver)。所有經(jīng)過(guò)網(wǎng)卡發(fā)送到網(wǎng)絡(luò )和從網(wǎng)絡(luò )接收的數據包都要由此通過(guò),因此中間層驅動(dòng)程序可以對所有網(wǎng)絡(luò )數據包進(jìn)行過(guò)濾和處理。從NDIS中間層在Windows中的位置來(lái)看,其處于核心層,處于與操作系統同等級別的核心態(tài),如圖1所示。

本文使用微軟提供的驅動(dòng)程序開(kāi)發(fā)包DDK進(jìn)行NDIS中間層驅動(dòng)程序編程。具體流程為:
(1)NDIS驅動(dòng)程序在主入口函數DirverEntry中調用NdisMinitializeWrapper函數注冊輸出函數集入口,得到設備句柄;
(2)輸入(1)得到的句柄調用NdisIMRegisterLayeredMiniport,為NDIS中間層驅動(dòng)程序注冊一套Miniport回調函數,這樣上層Protocol協(xié)議就認為中間層驅動(dòng)程序是網(wǎng)卡,并通過(guò)NDIS庫調用這些回調函數;
(3)調用NdisRegisterProtocol,為NDIS中間層驅動(dòng)程序注冊一套Protocol回調函數,這樣下層網(wǎng)卡就認為中間層驅動(dòng)程序是一個(gè)協(xié)議,并通過(guò)NDIS庫調用這些函數;
(4)當操作系統發(fā)現NIC時(shí),NDIS調用中間層驅動(dòng)程序注冊的ProtocolAdapterBind函數,該函數內部需要調用NdisOpenAdapt打開(kāi)適配器,保證了網(wǎng)卡和中間層的綁定關(guān)系;
(5)調用PtReceivePacket接收網(wǎng)卡收到的數據包;
(6)數據包與所設置過(guò)濾規則進(jìn)行比較,不滿(mǎn)足規則時(shí)調用函數返回NDIS_STATUS_NOT_ACCEPTED,該宏在ndis.h中定義,這樣就結束了本接收函數的調用。
4 基于NDIS中間層驅動(dòng)程序的網(wǎng)絡(luò )嗅探器實(shí)現
4.1 網(wǎng)絡(luò )嗅探器的結構模型
本文實(shí)現的網(wǎng)絡(luò )嗅探器主要由運行于Ring0層的NDIS中間層驅動(dòng)程序模塊和運行于Ring3層的應用層包處理模塊構成。在Windows 2000平臺下實(shí)現了對流經(jīng)指定網(wǎng)絡(luò )適配器的各種網(wǎng)絡(luò )協(xié)議、任意/指定IP地址和端口的數據包的嗅探,如圖2所示。

(1)應用層包處理模塊:處于應用層,負責過(guò)濾準則的設置和數據包的處理分析。
(2)數據包捕獲及過(guò)濾實(shí)現模塊:基于NDIS中間層驅動(dòng)程序完成底層數據的截獲功能,并依據數據包過(guò)濾準則實(shí)現對數據包的接收過(guò)濾,向上層應用程序遞交數據包。
{{分頁(yè)}}
4.2 應用層包過(guò)濾準則設置
網(wǎng)絡(luò )嗅探器中采用包過(guò)濾技術(shù)的目的主要是為了有選擇地接收網(wǎng)絡(luò )數據包,屏蔽偵聽(tīng)者不關(guān)心的網(wǎng)絡(luò )數據包,從而提高系統的監聽(tīng)效率,減輕高層應用對數據包的分析處理負擔。數據包的過(guò)濾是對捕獲的數據包的報頭進(jìn)行分析,依據過(guò)濾準則來(lái)決定數據包是否需要提交高層應用進(jìn)行處理。
過(guò)濾準則的設置主要分為IP地址過(guò)濾、協(xié)議過(guò)濾、端口過(guò)濾三個(gè)方面,可分別進(jìn)行設置,并通過(guò)CFile::Open(″../data/filter″,CFile::modeCreate|CFile::modeRead-Write)和CFiIe::Write(&m_Filter,sizeof(m_Filter))分別寫(xiě)入配置文件。過(guò)濾準則依照以下方式進(jìn)行工作:
(1)當數據包到達NIC時(shí),對數據包的各級包頭進(jìn)行協(xié)議分析。
(2)過(guò)濾準則無(wú)設置時(shí),默認接收該準則權限內的所有數據包。
(3)若3個(gè)過(guò)濾準則中的任一個(gè)有設置,數據包將依次與IP地址過(guò)濾準則、協(xié)議過(guò)濾準則、端口過(guò)濾準則匹配,若存在一條準則拒絕接收該數據包,并丟棄。
(4)如果一個(gè)數據包滿(mǎn)足所有數據包過(guò)濾準則,則該數據包被提交給高層應用。
4.3 數據包捕獲及過(guò)濾實(shí)現
當過(guò)濾規則設置完成后,核心態(tài)的驅動(dòng)程序就可以根據上層的要求來(lái)截獲數據包。具體步驟為:
(1)用戶(hù)態(tài)程序啟動(dòng)驅動(dòng)服務(wù)程序;
(2)用戶(hù)態(tài)程序調用CFile::Read(&m_Filter,sizeof(m_Filter))讀取過(guò)濾準則;
(3)調用DeviceloControl(hFile,IOCTL_ENUM_ADAPTERS,NULL,0,buffer,MAX_ADAPTERS*256,&BytesTxd,NULL)從注冊表中獲取網(wǎng)絡(luò )適配器的信息,并顯示到用戶(hù)界面;
(4)用戶(hù)選擇適配器綁定并設置適配器為混雜模式;
(5)創(chuàng )建事件對象,接收數據包線(xiàn)程ReadProcessProc()和發(fā)送讀請求線(xiàn)程ReadRequestProc()使用事件機制來(lái)同步、協(xié)調工作,使得讀隊列不太長(cháng),也不為空;
(6)ReadRequestProc()調用WaitForSingleObject函數等待事件發(fā)生,當讀請求隊列長(cháng)度小于設定的最小長(cháng)度時(shí),調用SetEvent沒(méi)置事件為有信號狀態(tài),線(xiàn)程不斷地發(fā)出讀請求,保持驅動(dòng)程序的讀隊列不為空,防止丟包發(fā)生;當讀請求隊列長(cháng)度超出設定的最大長(cháng)度時(shí),調用ResetEvent設置事件為無(wú)信號狀態(tài),線(xiàn)程停止發(fā)送讀請求;
(7)ReadProcessProc()檢查完成端口狀態(tài),有讀請求時(shí),在PtReceive/PtReceivePacket函數中處理收到的數據包,當有數據包符合所有的過(guò)濾條件時(shí),將其復制到共享內存,收取數據并按照過(guò)濾準則考慮是否通知用戶(hù)界面程序讀取數據;
(8)應用層接到NDIS中間層驅動(dòng)程序的事件通知后,獲取共享內存隊列中的數據,做進(jìn)一步的處理,繼續循環(huán)等待。
5 結 語(yǔ)
采用本文介紹的設計思想,實(shí)現基于NDIS中間層驅動(dòng)程序的網(wǎng)絡(luò )嗅探器,具有良好的結構性、擴展性、并行性、效率性和可編程性,能夠對網(wǎng)絡(luò )中的各層進(jìn)行訪(fǎng)問(wèn),并且能收發(fā)基于這些層的各種協(xié)議數據包。該嗅探器運行于系統的核心層,最大限度地提高了系統的數據處理效率,在單位內部網(wǎng)絡(luò )安全監控以及網(wǎng)絡(luò )入侵檢測等方面發(fā)揮了重要的作用。
評論