windbg常用调试命令和控制命令
2012-10-16 16:01
489 查看
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
指定控制显示多少元素. 比如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] : 清除指定断点
相关文章推荐
- Windbg内核调试之二: 常用命令
- 整理一些平时调试.NET Application使用WinDbg + SOS的常用命令
- Windows调试工具入门-5(WinDbg内核调试常用命令)
- WinDbg学习笔记七 - 内核调试常用命令1 - 查看目标机
- Windbg内核调试之二: 常用命令
- WinDbg学习笔记八 - 内核调试常用命令2 - 进程相关
- WinDbg学习笔记十 - 内核调试常用命令4 - 内存
- WinDBG常用调试命令
- WinDbg学习笔记九 - 内核调试常用命令3 - 线程相关
- Windbg内核调试之二: 常用命令
- Windbg内核调试之二: 常用命令
- gdb和windbg常用调试命令对照
- Windbg程序调试系列1-常用命令说明&示例
- WinDbg设置和常用调试命令
- WinDbg内核调试常用命令
- Windbg 调试基本步骤与常用命令
- WinDbg 内核调试常用命令
- Windbg内核调试之二: 常用命令
- WinDbg常用调试命令
- WinDbg调试操作系统中中断系统时的常用命令