透明加密系統設計及實現-WINDOWS內核分析及編程方法 頂 原

    本文主要介紹Windows內核的基本結構,瞭解Windows的基本結構是進行內核編程的必不可少的內容。透明文件加密系統最爲核心的單元是採用Windwos 內核過濾驅動進行設計和實現的,故而必須準確認識和理解Windwos內核驅動模型的原理才能設計出合理高效的透明加密的驅動程序。過濾驅動位於文件系統驅動及I/O管理器之間,進行透明解密、文件控制及用戶控制時需要和操作系統內核的其他關鍵的部件進行交互,同時必須對操作系統的存儲結構、緩存結構及I/O流程有比較深入的瞭解,才能設計和實現出一款效率高、穩定性好的透明加密系統。內核編程難度大,不易把握,爲了更好地理解系統的實現,本章簡要地介紹了內核編程的一些基本方法,包括內核模式下字符的管理、內存的分配及的進程的同步互斥的控制方法。要開發一款軟件,特別是系統軟件,沒有有效的構建和調試環境,一切都是紙上談兵,爲此,本章最後給出了構建編譯環境及調試驅動環境的基本方法,以供參考。

1 WINDOWS內核結構

       從1993年起始,微軟公司開始採用其耗時五年研究的新內核框架NT3.0,NT內核採用了混合式的內核設計方法,充分結合了聚內核及微內核的設計思想進行開發,擴展性及效率都得到了很好的保證。圖1顯示的Windows的基本結構。

圖1 Windoows NT 內核結構圖

Windows操作可以劃分爲兩種模式,內核模式(kernel mode)及用戶模式(usermode)。全部的應用程序都是工作在用戶模式下的,包括操作系統子系統、系統和服務進程以及各種應用程序。用戶態的應用程序主要通過系統調用與操作系統內核進行交互,部分的系統和服務進程直接與內核交互,而子系統則通過子系統DLL及系統調用與系統內核進行交互。

在內核模式下,主要運行的是操作系統的核心構件。包括執行體、內核(微內核)、硬件抽象層等關鍵組件,還有文件系統、網絡和各種驅動程序,以及在後期移入內核空間中的窗口管理與windows子系統,這些都是操作系統的組成部件,和整個操作系統密切相關,任何模塊崩潰都會導致整個系統的癱瘓。

1.1 系統模式的區分

    Windows採用了雙模式(dual mode)結構來保護操作系統本身,避免被其他的進程修改操作系統本身,保證系統的安全性。同時避免了操作系統被其他的進程的崩潰所殃及。操作系統核心工作在內核模式(kernel mode)下,應用程序代碼工作在用戶模式(user mode)下。內核模式需要用到系統內核或者內核的驅動程序時,採用硬件指令切換到內核模式,完成用戶的請求後,從內核模式恢復用戶模式,這樣保證了用戶到內核的的相互切換,不至於破壞操作系統的結構。圖2簡要地描述了用戶模式及內核模式的關係。

            

圖2 內核模式與用戶模式

1、用戶模式
        當啓動一個用戶模式的程序時,Windows爲其創建這個程序創建與其對應的進程。進程爲程序的運行提供了運行的環境,包括私有的虛擬地址空間(virtualaddress apace)及一張私有的句柄表(handle table)。一個進程的虛擬地址空間是私有的,一個進程不能修改屬於其他進程的數據,程序間的運行都是隔離的,當一個程序崩潰時,僅僅影響到當前的程序,和其他的進程及操作系統內核都不會受到當前進程崩潰的影響。

用 戶模式的程序的私有的虛擬地址空間是受限制的,一個運行在用戶模式的進程是不能訪問保留給操作系統的虛擬地址空間的。限制用戶模式的程序的虛擬地址空間是 爲了防止用戶模式的程序修改或破壞核心的操作系統的數據,保證系統的安全性。所有的應用程序以及部分用戶模式驅動工作在用戶模式,它們的虛擬地址空間是相 互隔離的。

