新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于NDIS中間層驅(qū)動(dòng)程序的網(wǎng)絡(luò)嗅探器

基于NDIS中間層驅(qū)動(dòng)程序的網(wǎng)絡(luò)嗅探器

——
作者: 時(shí)間:2007-12-25 來源: 收藏

  1 引 言

  ()是利用計(jì)算機(jī)網(wǎng)絡(luò)接口截獲所需網(wǎng)絡(luò)內(nèi)部數(shù)據(jù)報(bào)文的一種工具,他廣泛地應(yīng)用于流量分析、安全監(jiān)控、網(wǎng)管分析、防火墻等的實(shí)現(xiàn)中。主要被用來在網(wǎng)絡(luò)上截獲位于協(xié)議模型中各個(gè)協(xié)議層次上的數(shù)據(jù)包,通過對(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),為滿足上述需求提供了充分的可能。

  2 的基本工作原理

  網(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)文后,通過對(duì)目的地址進(jìn)行檢查,來判斷是否是傳遞給自己的,如果是,則把報(bào)文傳遞給操作系統(tǒng);否則,將報(bào)文丟棄,不進(jìn)行處理;網(wǎng)卡存在一種特殊的工作模式,在這種工作模式下,網(wǎng)卡不對(duì)目的地址進(jìn)行判斷,而直接將他收到的所有報(bào)文都傳遞給操作系統(tǒng)進(jìn)行處理,這種特殊的工作模式,就稱之為混雜模式。網(wǎng)絡(luò)嗅探器通過將網(wǎng)卡設(shè)置為混雜模式來實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)的嗅探。

  一個(gè)實(shí)際的主機(jī)系統(tǒng)中,數(shù)據(jù)的收發(fā)是由網(wǎng)卡來完成的,當(dāng)網(wǎng)卡接收到傳輸來的數(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è)過程。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ò)嗅探器必須能夠接收并分析來自數(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)包過濾技術(shù)具有較高的結(jié)構(gòu)性和可擴(kuò)展性。從NDIS4.0開始,NDIS開始支持中間層驅(qū)動(dòng)程序(Intermediate Driver),為NDIS體系帶來了很多的靈活性,他是位于一個(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)過網(wǎng)卡發(fā)送到網(wǎng)絡(luò)和從網(wǎng)絡(luò)接收的數(shù)據(jù)包都要由此通過,因此中間層驅(qū)動(dòng)程序可以對(duì)所有網(wǎng)絡(luò)數(shù)據(jù)包進(jìn)行過濾和處理。從NDIS中間層在Windows中的位置來看,其處于核心層,處于與操作系統(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)卡,并通過NDIS庫調(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é)議,并通過NDIS庫調(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ī)則進(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é)過濾準(zhǔn)則的設(shè)置和數(shù)據(jù)包的處理分析。

  (2)數(shù)據(jù)包捕獲及過濾實(shí)現(xiàn)模塊:基于NDIS中間層驅(qū)動(dòng)程序完成底層數(shù)據(jù)的截獲功能,并依據(jù)數(shù)據(jù)包過濾準(zhǔn)則實(shí)現(xiàn)對(duì)數(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)用對(duì)數(shù)據(jù)包的分析處理負(fù)擔(dān)。數(shù)據(jù)包的過濾是對(duì)捕獲的數(shù)據(jù)包的報(bào)頭進(jìn)行分析,依據(jù)過濾準(zhǔn)則來決定數(shù)據(jù)包是否需要提交高層應(yīng)用進(jìn)行處理。

  過濾準(zhǔn)則的設(shè)置主要分為IP地址過濾、協(xié)議過濾、端口過濾三個(gè)方面,可分別進(jìn)行設(shè)置,并通過CFile::Open(″../data/filter″,CFile::modeCreate|CFile::modeRead-Write)和CFiIe::Write(&m_Filter,sizeof(m_Filter))分別寫入配置文件。過濾準(zhǔn)則依照以下方式進(jìn)行工作:

  (1)當(dāng)數(shù)據(jù)包到達(dá)NIC時(shí),對(duì)數(shù)據(jù)包的各級(jí)包頭進(jìn)行協(xié)議分析。

  (2)過濾準(zhǔn)則無設(shè)置時(shí),默認(rèn)接收該準(zhǔn)則權(quán)限內(nèi)的所有數(shù)據(jù)包。

  (3)若3個(gè)過濾準(zhǔn)則中的任一個(gè)有設(shè)置,數(shù)據(jù)包將依次與IP地址過濾準(zhǔn)則、協(xié)議過濾準(zhǔn)則、端口過濾準(zhǔn)則匹配,若存在一條準(zhǔn)則拒絕接收該數(shù)據(jù)包,并丟棄。

  (4)如果一個(gè)數(shù)據(jù)包滿足所有數(shù)據(jù)包過濾準(zhǔn)則,則該數(shù)據(jù)包被提交給高層應(yīng)用。

  4.3 數(shù)據(jù)包捕獲及過濾實(shí)現(xiàn)

  當(dāng)過濾規(guī)則設(shè)置完成后,核心態(tài)的驅(qū)動(dòng)程序就可以根據(jù)上層的要求來截獲數(shù)據(jù)包。具體步驟為:

  (1)用戶態(tài)程序啟動(dòng)驅(qū)動(dòng)服務(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)從注冊(cè)表中獲取網(wǎng)絡(luò)適配器的信息,并顯示到用戶界面;

  (4)用戶選擇適配器綁定并設(shè)置適配器為混雜模式;

  (5)創(chuàng)建事件對(duì)象,接收數(shù)據(jù)包線程ReadProcessProc()和發(fā)送讀請(qǐng)求線程ReadRequestProc()使用事件機(jī)制來同步、協(xié)調(diào)工作,使得讀隊(duì)列不太長,也不為空;

  (6)ReadRequestProc()調(diào)用WaitForSingleObject函數(shù)等待事件發(fā)生,當(dāng)讀請(qǐng)求隊(duì)列長度小于設(shè)定的最小長度時(shí),調(diào)用SetEvent沒置事件為有信號(hào)狀態(tài),線程不斷地發(fā)出讀請(qǐng)求,保持驅(qū)動(dòng)程序的讀隊(duì)列不為空,防止丟包發(fā)生;當(dāng)讀請(qǐng)求隊(duì)列長度超出設(shè)定的最大長度時(shí),調(diào)用ResetEvent設(shè)置事件為無信號(hào)狀態(tài),線程停止發(fā)送讀請(qǐng)求;

  (7)ReadProcessProc()檢查完成端口狀態(tài),有讀請(qǐng)求時(shí),在PtReceive/PtReceivePacket函數(shù)中處理收到的數(shù)據(jù)包,當(dāng)有數(shù)據(jù)包符合所有的過濾條件時(shí),將其復(fù)制到共享內(nèi)存,收取數(shù)據(jù)并按照過濾準(zhǔn)則考慮是否通知用戶界面程序讀取數(shù)據(jù);

  (8)應(yīng)用層接到NDIS中間層驅(qū)動(dòng)程序的事件通知后,獲取共享內(nèi)存隊(duì)列中的數(shù)據(jù),做進(jìn)一步的處理,繼續(xù)循環(huán)等待。

  5 結(jié) 語

  采用本文介紹的設(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)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