Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2601158
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5920
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: Windows平台

2015-07-02 16:28:16

windbg常用调试命令和控制命令
http://blog.csdn.net/cqupt_chen/article/details/8077193

1.配置符号

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

2.创建日志文件

  1. 0: kd> .logopen d:\test.log  
  2. Opened log file 'd:\test.log'  
  3. 0: kd> bl  
  4.   
  5. 0: kd> !gflag  
  6. Current NtGlobalFlag contents: 0x00000400  
  7.     ptg - Enable pool tagging  
  8. 0: kd> .logclose  
  9. Closing open log file d:\test.log  

3.定位函数和变量

使用x命令可以定位符号,比如内核驱动程序到处的函数与变量、用户模式DLL导出的函数以及全局变量等.语法格式是:x [module]![symbol]. 并且还可以使用*作为通配符.
例如我们想查找nt模块中包含有 processcreate字符的符号
  1. 0: kd> x nt!*processcreate*  
  1. 8064353c nt!DbgkpPostFakeProcessCreateMessages = <no type information>  
  2. 8052c0e2 nt!PsGetProcessCreateTimeQuadPart = <no type information>  

此外我们还可以用ln命令来方向搜索一个地址.

  1. 0: kd> ln 80643540  
  2. (8064353c)   nt!DbgkpPostFakeProcessCreateMessages+0x4   |  (806435b2)   nt!DbgkpOpenHandles  

4.打印内核结构

windbg中,我们可以使用dt命令显示出数据结构和内核对象的类型信息.如果知道某个对象或者数据结构在内存中的地址,还可以使用dt命令分析相应的结构成员.如果指定了-r开关,那么dt会递归分析遇到的嵌套结构.如下命令显示了PEB结构的信息.并且把dt _EPROCESS应用到了特定的进程上.
  1. 0: kd> dt _PEB  
  2. nt!_PEB  
  3.    +0x000 InheritedAddressSpace : UChar  
  4.    +0x001 ReadImageFileExecOptions : UChar  
  5.    +0x002 BeingDebugged    : UChar  
  6.    +0x003 SpareBool        : UChar  
  7.    +0x004 Mutant           : Ptr32 Void  
  8.    +0x008 ImageBaseAddress : Ptr32 Void  
  9.    +0x00c Ldr              : Ptr32 _PEB_LDR_DATA  
  10.    +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS  
  11. [...]  

  1. 0: kd> dt _EPROCESS 8055d0c0  
  2. ntdll!_EPROCESS  
  3.    +0x000 Pcb              : _KPROCESS  
  4.    [...]  
  5.    +0x160 PhysicalVadList  : _LIST_ENTRY [ 0x8055d220 - 0x8055d220 ]  
  6.    +0x168 PageDirectoryPte : _HARDWARE_PTE_X86  
  7.    +0x168 Filler           : 0  
  8.    +0x170 Session          : (null)   
  9.    +0x174 ImageFileName    : [16]  "Idle"  
  10.    +0x184 JobLinks         : _LIST_ENTRY [ 0x0 - 0x0 ]  
  11.    +0x18c LockedPagesList  : (null)   
  12.    +0x190 ThreadListHead   : _LIST_ENTRY [ 0x8055d250 - 0x8055d250 ]  
  13.    +0x198 SecurityPort     : (null)   
  14.    [...]  
  15.      

5.格式化数据输出

我们可以使用各格式打印内存中搜索到得数据.例如
使用db命令会将数据显示为16进制字节或者ansi字符格式.
dd命令会将数据显示为双字的值 dd后可以加上L[n]指定控制显示多少元素. 比如L5显示5个双字.
da/du命令显示ansi和unicode字符串.
  1. 0: kd> dd 80680680  
  2. 80680680  00610044 006c0079 00670069 00740068  
  3. 80680690  0061004e 0065006d 00000000 00610044  
  4. 806806a0  006c0079 00670069 00740068 00690042  
  5. 806806b0  00730061 00000000 00610044 006c0079  
  6. 806806c0  00670069 00740068 00740053 00720061  
  7. 806806d0  00000074 00000000 0025007b 00380030  
  8. 806806e0  0078006c 0025002d 00340030 002d0078  
  9. 806806f0  00300025 00780034 0025002d 00320030  
  10. 0: kd> dd 80680680+8 L2  
  11. 80680688  00670069 00740068  
  12. 0: kd> db nt!szDaylightBias  
  13. 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.  
  14. 806806ac  42 00 69 00 61 00 73 00-00 00 00 00 44 00 61 00  B.i.a.s.....D.a.  
  15. 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.  
  16. 806806cc  61 00 72 00 74 00 00 00-00 00 00 00 7b 00 25 00  a.r.t.......{.%.  
  17. 806806dc  30 00 38 00 6c 00 78 00-2d 00 25 00 30 00 34 00  0.8.l.x.-.%.0.4.  
  18. 806806ec  78 00 2d 00 25 00 30 00-34 00 78 00 2d 00 25 00  x.-.%.0.4.x.-.%.  
  19. 806806fc  30 00 32 00 78 00 25 00-30 00 32 00 78 00 2d 00  0.2.x.%.0.2.x.-.  
  20. 8068070c  25 00 30 00 32 00 78 00-25 00 30 00 32 00 78 00  %.0.2.x.%.0.2.x.  
  21. 0: kd> du nt!szDaylightBias  
  22. 8068069c  "DaylightBias"  


6.寄存器相关命令

r指令可以读取所有寄存器

r eax 读取eax寄存器

r zf 读取零标志位

并且还可以通过指定的值修改寄存器例如 r eax=5
  1. 0: kd> r  
  2. eax=00000001 ebx=00001750 ecx=80554780 edx=000002f8 esi=00000000 edi=3794d220  
  3. eip=8052c5dc esp=805523b0 ebp=805523c0 iopl=0         nv up ei pl nz na po nc  
  4. cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000202  
  5. nt!RtlpBreakWithStatusInstruction:  
  6. 8052c5dc cc              int     3  
  7. 0: kd> r eax  
  8. eax=00000001  
  9. 0: kd> r zf  
  10. zf=0  

7.内存搜索命令

使用s(search memory)命令可以搜索内核或用户模式内存中的字节模式.
  1. 0: kd> s -d b2738000 Lb2763000-b2738000 0x00905a4d  
  2. 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] : 清除指定断点

版权声明:本文为博主原创文章,未经博主允许不得转载。

阅读(462) | 评论(0) | 转发(0) |
0

上一篇:我常用的Windbg命令

下一篇:Windbg常用命令

给主人留下些什么吧!~~