驅動開發
第一個驅動程序
驅動的開發流程
1.編寫代碼 -> 生成.sys文件 -> 部署 -> 啟動 -> 停止 ->卸載
// 編寫我們的第一個驅動程序
#include<ntddk.h>// 卸載函數
VOID DrvUnload(PDRIVER_OBJECT DriverObject) {DbgPrint("我被卸載了\n");
}// 驅動入口函數,相當于main函數
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) {// 輸出調試信息DbgPrint("Hello World!\n");// 設置卸載函數DriverObject->DriverUnload = DrvUnload;return STATUS_SUCCESS;
}
接下來,我們來試著加載一下我們自己寫的驅動程序
驅動程序的加載分為4步:
- Register:裝載(告訴操作系統我有這么一個驅動程序)
- Run:運行(真正開始運行了)
- Stop:停止
- Unregister:卸載
當點擊Run
時,輸出日志HelloWorld
,當點擊Stop時,輸出日志我被卸載了
如何調試驅動程序
搭建雙機調試環境
為什么要搭建雙機調試環境呢?
應為當我們在調試驅動(內核)程序時,如果直接在我們物理機上進行調試,下斷點時,我們的整個系統會卡死,這樣以來就無法調試了(在調試驅動程序也很容易發生藍屏),所以我們需要在另一個系統環境上用信號的方式傳遞調試信息進行驅動程序的調試
下載VirtualKD軟件
VirtualKD官網
1.把上面的target32或者是64復制到被調試的系統上,是多少位的操作系統就復制對應位的target
這里的vmistall.exe直接雙擊運行
選擇install就可以了,這個軟件只用運行一次就可以了(一點安裝虛擬機就會進行重啟),它會在當前電腦上創建一個新的系統引導向,向我們的調試主機發送信號
這里會給我們把默認引導項選擇為它剛剛為我們創建好的
按F8,選擇禁用驅動程序強制簽名回車(在這之前一定要先運行VirtualKD程序)
如果你的電腦上還沒有安裝windbg調試器,可以去微軟的應用商店獲取,這個軟件是微軟官方的
到此我們雙機調試的環境就算搭建好了
那如何進行調試呢?
我們在windbg中用以下命令進行反匯編查看
u 地址 // 用u命令反匯編一個地址
可以看到它不僅給我們生成了匯編代碼還同時給我把這段代碼是在哪里方法里面的偏移也顯示出來了(這個就是PDB(Program Database)文件)
這些PDB文件在我們自寫的的程序,驅動,動態鏈接庫時都會自動生成,PDB文件主要描述了程序函數地址與文件名的對應關系,在上面的示例中,我們僅通過一個地址就能知道對應的方法名和它的偏移位置,這個方法名就是在PDB文件中和地址進行關聯的(內核的PDB是由微軟來提供的)
使用.sympath命令就可以查看對應PDB下載獲取的位置
.sympath // 獲取當前的PDB下載位置
.sympath SRV*D:\MyDebugSymbols*https://msdl.microsoft.com/download/symbols // 重新設置
SRV*D:\MyDebugSymbols:表示下載的PDB文件保存在電腦的什么地方
https://msdl.microsoft.com/download/symbols:如果電腦上沒有對應的PDB文件該從什么地方去獲取