亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        NDIS深層網(wǎng)絡(luò)封包截取研究

        2012-10-17 03:07:24鄒菊紅
        關(guān)鍵詞:傳輸層封包驅(qū)動程序

        鄒菊紅

        四川省水利職業(yè)技術(shù)學(xué)院 四川 611830

        0 前言

        隨著計算機技術(shù)和通信技術(shù)的飛速發(fā)展,網(wǎng)絡(luò)信息已滲透到社會生活的各個領(lǐng)域,隨之而來的安全問題也日益嚴重,一旦網(wǎng)絡(luò)安全問題發(fā)生,可能帶來非常嚴重后果。由于互聯(lián)網(wǎng)發(fā)展的歷史原因,TCP/IP 協(xié)議及 HTTP、FTP 等基于 TCP/IP 協(xié)議的各種應(yīng)用層協(xié)議,在協(xié)議設(shè)計之初均未考慮安全傳輸問題。隨著互聯(lián)網(wǎng)的發(fā)展,國際標準組織雖陸續(xù)推出了 SSL、HTTP1.1 等具有安全傳輸能力的應(yīng)用層協(xié)議,但作為應(yīng)用層承載協(xié)議的 TCP/IP 協(xié)議仍存在著固有的安全缺陷,造成至今未能有徹底的、低成本的、不需硬件支持的互聯(lián)網(wǎng)安全傳輸解決方案。正是由于網(wǎng)絡(luò)傳輸安全問題的現(xiàn)實存在,推動著黑客攻擊技術(shù)、防火墻技術(shù)的不斷發(fā)展。

        1 NDIS的介紹

        1.1 NDIS技術(shù)

        Microsoft網(wǎng)絡(luò)驅(qū)動程序接口規(guī)范(NDIS)的設(shè)計目的是通過將不同的協(xié)議從網(wǎng)絡(luò)接口卡上拆除,使得用戶可以訪問不同的協(xié)議。在設(shè)計過程中,協(xié)議并不需要了解關(guān)于網(wǎng)絡(luò)卡的任何信息。NDIS程序庫(NDIS.sys)提供了一個面向NIC驅(qū)動程序的完全抽象的接口,網(wǎng)卡驅(qū)動程序與協(xié)議層驅(qū)動程序及操作系統(tǒng)通過這個接口進行通信。

        網(wǎng)絡(luò)封包截獲,涉及驅(qū)動編程技術(shù)、核心態(tài)編程技術(shù)、系統(tǒng)動態(tài)鏈接庫編程技術(shù)、協(xié)議生成與解析編程技術(shù)等,集中體現(xiàn)了網(wǎng)絡(luò)應(yīng)用的核心技術(shù),是防火墻等高級網(wǎng)絡(luò)應(yīng)用開發(fā)的基礎(chǔ)。基于Windows 2000和Windows XP的網(wǎng)絡(luò)封包截獲技術(shù)主要分為三種: WinSock2 動態(tài)鏈接庫重載、傳輸層過濾驅(qū)動、中間層驅(qū)動。

        1.2 動態(tài)數(shù)據(jù)庫重載

        WinSock2動態(tài)鏈接庫重載:系統(tǒng)的WinScok2動態(tài)鏈接庫,隨系統(tǒng)啟動而載入內(nèi)存,提供 29個用于網(wǎng)絡(luò)傳輸?shù)墓δ芎瘮?shù)。IE等普通上層應(yīng)用程序,調(diào)用WinScok2動態(tài)鏈接庫中的WSPSend、WSPRecv等函數(shù),實現(xiàn)網(wǎng)絡(luò)收、發(fā)功能。修改注冊表中 HKEY_LOCAL_MACHINE/SYSTM/CURRENTCONTROLS ET/SERVICES/WinSock2項,建立新的自定義WSPStartup入口函數(shù),可以重載winsock.dll。通過重載winsock.dll中的有關(guān)網(wǎng)絡(luò)收、發(fā)函數(shù),增加網(wǎng)絡(luò)封包收、發(fā)前、后的自定義處理功能,實現(xiàn)網(wǎng)絡(luò)封包截獲。

        1.3 傳輸層過濾驅(qū)動

        傳輸層過濾驅(qū)動:使用 NDIS技術(shù),又稱 TDI編程(Transport Driver Interface傳輸層驅(qū)動接口編程)。Windows2000和WindowsXP中,TCP/IP協(xié)議作為系統(tǒng)驅(qū)動程序(../system32/TcpIp.sys),在系統(tǒng)啟動時載入系統(tǒng)內(nèi)存,以TCP/IP設(shè)備對象的形式供應(yīng)用程序或其它系統(tǒng)程序調(diào)用。傳輸層過濾驅(qū)動程序創(chuàng)建一個或多個設(shè)備對象,直接掛接到TCP/IP設(shè)備對象之上。掛接成功后,當其它程序使用網(wǎng)絡(luò)傳輸功能,調(diào)用TCP/IP設(shè)備對象時,操作系統(tǒng)首先將該調(diào)用映射到TCP/IP設(shè)備對象之上所掛接的傳輸層過濾驅(qū)動程序。通過傳輸層過濾驅(qū)動程序,再調(diào)用下層的TCP/IP設(shè)備對象,從而完成網(wǎng)絡(luò)訪問功能。同樣,從TCP/IP層上傳至應(yīng)用程序的網(wǎng)絡(luò)封包,也要經(jīng)傳輸層過濾驅(qū)動程序后,再轉(zhuǎn)發(fā)至目標應(yīng)用程序端口?;诖斯ぷ髟恚梢栽趥鬏攲舆^濾驅(qū)動程序中實現(xiàn)網(wǎng)絡(luò)封包截獲,完成網(wǎng)絡(luò)封包的過濾及加解密處理。

        1.4 中間層驅(qū)動概述

        中間層驅(qū)動:與傳輸層過濾驅(qū)動實現(xiàn)基本原理一致,也是使用 NDIS 技術(shù)。主要差別在于,中間層驅(qū)動程序,掛接在協(xié)議設(shè)備對象(包括 TCP/IP 設(shè)備對象)和網(wǎng)卡設(shè)備對象之間。任何進出網(wǎng)卡的網(wǎng)絡(luò)封包,均必須首先經(jīng)過中間層驅(qū)動程序的處理。從某種意義上分析,中間層驅(qū)動程序更像一個虛擬網(wǎng)卡。該虛擬卡封裝了物理網(wǎng)卡,對物理網(wǎng)卡的一切網(wǎng)絡(luò)訪問操作,均必須先經(jīng)虛擬卡處理。

        2 基于NDIS深層封包截取的設(shè)計與實現(xiàn)

        根據(jù)前面的介紹,本文采用VC++程序進行設(shè)計實現(xiàn)。

        2.1 初始化

        DriverEntry()函數(shù)是整個驅(qū)動程序的入口,它是在驅(qū)動程序被加載的時候由系統(tǒng)自動執(zhí)行的。這個函數(shù)里面主要是進行一些驅(qū)動程序初始化的操作。

        (1) 在Global結(jié)構(gòu)里面記錄函數(shù)傳入的RegisterPath參數(shù)。

        (2) 調(diào)用 IoCreateDevice為這個驅(qū)動程序創(chuàng)建一個DeviceObject,記錄在Globals.ControlDeviceObject里面,這個DeviceObject是為了今后控制這個驅(qū)動程序用的(上層應(yīng)用可以調(diào)用DeviceIoControl來對驅(qū)動程序的一些參數(shù)進行設(shè)置)。

        (3) 為上面所建立的 DeviceObject建立 SymbolLink。它的作用是為了讓上層的應(yīng)用程序可以調(diào)用到所建立的DeviceObject(由于 Windows的層次關(guān)系,上層應(yīng)用無法直接控制核心態(tài)的驅(qū)動程序,必須通過符號連接實現(xiàn)對核心的調(diào)用)。

        (4) 逐一設(shè)置protocolChar結(jié)構(gòu)中的每一個域。這些域一些是驅(qū)動程序所必需的版本號、名字等信息,另外一些是函數(shù)指針,它們指定了一些NDIS自動執(zhí)行的函數(shù)入口地址。這里指定的每一個函數(shù)在程序中必須有它的具體實現(xiàn)。

        (5) 調(diào)用NdisRegisterProtocol函數(shù)注冊這個驅(qū)動程序,這個函數(shù)執(zhí)行之后,這個驅(qū)動程序被加入到系統(tǒng)的設(shè)備列表中,以后的應(yīng)用程序可以使用這個驅(qū)動程序了。

        (6) 指定驅(qū)動程序的主功能(MajorFunction)代碼處理函數(shù)。它是一個數(shù)組,主要指定在上層應(yīng)用調(diào)用 CreateFile,ReadFile, WriteFile, DeviceIoControl和CloseHandle等函數(shù)的時候,下層驅(qū)動程序怎樣處理。

        (7) 指定驅(qū)動程序卸載時候的處理函數(shù)。

        (8) 返回,如果遇到錯誤,進行錯誤處理。錯誤處理的主要內(nèi)容就是判斷錯誤出現(xiàn)的位置以及已經(jīng)分配的資源,對已經(jīng)分配的資源進行釋放。

        2.2 綁定

        PacketBindAdapter()函數(shù)是驅(qū)動程序中必不可少的函數(shù),它是操作系統(tǒng)自動調(diào)用的函數(shù)。在驅(qū)動程序加載的時候,操作系統(tǒng)自動查找當前機器上安裝的網(wǎng)卡驅(qū)動程序,并對每一個網(wǎng)卡自動運行這個函數(shù),其目的是在驅(qū)動程序中對每個網(wǎng)卡進行記錄,以備以后的使用。因此,這個函數(shù)中的主要內(nèi)容就是實現(xiàn)對網(wǎng)卡的登記注冊。

        (1) 從DeviceName中取得網(wǎng)卡的名字,并分配空間存儲起來。

        (2) 調(diào)用IoCreateDevice為這個網(wǎng)卡建立一個設(shè)備對象。

        (3) 創(chuàng)建 deviceobject->deviceExtention 為 Open_Instance結(jié)構(gòu),用來記錄這個設(shè)備一切信息。

        (4) 為這個設(shè)備對象建立符號聯(lián)接。

        (5) 調(diào)用NdisAllocatePacketPool為這個設(shè)備分配包緩沖池。

        (6) 初始化Open_Instance結(jié)構(gòu)(open變量)的一些域。

        (7) 調(diào)用NdisOpenAdapter完成這個設(shè)備的初始化工作。

        (8) 設(shè)置Open_Instance結(jié)構(gòu)中的一些域的初值。

        (9) 把這個設(shè)備加入到Globals.AdapterList的隊列中去。

        (10) 錯誤處理。

        2.3 I/O控制

        實現(xiàn)對驅(qū)動程序以及它所綁定的設(shè)備的控制。究竟是對驅(qū)動程序本身還是對它綁定的設(shè)備是由傳入的參數(shù)DeviceObject決定,如果它等于Global->ControlDeviceObject,那么它就是對驅(qū)動程序的控制,否則是對指定綁定設(shè)備的控制。程序開始,首先確定控制類型。由于用戶態(tài)和核心態(tài)程序的信息交換是通過IRP來實現(xiàn)的,所以這個功能代碼是存放在IRP的IO堆棧單元中。

        2.3.1 枚舉網(wǎng)絡(luò)適配器

        主要是通過PacketGetAdapterList函數(shù)來實現(xiàn)。這個功能在PacketIoControl函數(shù)中實現(xiàn)以下功能。

        (1) 判斷設(shè)備變量是否為全局控制設(shè)備變量,如不是,說明上層調(diào)用錯誤。返回錯誤信息。

        (2) 調(diào)用PacketGetAdapterList尋找網(wǎng)絡(luò)適配器列表,放到輸出緩沖區(qū)中。

        (3) 執(zhí)行標準語句組完成IRP。

        2.3.2 記錄上層應(yīng)用程序的Start按鈕是否按下

        這個功能主要通過修改設(shè)備結(jié)構(gòu)中的變量Start來實現(xiàn)。

        (1) 取設(shè)備信息結(jié)構(gòu)變量。

        (2) 判斷Start域的值,根據(jù)要求修改。

        (3) 完成IRP,返回。

        2.3.3 設(shè)置緩沖區(qū)大小

        這個功能的實現(xiàn)主要是通過修改設(shè)備結(jié)構(gòu)中的變量bufsize來實現(xiàn)。

        (1) 取設(shè)備信息結(jié)構(gòu)變量。

        (2) 取要設(shè)置的bufsize的值,修改open->bufsize。

        (3) 完成IRP,返回。

        2.3.4 重置適配器

        這個功能主要是調(diào)用系統(tǒng)函數(shù)NdisReset來實現(xiàn)。不過在此之前,這個函數(shù)把當前的這個重置請求加入到了ResetIrpList中,這樣做的目的主要是幫助PacketResetComplete函數(shù)找到IRP。

        注意,當NDIS執(zhí)行完Reset操作要完成IRP的時候,它必須知道是哪個IRP要求的Reset操作。而IRP是作為參數(shù)傳到PacketIoControl函數(shù)中的,PacketResetComplete無法知道這個 IRP。這樣就需要一個數(shù)據(jù)結(jié)構(gòu)記錄這個 IRP,這個數(shù)據(jù)結(jié)構(gòu)就是ResetIrpList。在PacketIoControl函數(shù)中,把當前IRP加入到ResetIrpList中,然后執(zhí)行NdisReset后馬上返回。過了一段時間,Reset操作完成,NDIS自動調(diào)用PacketResetComplete函數(shù),從ResetIrpList取出這個IRP,執(zhí)行標準語句組,完成IRP。

        2.3.5 實現(xiàn)NDIS請求

        NDIS請求主要有兩類。(1) 設(shè)置OID;(2) 查詢OID。

        這兩個功能主要是通過調(diào)用系統(tǒng)函數(shù)NdisRequest實現(xiàn)。

        (1) 從系統(tǒng)緩沖區(qū)中取出要進行操作的OID結(jié)構(gòu)。

        (2) 分配一個 pRequest變量,用來存儲 IRP和當前的Request內(nèi)容(OID的內(nèi)容)。

        (3) 判斷OID的數(shù)據(jù)結(jié)構(gòu)長度是否正確。

        (4) 判斷請求是設(shè)置OID還是查詢OID,并針對相應(yīng)的請求進行相應(yīng)的變量設(shè)置。

        (5) 調(diào)用 NdisRequest。

        (6) 錯誤處理。

        (7) 類似Reset請求,如果NdisRequest已經(jīng)完成,那么驅(qū)動程序要顯式的調(diào)用PacketRequestComplete函數(shù)完成IRP。

        2.4 數(shù)據(jù)接收

        自然的設(shè)計思想是每當上層應(yīng)用程序請求讀取數(shù)據(jù)時,就為該請求生成一個相應(yīng)的IRP,并將此IRP置于一個讀取等待隊列之中。當NIC從網(wǎng)絡(luò)上接收到數(shù)據(jù)包時,由NDIS負責(zé)調(diào)用相應(yīng)的接收函數(shù)。接收函數(shù)從讀取等待隊列的首部取出一個 IRP,并將從網(wǎng)絡(luò)上接收到的數(shù)據(jù)拷貝到由該 IRP所指定的緩沖區(qū)中。至此,上層應(yīng)用程序便成功接收到了它所需要的數(shù)據(jù)。

        這種接收方式的天生缺陷就是丟包。如果上層應(yīng)用程序一直沒有讀取數(shù)據(jù)的請求,那么NIC從網(wǎng)絡(luò)上接收到的數(shù)據(jù)就會直接被丟棄。

        本程序的設(shè)計思路是協(xié)議驅(qū)動程序負責(zé)維護一個接收緩沖區(qū),該緩沖區(qū)以隊列的形式組織。當NIC通知NDIS已從網(wǎng)絡(luò)上接收到數(shù)據(jù)包時,可以先將這些數(shù)據(jù)緩存起來。當上層應(yīng)用程序需要讀取數(shù)據(jù)時,該讀操作的數(shù)據(jù)源不是直接從網(wǎng)絡(luò)得到,而是經(jīng)過有效管理的存放著數(shù)據(jù)的緩沖區(qū)。這樣,丟包的問題便得以解決。

        當然,如果上層應(yīng)用程序還是一直沒有讀取數(shù)據(jù)的請求,或者上層應(yīng)用程序處理數(shù)據(jù)的速度低于NIC從網(wǎng)絡(luò)上接收數(shù)據(jù)的速度,再或者網(wǎng)絡(luò)出現(xiàn)峰值流量時,緩沖區(qū)自然會逐漸被填滿,最終還是會出現(xiàn)丟包的情況。但是在正常情況下,這種增設(shè)緩沖的方法已經(jīng)足以避免丟包情況的發(fā)生了。

        當NIC從網(wǎng)絡(luò)上接收到數(shù)據(jù)并通知NDIS時,作為已經(jīng)在 protocolChar結(jié)構(gòu)中注冊過的函數(shù),NDIS將調(diào)用PacketReceiveIndicate或 PacketReceivePacket二者之一作為接收處理函數(shù)將NIC從網(wǎng)絡(luò)上接收到的數(shù)據(jù)緩存起來。其中,PacketReceiveIndicate作為協(xié)議驅(qū)動程序的 ProtocolReceive函數(shù)是必須要提供的,而PacketReceivePacket作為協(xié)議驅(qū)動程序的ProtocolReceivePacket函數(shù)提供與否是可選的。二者的主要區(qū)別在于當 NIC支持一次接收多個數(shù)據(jù)包時使用ProtocolReceivePacket更富效率。

        2.5 解碼引擎接口實現(xiàn)

        CPDEDecodeEngine提供解碼所有字段、解碼概要信息、解碼字段,共三種方式解碼接口。

        以下引自CSPDEOBJ.h頭文件中對該類的定義,提供給模塊用戶的主要功能。

        2.6 解碼引擎類的實現(xiàn)

        3 結(jié)束語

        本文對NDIS中間層驅(qū)動程序進行擴展研究,實現(xiàn)了對底層的網(wǎng)絡(luò)數(shù)據(jù)包的截獲,經(jīng)過該項目的實際應(yīng)用檢驗,結(jié)果表明,系統(tǒng)運行穩(wěn)定,為信息安全和數(shù)據(jù)安全提供了有效的保障,對網(wǎng)絡(luò)管理人員和網(wǎng)絡(luò)安全有很大的幫助。使網(wǎng)絡(luò)管理從原來的被動防御變成了現(xiàn)在的主動抵抗,從傳統(tǒng)觀念上也有了很大的改變,具有進一步研究的價值和廣闊的應(yīng)用前景。

        [1]祁云嵩,劉永良,華偉.VC++程序設(shè)計解析與訓(xùn)練[M]].華東理工大學(xué)出版社.2005.

        [2]孫鑫,余安萍.VC++深入詳解[M].電子工業(yè)出版社.2006.

        [3]辛長安,梅林編著.VC++編程技術(shù)與難點剖析[M].清華大學(xué)出版社.2002.

        [4]張忠?guī)浘幹?VC++ 2008專題應(yīng)用程序開發(fā)實例精講[M].電子工業(yè)出版社.2008.

        [5]宋金珂,高麗華,張迎新.VC++程序設(shè)計基礎(chǔ)教程[M].清華大學(xué)出版社.2010.

        [6]賈振華.VC++程序設(shè)計項目實踐[M],清華大學(xué)出版社.2010.

        [7]張惠娟.Windows環(huán)境下的設(shè)備驅(qū)動程序設(shè)計.西安電子科技大學(xué)出版社.2009.

        [8]斯諾譯.Windows2000設(shè)備驅(qū)動程序設(shè)計指南.北京:機械工業(yè)出版社.2006.

        [9]李德全.拒絕服務(wù)攻擊[M].電子工業(yè)出版社.2007.

        [10]冀振燕.UML 系統(tǒng)分析與設(shè)計教程[M].人民郵電出版社.2010.

        [11]李雙華.C++編程思想[M].電子工業(yè)出版社.2009.

        [12]陳宗斌等譯,Michael J.Donahoo Kenneth L.Calvert著.TCP/IPSockets編程[M].清華大學(xué)出版社.2009.

        [13]TCP-IP詳解卷3:TCP事務(wù)協(xié)議,HTTP,NNTP和UNIX域協(xié)議.2009.

        猜你喜歡
        傳輸層封包驅(qū)動程序
        中藥封包在急診老年急性胃腸炎患者中的臨床應(yīng)用
        基于Python語言的網(wǎng)絡(luò)傳輸層UDP協(xié)議攻擊性行為研究
        ZnO電子傳輸層在有機無機雜化鈣鈦礦太陽能電池中的應(yīng)用
        護膚 巧用保鮮膜
        無沖突規(guī)則校園網(wǎng)絡(luò)安全系統(tǒng)的設(shè)計
        門窗(2019年12期)2019-04-20 16:06:52
        物聯(lián)網(wǎng)無線通信傳輸層動態(tài)通道保障機制
        基于物聯(lián)網(wǎng)GIS的消防智能巡檢系統(tǒng)設(shè)計與實現(xiàn)
        NS2條件網(wǎng)絡(luò)性能分析實踐
        電腦與電信(2013年1期)2013-08-06 02:14:52
        驅(qū)動程序更新與推薦
        驅(qū)動程序更新與推薦
        99久久精品国产一区二区蜜芽| 蜜桃av噜噜一区二区三区策驰| 少妇伦子伦精品无吗 | 精品人妻码一区二区三区剧情| 色妞ww精品视频7777| 奇米狠狠色| 抖射在线免费观看视频网站| 亚洲av综合色区一区二区| 国产色xx群视频射精| 国产亚洲精品aaaa片app| 国产av一区二区凹凸精品| 小池里奈第一部av在线观看| 日韩人妻无码一区二区三区久久| 亚洲妓女综合网99| 蜜桃av多人一区二区三区| 亚洲天堂一区二区偷拍| 国产超碰人人爽人人做人人添| 首页动漫亚洲欧美日韩| 玩弄极品少妇被弄到高潮| 亚洲国产精品av在线| 久久精品国产精品国产精品污| 亚洲AV一二三四区四色婷婷| 亚洲天堂一区二区三区视频| 亚洲综合网国产精品一区| 成在人线av无码免观看麻豆| 成人国产在线观看高清不卡| 亚洲国产av综合一区| 国产精品无码一区二区在线观一| 亚洲av无码资源在线观看 | 中文字幕一区二区三区综合网| 欧美性xxxxx极品老少| 无遮挡边吃摸边吃奶边做| 精品999无码在线观看| 日本久久久免费观看视频| 国产成人亚洲精品| 天天狠天天透天干天天| 永久免费看黄网站性色| 熟妇熟女乱妇乱女网站| 最新国产一区二区精品久久| 97自拍视频国产在线观看 | 日韩乱码视频|