NDIS網(wǎng)絡(luò)防火墻開發(fā)體會總結(jié).doc_第1頁
NDIS網(wǎng)絡(luò)防火墻開發(fā)體會總結(jié).doc_第2頁
NDIS網(wǎng)絡(luò)防火墻開發(fā)體會總結(jié).doc_第3頁
NDIS網(wǎng)絡(luò)防火墻開發(fā)體會總結(jié).doc_第4頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、NDIS 網(wǎng)絡(luò)防火墻開發(fā)實(shí)踐體會總結(jié)一、 window 軟件防火墻開發(fā)概述:在 window 下開發(fā)軟件防火墻能夠?qū)崿F(xiàn): NDIS 數(shù)據(jù)包的截獲、 NDIS 數(shù)據(jù)包的抓取、 NDIS 數(shù)據(jù)包的分析、 NDIS 數(shù)據(jù)包過濾、 NDIS 驅(qū)動對 IP 與 port 的過濾、 NDIS 中間層驅(qū)動安裝技術(shù)等。 本文對 NDIS 開發(fā)大體流程、 NDIS 開發(fā)注意事項(xiàng)、 NDIS 安裝進(jìn)程中顯現(xiàn)的各類問題都給予詳細(xì)說明,希望對做 NDIS 開發(fā)程序員有所幫忙。目前能夠?qū)崿F(xiàn)軟件防火墻的方式有:( 1) SOCKET 端口形式。( 2) NDIS 中間驅(qū)動 IPHOOK 形式( xp/2003 )。( 3

2、) NDIS 中間驅(qū)動 miniport 形式( xp/2003/vista/win7/win2020 )。三種形式從開發(fā)難度到利用范圍都有自身的特點(diǎn)。( 4 ) SOCKET 形式是面向應(yīng)用層開發(fā)的,在代碼及調(diào)試方面相對后兩種簡單的多,但SOCKET 形式不能捕捉所有數(shù)據(jù)包,因此用 socket 開發(fā)防火墻不是最好的選擇。( 5)后兩種屬于NDIS 中間驅(qū)動程序開發(fā),是面向驅(qū)動層(底層 )開發(fā),代碼編寫及調(diào)試較socket 形式上難。(說明:可能大部份采納高級語言程序員全然都沒接觸過驅(qū)動開發(fā))但 NDIS 形式能夠捕捉到所有通過網(wǎng)卡的數(shù)據(jù)包( NDIS 中間驅(qū)動是插入到協(xié)議層與網(wǎng)卡驅(qū)動層的中

3、間驅(qū)動程序因此數(shù)據(jù)必需通過)。因此本文作者建議采納NDIS 開發(fā)軟件網(wǎng)絡(luò)防火墻。二、 DNIS 中間驅(qū)動開發(fā)注意事項(xiàng):NDIS 中間驅(qū)動程序開發(fā)window用的 window 版本有 window200 、防火墻要注意windowwindow200 server 、版本問題,因?yàn)槟壳坝脩衾鹷indow xp 、 window2003 、window vistawindow 7 、 windown 2008 server 。你采納的NDIS 開發(fā)技術(shù)直接決定是不是能在不同window版本上運(yùn)行,這是很關(guān)鍵的問題。目前作者明白的NDIS防火墻技術(shù)有兩種:. IP_FIREWALL_HOOK(NDI

4、S防火墻鉤子技術(shù)適合XP/2003) 。( 1)這種技術(shù)的特點(diǎn):相對miniport 的開發(fā)、測試、安裝簡單些。( 2)安裝步驟簡單見四:能夠采納注冊表注冊后用net start 啟動,也能夠采納:OpenService、CreateService、StartService 等函數(shù)創(chuàng)建效勞形式啟動驅(qū)動具體用法請查詢msdn 幫忙 )( 3)比較典型的案例:此種方式對 window vista 之前 window2000 以后的操作系統(tǒng)是沒有任何問題。通過作者的開發(fā)測試,關(guān)于window vista 以后的產(chǎn)品向 window 7 window2020 是不支持的(這點(diǎn)必然要注意) 。那個地址網(wǎng)

5、上有許多評論有人說還支持,但本文作者給出答案是不支持, 理由msdn 中有如此一句話 : Note: Starting with Windows Vista,do not implementfilter-hook or firewall-hook drivers. UseWindows FilteringPlatform CalloutDrivers instead.翻譯成中文可能意思:從vista 以后再也不支持 ”filter-hook ”,請利用 )。( 4) 你 能 夠 在 window 7 或 window2020 測 試 下 你 的 鉤 子 防 火 墻 在status=IoCall

6、Driver 加入 dbprint 代碼用截獲 status 的值你會發(fā)此刻2000、 xp、2003 下返回 0 一切正常, 在 vista、win7 、2020 下返回 0xc0000002- 0xc000000d的任意值。因此鉤子防火墻在vista 及以后的版本是不能實(shí)現(xiàn)的。因此作者建議在vista 以后的版本就要用IP HOOK( ipfirewall)浪費(fèi)時(shí)刻啦。(miniport protocol) 中間驅(qū)動技術(shù) (XP/2003/vista/win7/2020) 。這種形式在2000、 xp、2003、vista、 win7 、2020 下都能夠現(xiàn)實(shí),但原理和代碼實(shí)現(xiàn)上要比鉤子復(fù)

