• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

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

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

      鄒菊紅

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

      0 前言

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

      1 NDIS的介紹

      1.1 NDIS技術(shù)

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

      網(wǎng)絡封包截獲,涉及驅(qū)動編程技術(shù)、核心態(tài)編程技術(shù)、系統(tǒng)動態(tài)鏈接庫編程技術(shù)、協(xié)議生成與解析編程技術(shù)等,集中體現(xiàn)了網(wǎng)絡應用的核心技術(shù),是防火墻等高級網(wǎng)絡應用開發(fā)的基礎?;赪indows 2000和Windows XP的網(wǎng)絡封包截獲技術(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)絡傳輸?shù)墓δ芎瘮?shù)。IE等普通上層應用程序,調(diào)用WinScok2動態(tài)鏈接庫中的WSPSend、WSPRecv等函數(shù),實現(xiàn)網(wǎng)絡收、發(fā)功能。修改注冊表中 HKEY_LOCAL_MACHINE/SYSTM/CURRENTCONTROLS ET/SERVICES/WinSock2項,建立新的自定義WSPStartup入口函數(shù),可以重載winsock.dll。通過重載winsock.dll中的有關(guān)網(wǎng)絡收、發(fā)函數(shù),增加網(wǎng)絡封包收、發(fā)前、后的自定義處理功能,實現(xiàn)網(wǎng)絡封包截獲。

      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設備對象的形式供應用程序或其它系統(tǒng)程序調(diào)用。傳輸層過濾驅(qū)動程序創(chuàng)建一個或多個設備對象,直接掛接到TCP/IP設備對象之上。掛接成功后,當其它程序使用網(wǎng)絡傳輸功能,調(diào)用TCP/IP設備對象時,操作系統(tǒng)首先將該調(diào)用映射到TCP/IP設備對象之上所掛接的傳輸層過濾驅(qū)動程序。通過傳輸層過濾驅(qū)動程序,再調(diào)用下層的TCP/IP設備對象,從而完成網(wǎng)絡訪問功能。同樣,從TCP/IP層上傳至應用程序的網(wǎng)絡封包,也要經(jīng)傳輸層過濾驅(qū)動程序后,再轉(zhuǎn)發(fā)至目標應用程序端口?;诖斯ぷ髟?,可以在傳輸層過濾驅(qū)動程序中實現(xiàn)網(wǎng)絡封包截獲,完成網(wǎng)絡封包的過濾及加解密處理。

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

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

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

      根據(jù)前面的介紹,本文采用VC++程序進行設計實現(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ū)動程序用的(上層應用可以調(diào)用DeviceIoControl來對驅(qū)動程序的一些參數(shù)進行設置)。

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

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

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

      (6) 指定驅(qū)動程序的主功能(MajorFunction)代碼處理函數(shù)。它是一個數(shù)組,主要指定在上層應用調(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)卡建立一個設備對象。

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

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

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

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

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

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

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

      (10) 錯誤處理。

      2.3 I/O控制

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

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

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

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

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

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

      2.3.2 記錄上層應用程序的Start按鈕是否按下

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

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

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

      (3) 完成IRP,返回。

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

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

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

      (2) 取要設置的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) 設置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) 判斷請求是設置OID還是查詢OID,并針對相應的請求進行相應的變量設置。

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

      (6) 錯誤處理。

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

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

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

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

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

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

      當NIC從網(wǎng)絡上接收到數(shù)據(jù)并通知NDIS時,作為已經(jīng)在 protocolChar結(jié)構(gòu)中注冊過的函數(shù),NDIS將調(diào)用PacketReceiveIndicate或 PacketReceivePacket二者之一作為接收處理函數(shù)將NIC從網(wǎng)絡上接收到的數(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)絡數(shù)據(jù)包的截獲,經(jīng)過該項目的實際應用檢驗,結(jié)果表明,系統(tǒng)運行穩(wěn)定,為信息安全和數(shù)據(jù)安全提供了有效的保障,對網(wǎng)絡管理人員和網(wǎng)絡安全有很大的幫助。使網(wǎng)絡管理從原來的被動防御變成了現(xiàn)在的主動抵抗,從傳統(tǒng)觀念上也有了很大的改變,具有進一步研究的價值和廣闊的應用前景。

      [1]祁云嵩,劉永良,華偉.VC++程序設計解析與訓練[M]].華東理工大學出版社.2005.

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

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

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

      [5]宋金珂,高麗華,張迎新.VC++程序設計基礎教程[M].清華大學出版社.2010.

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

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

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

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

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

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

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

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

      猜你喜歡
      傳輸層封包驅(qū)動程序
      中藥封包在急診老年急性胃腸炎患者中的臨床應用
      基于Python語言的網(wǎng)絡傳輸層UDP協(xié)議攻擊性行為研究
      ZnO電子傳輸層在有機無機雜化鈣鈦礦太陽能電池中的應用
      陶瓷學報(2020年5期)2020-11-09 09:22:54
      護膚 巧用保鮮膜
      無沖突規(guī)則校園網(wǎng)絡安全系統(tǒng)的設計
      門窗(2019年12期)2019-04-20 16:06:52
      物聯(lián)網(wǎng)無線通信傳輸層動態(tài)通道保障機制
      基于物聯(lián)網(wǎng)GIS的消防智能巡檢系統(tǒng)設計與實現(xiàn)
      NS2條件網(wǎng)絡性能分析實踐
      電腦與電信(2013年1期)2013-08-06 02:14:52
      驅(qū)動程序更新與推薦
      驅(qū)動程序更新與推薦
      吴忠市| 惠安县| 中江县| 四平市| 海城市| 临邑县| 漳浦县| 海丰县| 威信县| 岑巩县| 乌什县| 尚义县| 凤城市| 宁城县| 盱眙县| 固镇县| 临江市| 开原市| 沧州市| 夏河县| 资中县| 措勤县| 什邡市| 永定县| 长治市| 合水县| 襄城县| 辽中县| 兰州市| 嘉鱼县| 呼伦贝尔市| 托克托县| 崇左市| 逊克县| 海晏县| 应用必备| 中阳县| 大渡口区| 交口县| 五寨县| 利津县|