1. 程式人生 > >【舊文章搬運】Windbg+Vmware驅動除錯入門(三)---Windbg基本除錯入門

【舊文章搬運】Windbg+Vmware驅動除錯入門(三)---Windbg基本除錯入門

原文發表於百度空間,2009-01-09
==========================================================================

這一節的內容是Windbg入門,用一些基本的命令告訴你如何使用Windbg~~
僅作入門,更詳細的可以參考Raymond老師的《軟體除錯》的第30章---"WinDbg用法詳解"和Windbg自帶的幫助檔案

我使用偵錯程式的經驗完全來自於Ring3的Ollydbg,所以我在初用Windbg時覺得如果Ollydbg的功能我在Windbg中都知道如何使用的話,那我基本可以叫做入門了,下面我就以這個想法來談談Windbg的入門~~
Windbg是基於命令控制的,剛開始覺得煩瑣,其實用了之後才發現很強大~~~

1.基本除錯控制
執行程式(Run): 快捷鍵:F5 命令:g
單步步入(Step In): 快捷鍵:F8 命令:p
單步步過(Step Over): 快捷鍵:F10 
執行到游標所在行: 快捷鍵:F7
執行到返回:gu
執行到指定地址:g [Address]
重新執行除錯程式: 快捷鍵:Ctrl+Shift+F5(這個對驅動一般用不到)

2.斷點
斷點之於除錯當然是非常重要的
常用命令:
bp [Address]or[Symbol] 在指定地址下斷
可以使用地址或符號,如
    bp 80561259(Windbg預設使用16進位制)
    bp MyDriver!GetKernelPath
    bp MyDriver!GetKernelPath+0x12
bp [Address] /p eprocess 僅噹噹前程序為eprocess時才中斷
這個很常用,比如你bp nt!NtTerminateProcess,但是隻想在某一程序觸發此斷點時才斷下來,那就加上這個引數吧,因為核心中的程式碼是各個程序共用的,所以此命令很實用
bp [Address] /t ethread 僅噹噹前執行緒為ethread時才中斷,用法跟/p引數類似
bu [Address]or[Symbol] 下一個未解析的斷點(就是說這個斷點需要延遲解析)
這個也很常用,比如我們的驅動名為MyDriver.sys,那麼在驅動載入之前下斷bu MyDriver!DriverEntry,
然後載入這個驅動時就可以斷在驅動入口,並且這個是不需要除錯符號支援的
bl 列出所有斷點,L=List
bc[id] 清除斷點,c=Clear,id是bl檢視時的斷點編號
bd[id] 禁用斷點,d=Disable,id即斷點編號
be[id] 啟用斷點,e=Enable,id為斷點編號

3.檢視和修改資料
除錯中不可避免的要檢視和修改資料
檢視記憶體:
db/dw/dd/dq [Address]       位元組/字/雙字/四字方式檢視資料
da/du [Address]           ASCII字串/Unicode字串方式檢視指定地址
其它常用的如檢視結構
dt nt!_EPROCESS
dt nt!_EPROCESS 89330da0 (把0x89330da0作為物件指標)
修改記憶體:
eb/ew/ed/eq/ef/ep Address [Values] 
位元組/字/雙字/四字/浮點數/指標/
ea/eu/eza/ezu Address [Values] 
ASCII字串/Unicode字串/以NULL結尾的ASCII字串/以NULL結尾的Unicode字串
搜尋記憶體:
s -[b/w/d/q/a/u] Range Target
搜尋位元組/字/雙字/四字/ASCII字串/Unicode字串

4.暫存器
在用Windbg除錯時可以Alt+4直接調出暫存器視窗,然後拖放到合適的位置就可以。
要修改呢就直接雙擊相應的項就可以了。
把命令的方式也說一下,比較簡單:
r 顯示所有暫存器的值
r eax 顯示eax的值
r eax=1 修改eax的值為1

5.輔助命令
!process 顯示當前程序資訊
!process 0 0 顯示當前所有程序(會有殭屍程序)
!process 1f4 顯示pid為1f4的程序資訊,後面也可以跟eprocess的值
!thread 顯示當前執行緒資訊
!thread 
!process 1f4 顯示tid為768的執行緒資訊,後面也可以跟ethread的值
棧相關:
k 顯示呼叫棧
kb 顯示ebp和前3個引數
kp 以函式呼叫形式顯示棧

以上就是常用的命令了~~~


來個簡單的實踐過程,步驟如下:
1.編譯好你的驅動,假設名為ShowSSDT.sys,並把驅動符號檔案ShowSSDT.pdb傳送到MySysSymbols資料夾下(之前設定的自己的除錯符號資料夾)
2.啟動虛擬機器,選擇除錯方式進入系統
3.迅速開啟“雙機除錯”,建立除錯連線,詳細過程第二節講過了
4.等待虛擬機器中系統啟動完畢(不等也行,反正下斷要在驅動載入之前就行了)
5.在Windbg中按下Ctrl+Break,輸入bu ShowSSDT!DriverEntry,回車確認,然後輸入g命令繼續執行
6.把ShowSSDT.sys拖到虛擬機器中,在虛擬機器系統中啟動InstDrv,載入此驅動
7.回到Windbg視窗,如果一切正常的話,你會看到已經中斷在ShowSSDT.sys的入口程式碼處了
接下來,要單步還是要下斷點、要繼續執行什麼的,就全由你來作主了~~
僅作入門,Windbg自帶的幫助其實很全了,學習要靠自己哦,小童鞋加油~~