掌握Windows內核調試技術是學習與研究Windows內核的基礎,調試Windows內核的方式大致分為兩種:
(1)通過Windbg工具在Windows系統運行之初連接到Windows內核,連接成功之后便可以調試,此時即可以調試Windows內核啟動過程,又可以在Windows啟動之后調試某內核組件或應用程序。或使用Windbg的Kernel debugging of the local mechine功能,在Windows系統完全啟動之后,調試Windows內核組件或應用程序。這種方式需要配置Windows系統以DEBUG模式啟動。
(2)通過Bochs來運行Windows系統,可以在Windows運行的任意時刻調試任意信息,但最大的缺點就是,這種方式目前不支持使用Windows Symbols,與第一種方式相比,匯編代碼讀起來並不直觀。
本文介紹方式(1)即通過Windbg工具調試Windows內核。
1、Windbg工具簡介及獲取方式
Windbg工具是微軟團隊開發和公布的一款專門用於調試Windows內核及應用程序的調試器,既支持內核級(Ring0)調試,也支持應用程序級(Ring3)調試。如今的Windows系統調試器有多種,出了Windbg以外,還有Olldbg、Immunity Debugger等。Olldbg和Immunity Debugger不支持內核級調試。
Windbg工具包含在Windows Driver Kit(WDK,Windows驅動開發包)中,當然也可以單獨下載。
(1)如果要通過WDK方式獲取的話,Windows XP及之前的環境只要下載WDK即可,整個資源大約300M~500M,但是在Windows Vista/Windows 7等系統之后,微軟將WDK與Visual Studio環境集成到一起,因此整個下載資源大約6.0G~7.0G。由於Windows XP系統不再支持,並且筆者的實驗環境為Windows 7系統,在后續的文章中也會涉及到Windows驅動開發,所以筆者建議下載WDK與VS集成包,雖然資源比較大。
(2)如果只是暫時學習Windows內核調試的話,可以單獨下載Windbg工具,整個資源大約150M。
以上資源皆可以在MSDN上獲取,獲取鏈接為:http://msdn.microsoft.com/zh-cn/windows/hardware/hh852365.aspx
2、Windows Symbols簡介及獲取方式
Windows Symbols是微軟公開的Windows系統符號表,使用Windbg調試WIndows內核和應用程序時可以很直觀地看到部分變量名稱、結構體結構、函數名稱等。
Windows Symbols可以直接在MSDN上獲取,其獲取頁面與上述給出的獲取Windbg工具的頁面鏈接相同。
但是筆者不建議直接下載並安裝Windows Symbols,因為在使用Windbg工具調試時,可以根據需要即時獲取相關模塊的符號信息(如果網絡正常的話)。
3、Windows內核調試方法
通過虛擬機調試Windows系統是種常見的方式,即首先搭建虛擬機環境,即將Windows系統安裝在虛擬機中,然后配置虛擬機Windows系統的啟動模式為DEBUG模式,並且配置好Windbg工具與虛擬機Windows系統之間的通信通道,在Windbg進入等待調試通信的時候,重啟虛擬機Windows系統,雙方的調試鏈接建立以后,即可使用Windbg工具調試/控制Windows內核,詳細步驟如下:
(1)配置虛擬機Windows系統以DEBUG模式啟動。
進入虛擬機Windows系統,以管理員身份運行cmd.exe,執行以下命令:
bcdedit /debug on //啟用Windows內核調試支持
bcdedit /bootdebug on //啟用應用程序的啟動過程調試支持
關於bcdedit命令的詳細信息,可以在MSDN中了解:http://msdn.microsoft.com/zh-cn/library/dn653986(v=vs.85).aspx
上述方式僅在Windows Vista/7系統及以后版本的Windows系統中有效,如不做特殊說明,筆者的實驗環境默認為VirtualBox/Windows 7系統。
對於Windows XP系統的配置,請自行GOOGLE。
(2)配置Windbg與虛擬機Windows系統的調試通信通道。
關閉虛擬機Windows系統,在虛擬機“串口配置”中,啟用某個串口,比如COM1,並將該串口的端口模式設置為“主機管道”,並選擇“創建通道”,在“端口/文件位置”中輸入待創建的虛擬的管道設備名稱,比如“\\.\pipe\comdbg”(注意格式,“comdbg”名稱用戶自定義):

打開Windbg,在“Kernel Debug”(Ctrl+K)對話框的“COM”標簽頁中將“Port”也配置為“\\.\pipe\comdbg”:

點擊確定后,Windbg進入嘗試與目標建立通信通道狀態:

此時啟動虛擬機的Windows系統,一段時間以后,調式通信通道建立成功:

此時,在Windbg中按快捷鍵“Ctrl+Break”即可中斷虛擬機Windows的啟動/運行過程(第一次一般會下載符號表,需要耐心等待):

此時便可以輸入各種調試指令,比如輸入“g”命令就可以繼續虛擬機Windows的運行過程。
由於Windbg的內核調試指令與Windows內核原理相關,所以在后面的Windows內核原理分析時會詳細說明Windbg使用及相關指令。