7、雜的多,安裝測試也比較麻煩。典型列子是ddk 源文件途徑下的passthru 項(xiàng)目。但我開發(fā)那個項(xiàng)目后,總結(jié)下 NDIS 開發(fā)其實(shí)并非是很難只是以前對這方面知識缺乏已。三、 NDIS 程序結(jié)構(gòu):. DriverEntry 函數(shù):那個函數(shù)必需存在,它是 window 驅(qū)動的入口函數(shù)(與 miniport 都必需概念的函數(shù),在驅(qū)動安裝啟動是執(zhí)行)。IPHOOK.那個函數(shù)有兩個參數(shù):IN PDRIVER_OBJECTDriverObject,IN PUNICODE_STRINGRegistryPath。. DriverEntry 內(nèi)部經(jīng)常使用代碼:NdisMInitializeWrapper (中間

8、驅(qū)動miniport ):初始化小端口時(shí)會用到這連個參數(shù)。IoCreateDevice (鉤子驅(qū)動IPHOOK ):成立 IO 設(shè)備時(shí)會用到。.成立 miniport 與 protocol 端口(中間驅(qū)動miniport ):NDIS_PROTOCOL_CHARACTERISTICSPChars;NDIS_MINIPORT_CHARACTERISTICSMChars;并別離設(shè)置PChars、 MChars 一系列屬性參數(shù)指定處置函數(shù)。那個地址有幾個很重要的屬性在開發(fā)防火墻程序中很重要我說明下其它參數(shù)見幫忙文檔。DDK= 自概念截獲發(fā)送函數(shù)=自概念截獲同意函數(shù)=自概念截獲同意函數(shù);1;2;(說明

9、: ReceivePacketHandler 與 ReceiveHandler 區(qū)別:是針對不同型號網(wǎng)卡別離采納這兩個屬性同意數(shù)據(jù)的建議全數(shù)設(shè)置上你自概念的同意函數(shù)。).若是是 IPHOOK 驅(qū)動需要綁定鉤子(鉤子驅(qū)動IPHOOK) :IP_SET_FIREWALL_HOOK_INFO filthook;= 鉤子函數(shù)(處置過濾 /抓包函數(shù)的函數(shù)) ;= 1;= true;應(yīng)用那個IoBuildDeviceIoControlRequest函數(shù)綁定具體見DDK 文檔。. MajorFunction函數(shù)任務(wù)的指派(IPHOOK 與 miniport 都必需概念的函數(shù)) :DriverEntry 函數(shù)

10、是驅(qū)動與操作系統(tǒng)的接口函數(shù),MajorFunction 函數(shù)是用戶通過應(yīng)用程序操縱驅(qū)動的接口。.幾個經(jīng)常使用的函數(shù)(IPHOOK與miniport都必需概念的函數(shù)) :DispatchTableIRP_MJ_CREATE =創(chuàng)建函數(shù)DispatchTableIRP_MJ_CLEANUP =清除函數(shù)DispatchTableIRP_MJ_CLOSE =關(guān)閉函數(shù) ;DispatchTableIRP_MJ_DEVICE_CONTROL =;用戶IO 操縱函數(shù)(那個函數(shù)很重要);以上三個函數(shù)能夠指向IO操縱函數(shù)即:DispatchTableIRP_MJ_CREATE =DispatchTableIRP

11、_MJ_CLEANUP =DispatchTableIRP_MJ_CLOSE =DispatchTableIRP_MJ_DEVICE_CONTROL =.用戶 IO 操縱函數(shù) ( DevIoControl ):是用戶通過指定用戶 IO 操縱函數(shù)(那個函數(shù)很重要)IOCTOL 碼向 NDIS 驅(qū)動發(fā)出指令;要求驅(qū)動為自己做事。 (具體成立IO 操縱碼見 DDK ). DevIoControl( NDIS 是一個很重要的函數(shù),IPHOOK 與 miniport 都必需概念那個函數(shù))函數(shù)的概念規(guī)那么:它有兩個參數(shù):IN PDEVICE_OBJECTpDeviceObject,IN PIRPpIrp

12、(那個是要緊參數(shù),是驅(qū)動程序與用戶的數(shù)據(jù)通信接口)PIO_STACK_LOCA TIONpIrpSp; 必需概念本地IO 堆棧變量。pIrpSp = IoGetCurrentIrpStackLocation(pIrp);面的 pIrp- = outputBufferLength句用不行會出問題的。 它是用在向用戶應(yīng)用程序返回?cái)?shù)據(jù)的進(jìn)程體中,行你應(yīng)用程序可能同意不到 NDIS 返回給你的數(shù)據(jù)。若是這句用不2.同時(shí)同意和返回如何做?其實(shí)讀取和寫入滿是在 pIrp- 緩存中咱們操作的順序是先把用戶發(fā)來的數(shù)據(jù)讀出把要寫的的數(shù)據(jù)寫入中。例如:用戶 EXE 中 IO 操作是:DeviceIoControl

