近期接手了一個關於Windows系統內核驅動的開發任務,首先需要的就是熟悉相關開發環境的配置與調試,這里采用了vs2013+vm2015+wdk8.1的組合,已經親測完成(踩了無數的坑),在此做一下記錄,下次需要配置環境的時候可以用作參考。
vm,wdk,vs等工具先下載安裝好。
1.首先需要安裝win7虛擬機,這里需要注意系統的鏡像需要時虛擬機專用鏡像,所以在此保存一個64位的win7鏡像,可直接下載:
ed2k://|file|cn_windows_7_enterprise_with_sp1_x64_dvd_u_677685.iso|3265574912|E9DB2607EA3B3540F3FE2E388F8C53C4|/
選擇配置好虛擬機之后需要首先點擊設置刪除占用com1串口的打印機,然后添串行端口將管道命名為\\.\pipe\com_1(如圖所示)。
2.虛擬機開機后以管理員權限運行cmd,輸入如下命令開啟相應串口並關閉64位驅動強制簽名(64位驅動要求必須有數字簽名才可運行,但是可以在測試中關閉)
bcdedit /debug on bcdedit /dbgsettings serial debugport:n baudrate:115200 bcdedit.exe -set loadoptions DDISABLE_INTEGRITY_CHECKS
3.將主機中已安裝的wdk目錄中找到驅動目標程序將其復制進虛擬機中安裝
3.運行vs,創建新的空wdm項目
新建first.c源程序
輸入helloworld代碼
#include <ntifs.h> //<ntddk.h> VOID DriverUnload(PDRIVER_OBJECT objDriver) { // 避免編譯器關於未引用參數的警告 UNREFERENCED_PARAMETER(objDriver); // 什么也不做,只打印一行字符串 DbgPrint("My Dirver is unloading..."); } NTSTATUS DriverEntry(PDRIVER_OBJECT objDriver, PUNICODE_STRING strRegPath) { // 避免編譯器關於未引用參數的警告 UNREFERENCED_PARAMETER(strRegPath); // 如果編譯方式為Debug,則插入一個INT 3指令,方便我們調試 // 打印一行字符串,並注冊驅動卸載函數,以便於驅動卸載 DbgPrint("My First Dirver!\r\n");// KdPrint(("KD My First Dirver!\r\n")); objDriver->DriverUnload = DriverUnload; return STATUS_SUCCESS; }
其中兩個函數,DriverEntry是程序入口相當於main,DriverUnload是卸載驅動時執行的函數。
以下為使用dbgview進行調試
4.將程序選擇win7debug以及x64環境,點擊編譯生成
將編譯生成的sys文件復制進虛擬機中
5.虛擬機中安裝dbgview,同時輸入以下命令然后重新啟動虛擬機,使其可抓取內核態信息,也就是咱們代碼中的dbgprint輸出的字符串
新建一個txt文件,復制進入如下信息
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter] "DEFAULT"=dword:00000008
然后將文件后綴名改為.reg,啟動之后重啟計算機即可
6.先運行dbgview用於查看輸出的信息
可以看到,在運行驅動之前,有一些其他的內核信息
7.運行InstDrv,將sys拖入其中點擊安裝,點擊運行,可看到輸出的helloworld
雙機調試
首先需要認識到的是,上面debugview是在虛擬機中進行的測試,下面兩種都將采用雙機測試模式,也就是在主機端進行debug,虛擬機用作執行環境,輸出的信息也全在主機端進行調試。
4.在進行雙機測試之前,需要完成對虛擬機系統的改造,使其進入測試模式。
在虛擬機中以管理員權限運行cmd,運行以下命令
bcdedit /copy {current} /d Windows7-雙機調試模式 bcdedit /timeout 10
bcdedit /set testsigning on //開啟測試模式
bcdedit /debug ON //開啟debug
bcdedit /bootdebug ON
bcdedit /dbgsettings //查看剛才的設置信息,應該是使用com1串口,波特率為115200
bcdedit /dbgsettings serial debugport:1 baudrate:115200 //如果不是請輸入下行命令進行調整
在開機時有選擇啟動方式,其中“Windows7-雙機調試模式”是我們剛增加的啟動方式,選擇此方式進入虛擬機系統,這樣就完成了雙機測試中對虛擬機運行環境的配置。
以下為使用windbg進行雙機調試
5.首先在主機安裝windbg,將windbg文件創建快捷方式,這樣我們剛才在虛擬機中設定的串口管道就要用到了。
首先完成如下信息
-b -k com:pipe,port=\\.\pipe\com_1,baud=115200,reconnect –y
其中port為管道名,baud為波特率,需要和虛擬機中設定好的信息一致,然后將該段字符串復制到快捷方式的目標最后
6.運行windbg,會提示wait to connect,此時啟動虛擬機選擇雙機調試模式,會遇到int 3中斷,此時在windbg中輸入g即可使虛擬機繼續執行,直至開機。
以下為vs雙機調試
5.vs雙機模式與windbg相似,即通過vs將編寫好的代碼的直接在虛擬機環境中進行debug,首先需要將vs連接虛擬機。
安裝好wdk后,vs欄上會多一個DRIVER的選項,選擇DRIVER-TEST-Configure進入如下界面
點擊add new,選擇第二個選項,可以在配置時測試是否能完成連接(此處有坑,如果選擇第3項如果沒有連接成功也會添加新計算機設備,后續會出現大問題)
計算機名稱一定要使用本機的名稱,通過我的電腦屬性中查看,如圖所示我的電腦是Windows,那么就要填Windows,這樣是通過尋找本機的對應通道進行連接。
輸入正確的計算機名稱之后,點擊下一步,連接類型選擇Serial串口,同時勾選重連接與管道選項,波特率設定與虛擬機相同,將管道名設定為與虛擬機相同,點擊下一步
如果狀態為,則說明已經完成連接。
然后在選項欄會多了一個此設備的選項
然后我們打開剛才的helloworld程序,點擊調試,附加到進程
選擇傳輸方式為Windows Kernel Mode Debugger,選擇核心進程點擊附加,即可進入vs的dbg模式,與windbg顯示相同
在vs的雙機調試中,可在點擊暫停調試后增加斷點,按F11進行單步調試。
ps:這個研究任務關系到畢業論文,所以還是重視一點點,這個基本都和內核及內存等有關系,能夠加深對系統底層的理解,平時的學習也不要落下,就醬加油吧,新的學期開始了!