- 寒江獨釣:Windows內核安全編程
- 譚文 楊瀟 邵堅磊等著
- 2117字
- 2018-12-27 18:54:31
1.1 下載和使用WDK
1.1.1 下載安裝WDK
就像應用程序使用開發包SDK一樣,內核編程使用“Windows Driver Kit”,簡稱WDK。WDK已經自帶所有需要的頭文件、庫、C/C++語言及匯編語言的編譯器與連接器,所以完全可以在不安裝Visual Studio的情況下進行編程。只是工程管理會不太方便,讀者可以使用記事本或者自己喜歡的其他文本編輯器進行編程。習慣使用Visual Studio的讀者會感覺這很酷,因為只有傳說中的骨灰級程序員才使用記事本編程。
建議讀者下載一個能顯示行號的文本編輯器。以便出現編譯錯誤時能迅速找到錯誤。Linux愛好者當然可以直接用vim。
有些讀者可能聽說過DDK或者IFSDDK,但是那已經是歷史了,請遺忘它。同時下面的描述也可能成為歷史,所以請讀者進入主頁后應該隨機應變。
首先請打開網頁:
https://connect.microsoft.com/default.aspx
這個網頁必須先登錄。登錄攔住了不少訪客,有些訪問者會以為是收費注冊的,其實使用Windows Live賬號就可以登錄(即用MSN賬號登錄)。如果沒有MSN賬號,可以去免費注冊一個。
有了Live賬號之后,還必須用這個賬號向Connect注冊,才能下載WDK。用Live賬號登錄之后,下面出現“立即注冊Connect!”鏈接。
注冊很簡單,只要填寫名字、地區和郵箱就可以了。雖然要填寫郵箱,但是筆者并沒有去打開發送到郵箱中的文件,這個ID就直接可以下載了。筆者不確定是否真的如此,請讀者自己嘗試一下。
登錄之后出現一個“配置控制面板”頁面,但是筆者沒有使用它,單擊上面的“主頁”鏈接,回到主頁,能看見顯示自己已經登錄了。大致畫面如圖1-1所示。