2、內核模式

    所 有的運行在內核模式的的代碼共享一個單獨的虛擬地址空間,這意味着一個內核模式的驅動和其他的驅動和操作系統本身是不分離的。如果一個內存模式的驅動偶然 間向一個錯誤的虛擬地址寫入數據,屬於操作系統或另外的驅動的數據就可能會被破壞。如果一個內核模式的驅動崩潰了那麼整個操作系統同樣會一起崩潰,導致整 個系統的癱瘓。

    運行在內核 模式的除了操作系統的核心內核之外,包括支持例程擴展驅動、文件系統驅動及其他驅動,還有和硬件關聯緊密的硬件抽象層及硬件本身。當然並不是所有的驅動都 工作在內核模式下,有一些被稱爲用戶模式驅動的驅動程序工作在用戶模式下,常見的打印機驅動就屬於此類。

1.2 WINDOWS的關鍵組件

1、內核

這是大內核中的小內核,又稱爲微內核,其在操作系統中是最爲核心的構建,是其它的構件的基礎,保證執行體構件。在內核模塊ntoskrnl.exe,內核位於下層,和HALc層最爲接近。負責線程調度和中斷、異常的處理,在多處理器中,還承擔着同步處理器之間的行爲,起到了優化系統的性能的作用。主要採用C語言開發也包括部分彙編代碼。

2、執行體

    執行體位於內核模塊ntoskrnl.exe的上層,以內核爲基礎,是內核的擴展。主要包括進程及線程管理器、內存管理器、安全應用監視器、I/O管理器、緩存管理器、配置管理器、即插即用管理器、電源管理器及對象管理器等。其中內存管理器,安全應用監視器I/O管理器、緩存管理器和透明加密驅動的開發有着緊密的關聯。內存管理實現了虛擬內存管理,負責系統地址空間的內存管理,是緩存管理器的底層支持。安全應用監視器(SRM),實施系統的安全審計,守護系統的資源、執行對象的保護及審計。緩存管理器爲文件系統提供統一的數據緩存支持,運行文件系統驅動將磁盤中的數據映射到內存中來,並通過內存管理器來協調內存的分配。

3、設備驅動程序

    驅動程序是內核擴展的最爲主要的方式,Windwos操作系統中的驅動程序並不一定對應相應的物理設備,可能是一個虛擬設備,也可能無任何一個設備無關,僅僅作爲內核的擴展模塊。驅動程序可以動態加載到操作系統中稱爲系統的模塊,由於其工作內核模式下,除了通過HAL訪問硬件以外,也可以直接訪問硬件。透明加密就屬於驅動程序,存在相應的虛擬設備,位於文件系統驅動設備之上。

4、文件系統

       在操作系統中,文件系統是外部存儲設備的統一接口,它爲應用程序訪問這些設備的數據提供了統一的接口,在Windows,文件系統的接口部分由I/O管理器定義和實現,但其專門的驅動則在一些被稱爲文件系統驅動的程序中。文件系統驅動定義了外部存儲設備數據中數據的邏輯結構,從而使得數據在操作系統可以進行統一的操作,由操作系統提供統一的接口進行訪問。

2 WINDOWS的存儲結構

    從應用程序的角度來看,通常會看到兩種最爲常見的數據存儲的介質:系統主存和外存(包括磁盤、光盤和移動存儲介質)。這是由於操作系統爲用戶提供了統一的操 作數據的抽象接口,從而簡化了上層用戶對外存的操作步驟。降低了編程的難度,提高了系統的性能和穩定性。但是要做好驅動層的透明加解密,停留在這一層次是 遠遠不夠的,必須清楚計算機硬件存儲結構的組成模式,同時還要掌握文件I/O操作的基礎流程,以及緩存管理與文件系統驅動的聯繫,熟悉文件緩存爲文件系統提供的操作緩存的基礎接口。掌握文件I/O的基本方式,對不同的I/O方式採取合理的處理措施。