13、(devhdle,IO操作碼,輸入數(shù)據(jù)地址,輸入數(shù)據(jù)長度, 輸出數(shù)據(jù)地址,輸出數(shù)據(jù)長度,返回值地址, NULL)NDIS能夠如此讀取返回?cái)?shù)據(jù):讀取數(shù)據(jù): ibuff=pIrp-;返回?cái)?shù)據(jù): oBuffer=pIrp-;自概念函數(shù) (oBuffer) 向 oBuffer 寫數(shù)據(jù)。明白啦嗎?還不明白,我還有個方法確實(shí)是你自己動手實(shí)驗(yàn)一萬遍。其實(shí)我已經(jīng)說的很明白啦。注意: IO 操作碼:那個碼必需是可讀寫的。至于怎么生產(chǎn)你看DDK 。.驅(qū)動卸載函數(shù)(Unload IPHOOK與 miniport 都必需概念的函數(shù)):那個函數(shù)只有一個參數(shù) IN PDRIVER_OBJECTDriverObject 。

14、作用:當(dāng)驅(qū)動卸載時(shí)釋放咱們在程序中分派的內(nèi)存、miniport 端口、IO 設(shè)備等??偨Y(jié): 從 NDIS 你 驅(qū)程序結(jié)構(gòu)中咱們不難找出動中是不是注NDIS 冊 啦的 miniport 與 iphookminiport_protocol開發(fā)的區(qū)別確實(shí)是在仍是綁定啦IP_SET_FIREWALL_HOOK_INFO 鉤子,大體結(jié)構(gòu)是一樣。 若是你在網(wǎng)上看到開發(fā)文檔感到很難時(shí)我只能說: ”真正了解一門技術(shù)是有一個進(jìn)程的,進(jìn)程中碰到些困難是很正常的,關(guān)鍵是你可否堅(jiān)持到最后! ”。NDIS四安裝NDIS 驅(qū)動方式:驅(qū)動安裝:相當(dāng)簡單我那個地址介紹兩種方式:.1.手動注冊表成立效勞Windows Regi

15、stry Editor Version驅(qū)動名 Type=dword:00000001Start=dword:00000003ErrorControl=dword:00000001驅(qū)動文件名 .sysDisplayName= 驅(qū)動名 Group=Extended Base4.1.2.用 ”NET STRA T 效勞器名 ”啟動 / ”NET STOP 效勞器名 ”停止效勞.安裝啟動后能夠用代碼直接利用此效勞:( 1) #defineMY_DEVICE_NAME驅(qū)動名 用代碼取代手工來完成:( 1)(具體代碼來完成不是很難)。于(與)前步能夠完全( 2)概念 SC_HANDLE hSCManage

16、r; 變量。( 3) hSCManager = OpenSCManager(NULL, NULL,SC_MANAGER_ALL_ACCESS);打開效勞操縱治理器。( 4)若是 (3) 成功 OpenService(hSCManager, lpszServiceName,SERVICE_ALL_ACCESS);打開效勞。( 5)若是 (4) 失敗說明驅(qū)動效勞沒有安裝開始安裝驅(qū)動: hService = CreateService(hSCManager,lpszServiceName,lpszServiceName,SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER

17、,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,lpszDriverPath,NULL,NULL,NULL,NULL,NULL);成立效勞。( 6)啟動效勞器 StartService (hService, 0, NULL);( 7)關(guān)閉 SC_HANDLE : CloseServiceHandle(hSCManager);( 8)再利用 .中代碼訪問驅(qū)動。以上說明啦NDIS 鉤子驅(qū)動(不含miniport-protocol端口)的安裝利用兩種方式。中間驅(qū)動( miniport-protocol )安裝利用方式:只要你把握其實(shí)也很簡單(你能夠參考DDK_S

18、RC 下的 netcfg 例子。其中有一個很重要的函數(shù)是HrInstallNetComponent 你把它看明白安裝大體就差不多啦。但那個地址有個專門大開發(fā)安裝程序問題:確實(shí)是netcfg 是用 ddk 編譯的 ,咱們有時(shí)要把安裝代碼集成到VC 編譯器中,有人說include ddk 包文件。我那個地址建議你用 DDK編譯成 dll 接口函數(shù)。.第 二 你 最 好 對inf文 件 各 個 鍵 值 作 用 了 解 詳 細(xì) 。 我 那 個 地 址 要 說 明SourceDisksFiles 那 個 鍵 , 若 是 你 的inf文 件 與sys 在 同 一 個 途 徑 下 那 么SourceDisksFiles 鍵值為空。如下:SourceDisksFiles=1 改成;=1 前面加分號若是不如此在安裝sys 時(shí)可能提示你選擇sys 途徑問題。. 值得專門注意的是:不管你安裝成

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論