一丶驅動的調試.
編寫驅動免不了調試.所以這里介紹一下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 | 上面設置了開關,下面就要進行關閉. |