2.1硬件存儲體系

       從體系結構的方面來考慮,計算機的存儲體系是分級的,採用多級存儲體系結構,可以降低CPU訪問低速設備的時間,從而提高CPU的運行效率。但是分層必須合理,分層太少,不能滿足性能的要求,分層太多,劃分的成本就會上升,甚至可能導致性能的下降。下圖給出了典型的intel x86處理器支持的存儲結構,總體而言越是靠近CPU, 其訪問耗費的時間就越少,但是其價格就越高,由於成本的限制相應的大小就會受到很大的影響。從圖中可以看出,訪問主存的速度是遠遠大於外部存儲的速度,如 果做好緩存的優化,可以極大地提高操作系統的性能。所以在進行透明加解密的時候,必須充分考慮緩存的作用,減少對操作系統緩存的破壞,保證操作系統的性 能。

圖3 Intel x86處理器支持的存儲體系結構

2.2 WINDOWS的存儲管理結構

    在Windows的存儲管理的體系結構中,存儲管理和文件系統是必不可少的,二者缺少其中的任何一個,操作系統都將無法運行。Windows的所有的設備都是通過文件對象的形式被應用程序訪問的,文件的重要性可想而知。主內存的管理工作主要由操作系統來負責的,當然外存也不例外,外存都是操作系統通過驅動程序進程訪問和管理。系統和應用程序通過I/O管理器來與這些設備的驅動程序進行交互,從而完成數據存儲。圖4詳細地描述了一個磁盤文件讀寫請求的在操作系統中路徑。從中我們可以看出文件的讀寫與I/O管理器、內存管理器、緩存管理器及文件系統驅動程序是密不可分的。

圖 4 Windows 的存儲管理結構

1、Windows內存管理

     當一個處理器讀寫內存中某一位置的的數據時,其使用的是虛擬地址空間。在讀寫的過程中,處理器將虛擬地址轉換爲相應的物理地址,然後再進行數據的訪問。採用虛擬地址空間可以讓不同進程共享同一虛擬地址空間,同時可以防止進程間相互的數據破壞。如圖5所示,在所有的進程中,它們有各自的私有的地址空間,其他程序不能訪問。但是它們共享同一個系統虛擬地址空間,在用戶模式下,進程是沒有權利訪問系統虛擬地址空間的。

      

圖5 進程的虛擬地址空間

     在用戶空間(users space)下,所有的進程的物理頁面都能在需要時被換出到磁盤文件(disk file)中。但是在系統空間(systemspace),並不是所有物理頁都能被換出到磁盤文件中,一些物理頁是不能被換出到磁盤文件中的。如圖6所示,在系統空間有兩種區域的內存區域是爲內存的動態分配準備的:換頁內存池和非換頁內存池。

圖6 換頁內存池與非換頁內存池

從換頁內存池中分配的內存中分配的內存是可以換出到磁盤文件中的。而從非換頁中分配的內存將永遠不會被換出到磁盤文件中。在硬件中斷的運行環境下不能使用非換頁內存池,因爲系統本身位於中斷環境中,不能處理頁缺少中斷,導致系統死機。

2、Windows緩存管理

       Windows的文件緩存管理位於內存管理器與文件系統驅動程序之間,緩存管理器使用了系統空間中預留中的一段地址範圍,並控制好那些文件的那些部分可以使用這些地址和相應的物理內存,以滿足大文件存取和系統有限內存之間的一種平衡。通過文件緩存可以極大地提高文件的讀取效率。

       在文件的讀寫操作時,可以將文件的讀寫方式分爲兩大類,一類是有緩存的,另一類是沒有緩存的。一般打開文件時,都是以有緩衝的方式打開的。爲了更好理解緩存在系統的作用,圖7給出了I/O請求經過緩存管理器的路徑。

圖7 I/O 請求經過緩存管理器的路徑

   當文件以非緩衝方式打開文件後,對該文件的讀寫都是直接從磁盤中讀取文件內容或者是直接將內容寫到磁盤文件當中,中間沒有任何的緩衝處理。如果未指明文件的 打開爲非緩衝的方式打開文件,則系統默認以緩衝的方式打開文件,當讀取或寫入文件時,並不是直接從文件中讀取或寫入,而是先通過緩存管理器中的接口函數CcCopyRead、CcFastCopyRead從緩存中讀取,通過CcCopyWrite、CcFastCopyWrite將 內容寫入緩存中。如果緩存中沒有,內存管理器將會產生缺頁中斷,由文件系統驅動將文件的內容讀取到緩存中,然後再從緩存中讀取。爲了提高操作系統讀取文件 的性能,緩存管理器提供預讀及延遲寫機制,就是提前將文件的內容先按一定的算法預讀取到緩存中,當讀取文件時,直接從緩存中獲取,這樣極大地提高操作系統 的性能,而寫入時,將寫入的內容寫入緩存中,當操作系統空閒時或需要時寫入文件中。

3 WINDOWS內核驅動模型

3.1 驅動程序分類

1、根據用途分類

      在Windwos驅動程序不僅僅是爲各種設備提供I/O的能力,也是Windows操 作系統進行擴展的基礎,通過動態地加載和卸載驅動模塊,系統可以進行動態的擴展和精簡,內核模式的驅動程序採用統一的接口,這些接口在所有的內核模式的驅 動上均是統一的。根據功能的不同我們將驅動程序分爲三類,包括即插即用驅動程序、內核擴展驅動程序和文件系統驅動程序。即插即用驅動程序稱爲WDM驅動程序,用於支持常見的存儲設備,視頻適配器和網絡設備等等。內核擴展驅動程序是非即插即用類驅動程序,是內核的擴展功能。文件系統驅動程序設專門針對文件I/O請求的,然後將這些請求定位到具體的網絡設備或存儲設備,將文件的I/O請求下發到具體的媒介中。

2、根據層次結構分類

根 據驅動位於系統的位置,不同位置的驅動的作用往往區別也是巨大的。爲了便於區分和比較,將其分爲三大類,分別是總線型驅動程序、功型型驅動程序及過濾驅動 程序。總線是最底層的驅動程序,用戶管理一個總線設備,負責檢測總線上附載的所有設備。功能型驅動設備位於總線設備驅動之上,管理具體的設備,功能驅動程 序是實際管理真實設備的功能模塊。位於功能設備驅動之上的或之下的用於監視某一設備的I/O情況以及這些請求的處理情況,或者增加或者改變另一個驅動或另一個設備的行爲的驅動。系統中開發透明加解密驅動就是屬於此類。

3.2 驅動程序的代碼結構

    驅動程序在操作系統相當於操作系統的一個擴展模塊,爲了識別驅動程序,操作系統爲每一驅動程序提供一個唯一的驅動對象與之對應,該對象是有對象管理器創建的。如圖8,驅動對象包括大量的派遣例程,包括初始化例程、增加設備例程、各種分發例程、卸載例程和各種可選例程。驅動程序的各個派遣函數例程都由操作系統進行管理和調度,其中初始化例程主要完成驅動的初始化工作,增加設備例程完成設備的即插即用的管理,而各種分發例程則完成相應的I/O請求的處理,可選例程用於完成各種輔助功能。凡是內核模式下的驅動程序,都採用如圖代碼結構進行安排,由操作系統進行統一的管理。

    在驅動程序對應的驅動對象中還有一個成員是比較關鍵的,就是設備對象成員,它指向了一個單鏈表,鏈表中的每一個成員都是由該驅動程序創建的設備對象,設備對 象代表了驅動程序的一個實例,每一個驅動程序都會創建一個和多個設備對象,每一個設備對象都會有一個指針指向下一個對象,形成設備鏈。設備對象指明設備的 類型及其對應的具體物理設備或者虛擬設備,多層次結構的設備對象可以組成設備棧結構。

圖8 驅動程序的代碼結構

3.3 I/O請求包及緩衝區管理

    在Windows 有一種數據結構被稱爲I/O請求包(I/O Request Package),也被稱爲輸入輸出請求包,簡稱IRP。它是Windwos操作系統中進行I/O交互的重要的數據結構,相當於消息結構中的消息包。起到傳遞數據的作用。

