一丶驅動的調試.
編寫驅動免不了調試.所以這里介紹一下WinDbg的常用命令.
1.線程
命令 |
作用 |
~* |
顯示所有線程 |
~. |
顯示當前活動線程 |
~# |
顯示當前異常線程 |
~ num |
顯示第num個線程. |
~ num s |
切換到第num個線程 |
~*kb |
顯示所有線程的棧 |
額外命令
命令 |
作用 |
.detach |
取消附加你調試的進程 |
.attach pid |
附加你想調試的進程.需要16進制的pid |
2.斷點
命令 |
作用 |
bl |
列出系統中已經有的斷點 |
bc |
清除斷點例如: bc 1 -10 刪除1 -10的斷點. bc*清除全部 |
bd |
禁用斷點,但不清除. |
be |
激活斷點. |
bp [address][模塊名字][偏移] |
下斷點 bp xxModule!DisPatchRead + 0x30 |
bu module!fun |
bu模塊名加函數下段點. |
bm module!fun* |
支持通配符.不支持加偏移下載. |
ba [w len] [r len] [e len] address |
支持下內存斷點 w寫斷點 len代表長度. address 代表在address下w len長度的內存寫斷點 r讀,e執行. |
bp /p eprocess [address][func] |
可以對下進程斷點,只用xx進程調用這個代碼的時候才會斷下來 |
bp /t ethread [address][fun] |
對線程下端點.某個線程調用就能斷下來. |
區別:
bp 下的斷點是死斷點.函數名字變了但斷點還是在哪里.
bu 自動跟你你的函數進行下段點.不用擔心會變.
在新的windbg中,bp失敗.會自動換成bu.
3.內存查看命令
dt命令可以查看一些結構
命令 |
作用 |
dt nt!_EPROCESS |
查看nt模塊中定義的EPROCESS結構 |
dt nt!_EPROCESS -r |
列出結構中的結構 |
dt nt P*xxx |
通配符方式,列出所有中帶有P開頭的接結構 |
dt Address 結構 |
知道這個結構所在的地址.輸入則可以將這塊內存解釋為這個結構. |
x nt!Zw |
查找所有Zw開頭的函數. |
內存數據類型顯示命令
命令 |
作用 |
db [address] [L number] |
以一個字節顯示值和Ascii字符 |
dw [address] [L number] |
內存按照2個字節顯示 |
dd [address] [L number] |
內存按照4個字節顯示 |
dp [address] [L number] |
32位下等同於dd. 64位下等同於dq |
dq [address] [L number] |
內存以8個字節顯示 |
df [address] [L number] |
內存以4個字節浮點數顯示 |
db 0x800000 L4 以一個字節顯示內存.顯示長度為4 * sizeof(db )個
字節.
讀取內存中的指針
我們上面的d開頭的命令你只能查看這個值.這個值有可能是存儲指針.
我們除非在進行一次d命令才可以,下面的命令直接就可以
命令 |
作用 |
ddp |
|
dpp |
|
dqp |
|
ddu |
|
dpu |
|
dqu |
|
dda |
|
dpa |
|
dqa |
|
d表示4個字節. q表示8個字節. p 32位下4個字節.64位下8個字節.
所以p是可以靈活轉化的.
所以上面的命令可以簡化為
命令 |
作用 |
dpa |
|
dpu |
|
dpp [len] |
顯示局部變量的值 |
dps |
|
dv |
顯示局部變量的值,看變量的起始地址是ebp-xxx是 |
p: DWORD或者Qword
a: Ascii
u: UNICODE
所以上面的命令可以解析一下
如:
dpa
d: 命令前綴
p: 根據32位還是64位,分別以4個字節.或者8個字節顯示
a: Ascii嗎.
所以意思就是: 解析地址里面的值.如果是指針.則以32/64位顯示為AscII碼.
字符相關
命令 |
作用 |
da |
顯示ascii值 |
du |
顯示unicode值 |
ds |
顯示ANSI_STRING的值 |
dS |
顯示UNICODE_STRING的值.注意大小寫. |
4.修改內存命令
命令 |
作用 |
eb [address] value |
修改一個字節,很重要.可以改代碼的機器碼. |
ed [address] value |
修改4個字節 |
eD [address] value |
|
ef [address] value |
修改float內存 |
ep [address] value |
修改指針內存 |
eq [address] value |
|
ew [address] value |
|
ea [address] value |
|
eu [address] value |
|
eza[address] value |
|
ezu [address]value |
|
關於修改內存.只需要熟悉 eb ed即可.
5.棧相關操作命令
命令 |
作用 |
kv |
顯示當前棧的調用情況.顯示函數的前3個參數 |
!irp address |
查看當前Irp的值. |
kp |
顯示當前棧,顯示當前函數的所有參數 |

ChiEbp |
RetAddre |
Args |
上一層的EBP |
當前函數返回地址 |
當前調用函數的參數 |
6.進程線程命令(內核命令)
命令 |
作用 |
!process 0 0 |
列出系統進程信息 |
!process 0 7 |
列出系統進程詳細信息 |
!process EPROCESS 7 |
列出進程詳細信息 |
.process /p EPROCESS |
進入該進程上下文,如果不切換查看他的信息查看不到. |
.thread ETHREAD |
進入該線程上下文 |
!thread ETHREAD |
查看線程結構 |
.logopen d:\xx.txt |
開關語句. 顯示的所有內容都重定向到xx.txt |
.logclose |
上面設置了開關,下面就要進行關閉. |