學習使用常用的windbg命令(u、dt、ln、x)


http://blog.csdn.net/wesley2005/article/details/51501514

目錄:

(1) u命令(反匯編)

(2) dt命令(查看數據結構

(3) ln命令(查找就近的符號)

(4) x命令(顯示模塊的符號)

(5) k命令(顯示調用棧)

(6) d命令(以數據方式顯示)

(7) b命令(斷點)

(8) lm lmvm (顯示模塊信息)

(9) .reload (重加載模塊)

(10) !process !thread .process .thread (查看進程線程信息)

(11) !object (查看對象信息)

(12) !devnode (查看設備對象)

(13) g命令 (繼續執行)

(14) operators (MASM)(匯編下的操作符,poi,by,&等,條件斷點最有用)

(15) e命令 (寫內存數據)

(16) !ca命令 (查看session的ControlArea)

(17) r命令 (查看修改寄存器)

 

詳細

(1)u命令(反匯編)

uf ICSF!SfDirectoryControl

可以查看整個函數的匯編代碼

u ICSF!SfDirectoryControl ICSF!SfDirectoryControl+0X30

可以看到30個字節的匯編指令

ub ICSF!SfDirectoryControl L30

可以查看SfDirectoryControl 之上的30字節的匯編指令

(2)dt命令(查看數據結構)

dt nt!_IRP -r2
可以查看二級結構,

從而知道IoGetCurrentIrpStackLocation宏實際取的是_IRP.Tail(0x040).Overlay(0x000).CurrentStackLocation(0x020)。

也就是說,IRP+0X60里存放的就是_IO_STACK_LOCATION的地址

實例:

dt nt!_IRP poi(ebp+0x0c) -r2               *注釋:dispatch中,ebp+0ch存放的就是IRP參數的地址

顯示結果(省略一部分):

+0x040 Tail             : __unnamed
      +0x000 Overlay          : __unnamed
         +0x000 DeviceQueueEntry : _KDEVICE_QUEUE_ENTRY
         +0x000 DriverContext    : [4] (null) 
         +0x010 Thread           : 0x822934d8 _ETHREAD
         +0x014 AuxiliaryBuffer : 0x8225bc30 "???"
         +0x018 ListEntry        : _LIST_ENTRY [ 0x0 - 0x0 ]
         +0x020 CurrentStackLocation : _IO_STACK_LOCATION
         +0x020 PacketType       : 0x822f29ac
         +0x024 OriginalFileObject : 0x822ecde8 _FILE_OBJECT
然后,就可以得到irpSp的地址0x822f29ac了。

(3)ln命令(查找就近的符號)

0: kd> ln 804e23a2
(804e23a2)   nt!IopfCallDriver   |  (804e2417)   nt!KiInsertTimerTable
Exact matches:

(4)x命令(顯示模塊的符號)

x nt!*

則顯示nt的所有符號

(5)k命令(顯示調用棧)

kd

直接顯示所有的棧情況

kb

顯示前3個參數

kp

顯示調用棧,及所有參數值和它們的類型

kc

只顯示調用棧的模塊名和地址(不顯示調用棧的地址)

(6)d命令(以數據方式顯示)

da

顯示ascii碼

dc

按單字節顯示字符

db

按單字節顯示

dd

按4字節顯示

dD

按8字節顯示(64位下常用)

df

按浮點顯示

dp

按4字節或者8字節顯示(取決於是32位系統還是64位系統)

dw

按2字節顯示

dW

按2字節顯示字符

dyb

按二進制位顯示(一字節一組)

dyd

按二進制位顯示(4字節一組)

(7)b命令(斷點)

bp 0040108c

bp Myexe!main+5c

bp source.c:31

在指定地址下斷點

bp Myexe!main+5c "j 0!=eax 'dd @eax;gc';'gc'")

下條件斷點,如何寫表達式可參考本博文的operators (MASM)

bl

顯示所有斷點

bc 1

bc 1-4

bc *

刪除斷點

bd 1

bd 1-4

bd *

使斷點失效

ba r4 DSPD!g_Global

下硬件斷點

bu DSPD!DriverEntry

下延遲斷點(在驅動鏡像加載時,下斷點)

bm DSPD!openf*

下模糊斷點

(8)lm lmvm (顯示模塊信息)

lm

顯示所有加載模塊

lmvm DSPrivateData64

顯示指定模塊的詳細信息

 (9) .reload (重加載模塊)

.reload DSPrivateData64.sys

.reload /f /i DSPrivateData64.sys    (/f強制加載, /i忽略pdb不匹配)

.reload /u DSPrivateData64.sys       (卸載模塊)

(10) !process !thread .process .thread(查看進程線程信息)

!process 0 0

顯示所有進程

!process 0x843423 0

顯示進程信息

.process 0x843423

切換到指定進程

.process /i 0x843423

輸入g命令后切換到指定進程

.thread 0x87668432

切換到指定線程

!thread 0x87668432 0

查看線程信息

(11) !object (查看對象信息)

!object \

查看指定對象的信息

(12) !devnode (查看設備對象)

!devnode 0 1

查看所有的設備對象

(13) g命令 (繼續執行)

g    

繼續執行

gu

執行到本函數返回

(14)operators(MASM)(匯編操作符,poi,by,&等,條件斷點最有用)

可查看windbg幫助的operators (MASM)

poi(@ebp)        

地址(ebp)指向的指針。在kernel調試下,是目標機環境。user調試下,是編譯環境。

by(0x8423D435)   

地址指向的字節

$vvalid(AddressLength)

指定范圍的內存是否有效

& ! | 等,$scmp等

(15)e命令 (寫內存數據)

eb 0x838de64c 1

向指定地址內存按單字節寫入

ew (2字節)

ed (4字節)

ep (指針)

eq (8字節) 

ea (ASCII字符串)

eu (UNICODE字符串)

 

eza (ASCII字符串,NULL結尾)

ezu (UNICODE字符串,NULL結尾)

 

 (16) !ca命令 (查看section的ControlArea)

kd> !ca ff8636e8

ControlArea @ff8636e8
  Segment:    e1b74548    Flink              0   Blink:               0
  Section Ref        0    Pfn Ref           6c   Mapped Views:        1
  User Ref           1    Subsections        5   Flush Count:         0
  File Object ff86df88    ModWriteCount      0   System Views:        0
  WaitForDel         0    Paged Usage      380   NonPaged Usage       e0
  Flags (10000a0) Image File HadUserReference 

(17) r命令 (查看修改寄存器)

kd>reax

eax=00000000

查看寄存器,也可以用,r@eax等

kd>reax=1

eax=00000001

設置寄存器的值

常在斷點中使用,比如

kd> bp vDiskBus!InitManager+0xb3 " r@eax=0;gc"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM