windbg常用调试命令和控制命令
http://blog.csdn.net/cqupt_chen/article/details/8077193
1.配置符号
.sympath : 指定符号路径 例如 .sympath c:\windows\symbos
此外我们还可以指定微软的符号服务器,在需要的时候自动下载
.sympath "SRV*
2.创建日志文件
-
0: kd> .logopen d:\test.log
-
Opened log file 'd:\test.log'
-
0: kd> bl
-
-
0: kd> !gflag
-
Current NtGlobalFlag contents: 0x00000400
-
ptg - Enable pool tagging
-
0: kd> .logclose
-
Closing open log file d:\test.log
3.定位函数和变量
使用x命令可以定位符号,比如内核驱动程序到处的函数与变量、用户模式DLL导出的函数以及全局变量等.语法格式是:x [module]![symbol]. 并且还可以使用*作为通配符.
例如我们想查找nt模块中包含有 processcreate字符的符号
-
0: kd> x nt!*processcreate*
-
8064353c nt!DbgkpPostFakeProcessCreateMessages = <no type information>
-
8052c0e2 nt!PsGetProcessCreateTimeQuadPart = <no type information>
此外我们还可以用ln命令来方向搜索一个地址.
-
0: kd> ln 80643540
-
(8064353c) nt!DbgkpPostFakeProcessCreateMessages+0x4 | (806435b2) nt!DbgkpOpenHandles
4.打印内核结构
windbg中,我们可以使用dt命令显示出数据结构和内核对象的类型信息.如果知道某个对象或者数据结构在内存中的地址,还可以使用dt命令分析相应的结构成员.如果指定了-r开关,那么dt会递归分析遇到的嵌套结构.如下命令显示了PEB结构的信息.并且把dt _EPROCESS应用到了特定的进程上.
-
0: kd> dt _PEB
-
nt!_PEB
-
+0x000 InheritedAddressSpace : UChar
-
+0x001 ReadImageFileExecOptions : UChar
-
+0x002 BeingDebugged : UChar
-
+0x003 SpareBool : UChar
-
+0x004 Mutant : Ptr32 Void
-
+0x008 ImageBaseAddress : Ptr32 Void
-
+0x00c Ldr : Ptr32 _PEB_LDR_DATA
-
+0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS
-
[...]
-
0: kd> dt _EPROCESS 8055d0c0
-
ntdll!_EPROCESS
-
+0x000 Pcb : _KPROCESS
-
[...]
-
+0x160 PhysicalVadList : _LIST_ENTRY [ 0x8055d220 - 0x8055d220 ]
-
+0x168 PageDirectoryPte : _HARDWARE_PTE_X86
-
+0x168 Filler : 0
-
+0x170 Session : (null)
-
+0x174 ImageFileName : [16] "Idle"
-
+0x184 JobLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
-
+0x18c LockedPagesList : (null)
-
+0x190 ThreadListHead : _LIST_ENTRY [ 0x8055d250 - 0x8055d250 ]
-
+0x198 SecurityPort : (null)
-
[...]
-
5.格式化数据输出
我们可以使用各格式打印内存中搜索到得数据.例如
使用db命令会将数据显示为16进制字节或者ansi字符格式.
dd命令会将数据显示为双字的值 dd后可以加上L[n]指定控制显示多少元素. 比如L5显示5个双字.
da/du命令显示ansi和unicode字符串.
-
0: kd> dd 80680680
-
80680680 00610044 006c0079 00670069 00740068
-
80680690 0061004e 0065006d 00000000 00610044
-
806806a0 006c0079 00670069 00740068 00690042
-
806806b0 00730061 00000000 00610044 006c0079
-
806806c0 00670069 00740068 00740053 00720061
-
806806d0 00000074 00000000 0025007b 00380030
-
806806e0 0078006c 0025002d 00340030 002d0078
-
806806f0 00300025 00780034 0025002d 00320030
-
0: kd> dd 80680680+8 L2
-
80680688 00670069 00740068
-
0: kd> db nt!szDaylightBias
-
8068069c 44 00 61 00 79 00 6c 00-69 00 67 00 68 00 74 00 D.a.y.l.i.g.h.t.
-
806806ac 42 00 69 00 61 00 73 00-00 00 00 00 44 00 61 00 B.i.a.s.....D.a.
-
806806bc 79 00 6c 00 69 00 67 00-68 00 74 00 53 00 74 00 y.l.i.g.h.t.S.t.
-
806806cc 61 00 72 00 74 00 00 00-00 00 00 00 7b 00 25 00 a.r.t.......{.%.
-
806806dc 30 00 38 00 6c 00 78 00-2d 00 25 00 30 00 34 00 0.8.l.x.-.%.0.4.
-
806806ec 78 00 2d 00 25 00 30 00-34 00 78 00 2d 00 25 00 x.-.%.0.4.x.-.%.
-
806806fc 30 00 32 00 78 00 25 00-30 00 32 00 78 00 2d 00 0.2.x.%.0.2.x.-.
-
8068070c 25 00 30 00 32 00 78 00-25 00 30 00 32 00 78 00 %.0.2.x.%.0.2.x.
-
0: kd> du nt!szDaylightBias
-
8068069c "DaylightBias"
6.寄存器相关命令
r指令可以读取所有寄存器
r eax 读取eax寄存器
r zf 读取零标志位
并且还可以通过指定的值修改寄存器例如 r eax=5
-
0: kd> r
-
eax=00000001 ebx=00001750 ecx=80554780 edx=000002f8 esi=00000000 edi=3794d220
-
eip=8052c5dc esp=805523b0 ebp=805523c0 iopl=0 nv up ei pl nz na po nc
-
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000202
-
nt!RtlpBreakWithStatusInstruction:
-
8052c5dc cc int 3
-
0: kd> r eax
-
eax=00000001
-
0: kd> r zf
-
zf=0
7.内存搜索命令
使用s(search memory)命令可以搜索内核或用户模式内存中的字节模式.
-
0: kd> s -d b2738000 Lb2763000-b2738000 0x00905a4d
-
b2786000 00905a4d 00000003 00000004 0000ffff MZ..............
除此之外,我们还可以指定-a命令搜索ansi字符串,-u搜索unicode字符串.
如果指定s -[l6]su b2738000 Lb2763000-b2738000 则表示搜索大于6个字符的unicode字符串.
8.控制命令
g [breakaddress] : 开始执行当前进程或者线程,知道程序结束、到达可选参数[breakaddress]指令,或者其他导致程序停止的事件发生.
p [count] : 单步执行[count]条指令,如果没有指定count,默认执行一条.如果遇到的是子例程,该命令就会将调用当中一条指令执行.
pa <stopaddress> : 单步执行到地址stopaddress
pt : 单步执行到下一个返回指令
t [count] : 跟踪[count]条指令,如果没有指定count,默认为一条.如果遇到的是子例程.则跟踪进入子例程执行每条指令.
ta <stopaddress> : 跟踪执行到地址stopaddress
tt : 跟踪执行到下一返回指令
u [address] : 反汇编address地址处的指令.如果没有指定address.就从eip处开始反汇编
uf [address] : 反汇编某个函数的所有指令.uf 不带参数,则反汇编当前eip所属函数
bp <location>
bm <location> : 这三条命令都是下断,不同的是bp是针对对地址下断点,bu是针对确切的符号下断点,bm也是针对符号下断,但是他支持通配符.
bu <location> : bu又叫做延迟断点.
bl : 列出所有断点
bc [number] : 清除指定断点
版权声明:本文为博主原创文章,未经博主允许不得转载。
阅读(506) | 评论(0) | 转发(0) |