在驅動程序的派遣例程中,I/O請求包將會作爲大多數的例程的必要的輸入及輸出參數,無論是數據的下發,還是結果的返回都跟I/O請求包是密切相關的。在IRP中指定了I/O請求的主功能號和此功能號,決定了I/O請求的功能,操作系統根據功能號將IRP派遣到不同的派遣例程當中。IRP有幾十種功能號,其中比較常用的有IRP_MJ_CREATE、IRP_MG_CLOSE、IRP_MJ_READ、IRP_MJ_WRITE等。在IRP中還包括大量的其他的信息,如I/O請求對象對應的設備對象及文件對象,以及緩衝區地址等。

    在I/O 請求包中還包括了緩衝的方式及緩衝區,指定了信息交換的緩衝區地址。操作系統爲驅動程序提供了統一的緩衝管理的機制,數據在各個設備對象間傳遞時,數據的交互得到了有效的保障。在透明加密中需要截取文件I/O的請求包,然後對它們進行過濾操作,完成透明加解密的功能。在Windwos中,按緩衝進行分類,I/O可以分爲四類,分別是緩衝的I/O、直接輸入I/O、直接輸出I/O及兩者皆非I/O。緩衝I/O 採用系統中非換頁內存作爲輸入輸出緩衝區,直接進行操作。直接輸入I/O,對於從設備讀取數據的操作,驅動程序需要爲其建立內存描述符鏈表,將分配的緩衝區物理頁面構造爲一個MDL ,如此、驅動便可採用DMA方式傳輸數據了。直接輸出I/O 與直接輸入I/O 爲指定的緩衝構造號MDL後便可採用DMA方式進行數據的傳輸。兩者皆非I/O的緩衝方式不由I/O管理器或者I/O 請求的發起者完成緩衝區的管理工作,而是由驅動程序完成緩衝區的使用和管理功能。

3.4 驅動程序的設備棧

    前文已經提到,在Windows操作系統中驅動是按功能進行了分層的,有I/O管理器統一進行管理。如圖9所示,位於底層總線設備驅動管理掛載在總線上的設備,在其之上可以加載總線過濾驅動,用戶擴展或監控總線設備。在之上的是對應設備的具體的功能設備對象,功能設備對象之上或之下都可以加載過濾驅動對功能驅動進行過濾。當I/O請 求下發時,會從上層設備對象依次向下傳遞,上層的驅動有權利阻止或修改傳遞的請求,從而達到過濾和監視的功能。而設備驅動則是由相應的驅動程序動態創建 的,由操作系統統一管理。從圖中可以發現,總線設備對象只能在其之上加載過濾驅動對象,而功能設備對象可以在其上層或者下層加載過濾設備對象。

圖9 驅動程序的設備棧

4 文件系統的I/O過濾

    當I/O管理器將I/O請求發送到文件系統的設備上時,由於系統可能加載了其他的文件系統過濾驅動,故而I/O請求需要經過這些過濾驅動程序才能能夠到達文件系統驅動設備,由文件系統驅動進行處理。在Windows中引入了兩類文件系統過濾驅動,分別是文件系統過濾程序和文件系統小過濾驅動程序。對於這兩種過濾驅動程序,由於他們都工作在文件系統驅動之上,所以他們會比文件系統驅動程序先得到文件I/O的請求,事先得到文件I/O的處理權,對文件I/O實現過濾操作,完成相應的過濾操作,實現具體的過濾功能。

4.1文件系統過濾驅動程序

    文件系統過濾驅動程序能夠能夠過濾文件系統或卷的I/O操作,可以監視(monitor),記錄(log)阻止和修改這些I/O操作。典型的包括病毒監測、加密和數據壓縮等。文件系統過驅動採用了與設備棧的中的其他驅動程序類似的工作方式,進行IRP的處理來完成附加的功能服務。圖10顯示了加載一個文件系統驅動filespy之後的文件設備驅動棧的前後變化情況。在加載之前,系統中在文件系統設備對象之上僅僅包含一個fltMgr設備對象(用於小過濾驅動程序的管理),而在加載之後,安裝加載的順序在fltMgr之上。

  

   (a)filespy加載之前         (b)filespy加載之後

圖 10 filespy加載前後ntfs卷的設備棧