圖1-1 connect.microsoft.com的主頁頁面
請單擊圖中用圈圈住的“查看所有站點”。
下面就比較簡單了,右邊會顯示類別,在類別中請選擇“開發人員工具”。選擇之后左邊就有“Windows Driver Kit”可以下載,請按網頁的提示逐步下載即可。這個開發包非常大,下載之后有幾GB的內容。(注:最新版本的WDK已經縮減,只有幾百兆了。)下載WDK之前請先根據此時頁面的提示下載并安裝FTM(File Transfer Manager),可以大大加快下載速度。
安裝過程沒有需要特別注意的地方,只有兩點:
(1)安裝到一個簡單一點的路徑,避免在特殊情況下需要配置路徑時麻煩,比如C:\WinDDK。尤其要避免在路徑上有空格,否則可能出現編譯問題。
(2)一定要選擇“完全安裝”,否則可能錯過一些代碼例子。
1.1.2 編寫第一個C文件
現在請打開記事本(或者讀者喜歡的任何工具)來創建一個文件,我們把這個文件命名為first.c,以表示這是我們編寫的第一個內核編程文件。在進行內核編程時,讀者必須打開WDK的幫助。在WDK安裝之后,單擊“開始”菜單→“所有程序”,會發現增加了“Windows Driver Kits”和“Windows Driver Kits Documentation”兩個子菜單。(注:最新版本這兩個菜單已經合并為一個。)
選擇“Windows Driver Kits Documentation”下面的子菜單來打開幫助。在使用任何一個函數之前,請在幫助里查詢這個函數是否存在、使用的環境要求及輸入/輸出。
因為這不是應用程序編程,所以所有的Win32 API函數都不能使用;部分C Runtime函數也不能使用,但是文檔中說明的函數則都可以使用。本書將在文檔中有說明的且在內核下調用的System Routine稱為內核API函數,以便和Win32 API函數區分。
我們編寫first.c內容如下:
/// /// @file first.c /// @author crazy_chu /// @date2008-11-1 /// #include <ntddk.h> // 提供一個Unload函數只是為了讓這個程序能動態卸載,方便調試 VOID DriverUnload(PDRIVER_OBJECT driver) { // 但是實際上我們什么都不做,只打印一句話 DbgPrint("first: Our driver is unloading…\r\n"); } // DriverEntry,入口函數。相當于main。 NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) { // 這是內核模塊的入口,可以在這里寫入我們想寫的東西 // 筆者在這里打印一句話。因為“Hello,world”常常被高手恥笑,所以 // 打印一點別的 DbgPrint("first: Hello, my salary!"); // 設置一個卸載函數,便于這個函數退出 driver->DriverUnload = DriverUnload; return STATUS_SUCCESS; }
上面的DriverEntry是每個內核模塊的入口,在加載這個模塊時被系統進程System調用一次。在其中我們設置了DriverUnload的函數指針,這樣這個模塊可以被動態地卸載(這將方便我們調試程序);如果沒有設置DriverUnload函數指針,則一個內核模塊一旦被加載就不能卸載了。
現在請先建立新目錄first,然后把first.c文件保存在此目錄下,下面我們就介紹編譯的方法。
1.1.3 編譯一個工程
前面已經建立了工程first,雖然這個工程只有一個first.c文件作為代碼文件。現在必須在這個目錄下增加兩個文件,以便WDK的build工具可以build它。其中一個文件的名字必須為makefile,這個文件的內容很無聊,永遠也不需要改動,內容如下:
!IF 0 Copyright (C) Microsoft Corporation, 1999-2002 Module Name: makefile. Notes: DO NOT EDIT THIS FILE!!! Edit.\sources.if you want to add a new source file to this component. This file merely indirects to the real make file that is shared by all the components of Windows NT (DDK) !ENDIF !INCLUDE $(NTMAKEENV)\makefile.def
如果讀者不想自己寫這個文件,那么請到WDK的src目錄下隨便尋找一個例子,然后拷貝一個出來。大部分例子的makefile都和這個一樣。
另外,還需要一個名字為SOURCES的文件,這個文件的內容關系到這個模塊要編譯哪些文件,以及編譯出來的.sys文件的名字。舉例內容如下:
TARGETNAME=first TARGETTYPE=DRIVER TARGETPATH=obj SOURCES=first.c
其中TARGETNAME表示名字,編譯出來之后,模塊的名字為first.sys;SOURCES表示要編譯的.c文件(對于初學者,必須提醒一點,不要加入.h文件,因為.h是被包含在.c文件中編譯的),如果.c文件有多個,請用空格分隔。
下面請從“開始”菜單中打開WDK的build環境配置,如圖1-2所示。

圖1-2 從開始菜單中打開WDK的build環境配置
從“開始”菜單中選擇“所有程序”,然后選擇“Windows Driver Kits”→WDK的版本(這里“WDK 600118001”)→“Build Enviroments”→“Windows XP”→“Launch Windows XP x86 Checked Build Enviroment”。
出現一個控制臺,這個控制臺已經配置好編譯環境。現在輸入cd命令,進入我們先前建立的first目錄;進入之后,輸入build命令。筆者這里編譯的結果如圖1-3所示。

圖1-3 first編譯的結果
現在編譯結束,first.sys出現在\first\objchk_wxp_x86\i386下。這個文件并不像普通exe文件一樣可以直接雙擊執行,它需要一個安裝工具進行安裝。下面講解如何安裝并運行它。
- 自動控制工程設計入門
- PIC單片機C語言非常入門與視頻演練
- 工業機器人工程應用虛擬仿真教程:MotoSim EG-VRC
- Mastering Machine Learning Algorithms
- 愛犯錯的智能體
- 分數階系統分析與控制研究
- Visual FoxPro數據庫基礎及應用
- OpenStack Cloud Computing Cookbook
- Mastering ServiceNow Scripting
- INSTANT VMware vCloud Starter
- 運動控制系統(第2版)
- 案例解說Delphi典型控制應用
- Hands-On Geospatial Analysis with R and QGIS
- 案例解說單片機C語言開發
- Mastering Kubernetes