windbg常用调试命令和控制命令

1.配置符号

.sympath : 指定符号路径 例如 .sympath c:\windows\symbos
此外我们还可以指定微软的符号服务器,在需要的时候自动下载
.sympath " SRV* http://msdl.microsoft.com/download/symbols

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] : 清除指定断点

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值