4.2 文件系統Minifilter驅動程序

    在Windows操作系統中,跟隨系統一起安裝一款過濾驅動管理器程序fltMgr.sys,當系統加載任何一個小過濾驅動時,該過濾驅動管理器就會被激活並加載到文件系統驅動設備棧中的文件系統驅動之上。fltMgr提供了一套過濾驅動開發框架,被稱爲Minifilter過濾驅動,也稱小過濾驅動。一個小過濾驅動程序可以向fltMgr註冊它感興趣的I/O操作,併爲其指定相應的預操作回調例程(preoperation callback routine)和後操作回調例程(postoperation call back routine),也可以僅僅指定其中的一個。當fltMgr進行I/O處理時,在I/O請求完成之前或之後,它調用每一個小過濾驅動程序的向其註冊的操作回調函數進行I/O的處理。在小過濾驅動程序中,可以對IRP請求進行過濾操作。

    當系統存在多個小過濾驅動程序時,fltMgr根據小過濾驅動的高度值(altitude)進行回調的順序安排高度值從高到低依次調用。微軟爲常用的小過濾驅動指定了合適高度值。如圖11顯 示了不同的高度的小過濾驅動在文件設備驅動棧的位置分佈,可以看出在小過濾驅動的框架模型中,各種文件過濾驅動能得到很好的兼容,甚至連傳統的的文件過濾 驅動都能得到好的支持,爲了實現跨文件過濾驅動的多個小過濾驅動的管理,系統支持多幀的小過濾驅動管理器,分別在文件過濾驅動程序之上和之下創建文件系統 管理器對象。

圖11 過濾管理器與小過濾驅動程序

    在Minifilter的編程框架中,Minifilter提供了用戶模式應用程序的支持,也提供了用戶模式與內核模式的通信的基本方法。此外Minifilter提供了大量的運行函數支持,可以解決在驅動中的重入問題,降低開發的代價。Miniflter開發框架和第四代透明加密技術的LayerBSD的設計思想完全吻合,提高透明加密驅動驅動和其他類型的文件系統過濾驅動的兼容性。降低了內核中文件系統設備棧的深度,提高了系統的性能,此外,Minifiler開發框架具有良好的擴展性,可以隨時添加感興趣的過濾操作,而對其他的操作不會造成任何的影響。

5 WINDOWS內核編程的基本方法

5.1內存分配

    在內核模式下,動態內存的分配分爲兩種類型,一種是換頁內存池,另一種是非換頁內存池,進行內存分配時,必須充分考慮到運行環境的要求,當代碼的運行環境處於高優先級(大於等於DPC LEVEL)的模式下是不能使用內存分配時必須從非換頁內存池中分配內存,否則系統將會崩潰,因爲高優先級中斷的運行環境處於硬件中斷級別之上,不能處理物理頁缺失中斷。

    在內核模式下采用ExAllcatePool及其類似函數完成內存的分配,在分配時可以指定參數爲NonPagedPool表示非換頁內存,指定PagedPool表示換頁內存。函數的具體使用方法請參考MSDN中 DDK幫助文檔。

5.2字符集管理

    在Windows的內核模式下,爲了保證系統的數據不丟失,建議使用UNICODE 字符編碼,能夠更好地處理第三方編碼的字符,提供對中文的支持。在內核模式下的UNICODE_STRING數據類型,不具有內存的自動管理及分配的能力,需要程序員自己進行管理。這一點必須要牢記。此外Windows DDK提供大量的UNICODE_STRING操作的支持例程,包括初始化、字符拼接、字符比較等等。具體的使用可以參考MSDN中的WDK 幫助文檔。

5.3內核態的同步及互斥

    在內核態下進行驅動程序的開發必須考慮進程的同步與互斥的問題,因爲操作系統之上運行着大量的進程。當這些進行發起I/O操作,系統陷入內核模式去執行驅動程序的代碼時,其是運行在當前發起進程的進程的環境下的,所以驅動程序的代碼是運行在多個進程的環境之下的,必須考慮到進行的資源的共享和競爭,必須考慮到驅動程序代碼的可重入性。

    在操作系統內核模式下的程序必須充分考慮進程是否處於中斷環境中,不同的中斷環境下,採用的同步及互斥的控制方式是不同的。爲了便於管理,Windows設計者將中斷請求劃分爲軟件中斷和硬件中斷,並將它們映射到不同的中斷請求級別之上,同步機制依賴於具體的中斷請求級別。Windows的中斷請求級別被劃分爲32個級別,分別表示不同中斷級別,詳細參見圖13。                                               

        圖12 中斷優先級的劃分

    在不同的中斷優先級採用的同步互斥機制是有區別的,在此主要介紹運行在內核模式下的進程間的同步及互斥機制。內核模式下的同步互斥機制遠遠多於用戶模式用戶模式的同步互斥機制。常用的有自旋鎖(spinlock)、事件(event)、信號量(semaphore)、互斥體(mutes)及執行體資源(executive resource)等等。具體的詳細的介紹參見DDK幫助文檔,如果需要文中會及時補充說明。

