win7 x64部署和串口调试虚拟驱动toaster
1.先說說調(diào)試的準備工作。一般調(diào)試驅(qū)動都是在虛擬機中進行的,這里也不例外,用windbg+vmware雙擊聯(lián)調(diào)。通常開發(fā)階段,Wdm驅(qū)動以inf形式安裝并加載,加載后依次執(zhí)行DriverEntry,AddDevice并響應(yīng)IRP_MJ_PNP&IRP_MN_START事件。安裝的同時,pnp管理器會復制文件及改寫注冊表,待下次重啟,驅(qū)動在系統(tǒng)重啟階段會加載運行驅(qū)動。因此,在DriverEntry時加入斷點尤為重要,要不然將錯過這些函數(shù)的調(diào)試時機。在x86時代,加入口斷點無非是代碼中插入 asm int 3.但是,這么美好的時代已經(jīng)過去了,x64驅(qū)動不支持嵌入?yún)R編。取而代之,必須通過編寫一個asm文件,在源碼中以調(diào)用外部函數(shù)的形式,共5步來實現(xiàn)。
1.1第一步實現(xiàn)int 3的匯編代碼形如:
.code asm_int3 procint 3ret asm_int3 endp end1.2將這段代碼保存為softbp.asm。然后用wdk自帶的ml64編譯,注意僅編譯生成obj文件: ml64 /c softbp.asm1.3接著是在C文件中調(diào)用這個函數(shù),如在wdm/bus/busenum.c的DriverEntry處加入斷點 extern void asm_int3(); //<-------------外部函數(shù)聲明NTSTATUS DriverEntry (__in PDRIVER_OBJECT DriverObject,__in PUNICODE_STRING RegistryPath) /*++ Routine Description:Initialize the driver dispatch table.Arguments:DriverObject - pointer to the driver objectRegistryPath - pointer to a unicode string representing the path,to driver-specific key in the registry.Return Value:NT Status Code--*/ {asm_int3(); //<--------------外部函數(shù)調(diào)用Bus_KdPrint_Def (BUS_DBG_SS_TRACE, ("Driver Entry \n"));//// Save the RegistryPath for WMI.1.4修改sources文件,添加對softbp.obj的鏈接:原本sources文件中TARGETLIBS的值為
TARGETLIBS= $(DDK_LIB_PATH)\wdmsec.lib \$(DDK_LIB_PATH)\ntstrsafe.lib修改為: TARGETLIBS= $(DDK_LIB_PATH)\wdmsec.lib \$(DDK_LIB_PATH)\ntstrsafe.lib \softbp.obj1.5運行build -ceZ編譯鏈接整個toaster工程。
2.得到驅(qū)動文件后就是部署階段。win7 x64的部署也是夠磨人的:bcdedit增加啟動項(再次懷念xp的好,修改boot.ini就夠了),禁用驅(qū)動簽名,最后安裝驅(qū)動。以下的步驟都在虛擬機中進行
2.1增加啟動項:
2.1.1 以administrator權(quán)限下進入cmd,運行bcdedit命令設(shè)置端口COM1為調(diào)試端口, baudrate為115200(我已將虛擬機的打印機移除,打印機可恥的占用著COM1,并將串口的名字改為COM1)
bcdedit /dbgsettings serial baudrate:115200 debugport:12.1.2 復制一個開機選項, 以進入OS的debug模式 bcdedit /copy {current} /d DebugEnty2.1.3 接著增加一個新的選項到引導菜單 bcdedit /displayorder {current} {6426f429-17fc-11e6-bf64-ad656b9740aa}{6426f429-17fc-11e6-bf64-ad656b9740aa}是2.1.2運行結(jié)束后生成的id值2.1.4 激活前面生成的debug項
bcdedit /debug {6426f429-17fc-11e6-bf64-ad656b9740aa} on最后上一張效果圖,然后重啟機器準備調(diào)試:
3.windbg鏈接。
開始串口連接前,要設(shè)置調(diào)試符號和windbg啟動參數(shù),我直接寫了個腳本setenv.bat完成這兩步,以后雙擊運行即可:
;set _NT_SYMBOL_PATH=SRV*C:\sym;用于設(shè)置調(diào)試符號的路徑 set _NT_SYMBOL_PATH=SRV*C:\sym; ;我的winbdg裝在下列位置,后面的參數(shù)是串口調(diào)試參數(shù) "D:\WinDDK\7600.16385.1\Debuggers\windbg.exe" -b -k com:pipe,port=\\.\pipe\com_1,baud=115200,pipe系統(tǒng)重啟后雙擊setenv.bat,在虛擬機中選擇DebugEntry 按F8進入高級啟動項,然后選擇Disable Driver Signature Enforcement(注,在等待虛擬機啟動期間,經(jīng)常出現(xiàn)windbg閃退,這時再雙擊setenv.bat即可。)
4.部署toaster
進入win7后,在控制面板中沒有硬件向?qū)У囊幌?#xff01;需要通過在開始菜單-運行中輸入hdwwiz.exe來打開。真是何其不易。ms出于安全目的,希望我們通過driver store安裝受信得驅(qū)動,倒給開發(fā)驅(qū)動的找了一堆破事。安裝toaster的步驟不再敘述,參照wdk中xp下安裝方式在hdwwiz.exe中設(shè)置即可。
安裝的末尾,也就是進入DriverEntry,由于我們在代碼中設(shè)置了int3斷點,因此windbg會獲得執(zhí)行權(quán)。這時可以追加并驗證toaster的調(diào)試符號,因為此時驅(qū)動已經(jīng)加載到內(nèi)存中,因此設(shè)置斷點不會報類似code not set之類的錯誤,而且符號也能正確加載。
追加toaster調(diào)試符號 kd> .sympath+ C:\toaster\wdm\bus\objchk_win7_amd64\amd64 Symbol search path is: SRV*C:\sym;C:\toaster\wdm\bus\objchk_win7_amd64\amd64 檢驗符號是否加載 kd> lm m busenum* start end module name fffff880`0392e000 fffff880`0393e000 busenum (private pdb symbols) c:\toaster\wdm\bus\objchk_win7_amd64\amd64\BusEnum.pdb 驗證符號是否和sys版本一致 kd> !itoldyouso busenum c:\toaster\wdm\bus\objchk_win7_amd64\amd64\busenum.sysbusenum.sysTimestamp: 57333596SizeOfImage: 10000pdb: c:\toaster\wdm\bus\objchk_win7_amd64\amd64\BusEnum.pdbpdb sig: A8748D1B-8C93-4855-BBC7-4D773CADC3B0age: 1Loaded pdb is c:\toaster\wdm\bus\objchk_win7_amd64\amd64\BusEnum.pdbBusEnum.pdbpdb sig: A8748D1B-8C93-4855-BBC7-4D773CADC3B0age: 1MATCH: BusEnum.pdb and busenum.sys 驗證當前執(zhí)行的位置是不是在busenum中 kd> ln $ip (fffff880`039301a0)?? busenum!asm_int3?? |? (fffff880`039301c0)?? busenum!__security_check_cookie Exact matches:?待一切驗證完畢,就可以在AddDevice 等函數(shù)入口下斷點。等下次系統(tǒng)在啟動階段時,會在這些斷點處停下。如果想多次進入DriverEntry/AddDevice函數(shù),可以在設(shè)備管理器中找到toaster設(shè)備,然后右鍵disable/enable設(shè)備,就能多次進入這些函數(shù)
總結(jié)
以上是生活随笔為你收集整理的win7 x64部署和串口调试虚拟驱动toaster的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 漂泊在汉语视界中的蒙古歌者
- 下一篇: JUC种常用的辅助类