5.4驅動程序的編譯及調試

1、驅動構建編譯及調試環境

    爲了滿足驅動開發的需要,微軟提供一套Windows平臺的驅動程序開發的編程緩存WDK,到鏈接地址:http://www.microsoft.com/en-us/download/details.aspx?id=11800下載Windows Driver Kit Version 7.1.0,並將其解壓安裝。安裝時需要安裝上調試工具,安裝完成後即可進行使用。

採用Vmware虛擬機創建一臺虛擬機並在虛擬機中安裝上Windows7操作系統,在安裝的Windows7操作系統中通過bcdedit編輯工具設置操作系統的啓動模式爲調試模式。關閉計算機,然後在Vmware中爲Windows7虛擬機設置管道虛擬串口,命名爲 “\\.\pipe\com_1”。建立腳本debug.bat,加入腳本內容爲:

"windbg.exe程序的絕對路徑" –kcom:port=\\.\pipe\com_1,baud=115200,pipe &

    啓動Windows7虛擬機,啓動模式選擇爲調試啓動模式,然後立即在你的物理主機上以管理員的身份運行debug.bat腳本,完成調試器與物理主機的互聯。如果操作系統成功啓動,並且調試器窗口打印出聯機成功的信息則表示表示調試環境搭建成功。

    爲了更好地跟蹤調試和理解操作系統,需要指定windows內核的內核符號表,這樣在調試時就可以定位操作系統模塊及數據結構,不至於手足無措。

2、驅動的編譯及調試

    編寫好驅動程序代碼後,需要對其進行編譯,安裝好wdk後,針對不同的目的操作系統平臺,需要選擇對應的編譯構建環境,進入相應構建環境,進入源代碼的根目錄,運行命令 build 便可以完成驅動的編譯及構建,在選擇構建環境時如果要進行調試最好選擇debug的構建環境。

    完成驅動的編譯後,接下來就是將編譯的驅動安裝到目標計算機中,然後動態加載它。安裝可以採用驅動安裝設置文件inf文件,該文件詳細描述了驅動程序具體情況及配置選項,該文件的編譯可以參考MSDN相關的資料。安裝時將inf文件與驅動程序放在同一文件夾下,右鍵打擊選擇安裝即可完成驅動的安裝。

    完成驅動的安裝,最後就是啓動驅動程序,以管理員身份進入CMD,然後輸入命令,net start yourdriver ,啓動驅動程序。爲了便於調試,你可以在驅動加載的例程中加入手動中斷,當驅動加載啓動時就會在此中斷,你可以像使用其他的調試器一樣使用調試器對驅動程序的代碼進行調試。加入手動調試的方法如下,在你想要設置手動中斷的地方加上如下的語句:

#if DBG

__ebugbreak();

#endif

    在編譯時採用調試版本進行編譯,這樣當目標操作系統處於調試環境下,執行到指定的代碼處,程序就會中斷。

6 本文小結

    本文詳細地介紹透明加密驅動程序設計及開發過程中涉及到的操作系統的內核的基礎知識,包括Windows內 核的基本結構及主要的組成結構,系統模式的劃分,操作系統的存儲管理及驅動模型。簡要地介紹文件系統過濾驅動(包括文件系統過濾驅動和文件系統小過濾驅 動)在操作系統組成位置及工作原理。最後指出了內核編程需要特別關注的要點,並簡要地介紹了驅動構建及調試的環境搭建方法及調試技巧。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章