windbg命令

!strct eprocess

dt -v -r ntdll!_peb (windows2003下改为:dt -v -r nt!_peb)

dt _eprocess

dt -v -r _eprocess (加上-v -r显示详细结构)

dt nt!_driver_object

列出可以调试的驱动程序

lm t n   (以前是!drivers)

加入源代码调试

file->source file path

设置符号文件

file->symbol file path

给驱动程序下断点

设置好symbol file path和source file path

然后file->open source file打开调试驱动程序的源代码。

在对应的代码上按f9

下断点后,程序对应的行会变成红色。

注意:sys是通过checked environment生成

查看DeviceIoControl 的inputbuffer

通过上面的方法在npid=*((DWORD *)InputBuffer)下断点。然后,在windbg的watch上面加入nPid已经InputBuffer。查看到InputBuffer为0xxxxx,然后在windbg上输入:dc 0xxxxx。就可以查看到InputBuffer对应的值。

产生如下错误:

*** Fatal System Error: 0x0000007e
                       (0xC0000005,0xF9FDB318,0xFA06EB88,0xFA06E884)

找到原因:Fatal System Error: 0x0000007e错误对应

Bug Check 0x7E: SYSTEM_THREAD_EXCEPTION_NOT_HANDLED

然后看0xC0000005对应

0xC0000005: STATUS_ACCESS_VIOLATION 
A memory access violation occurred.

所以结论是:A memory access violation occurred.

!process命令

!process 0 0 查看系统全部进程信息 (在虚拟机器远程调试才行)

!process cid ParentCid        其中cid就是pid的十六进制表示

查看特定地址的eprocess结构内容

dt _eprocess 81bef448

1. 查询符号

kd> x nt!KeServiceDescriptorTable*

8046e100 nt!KeServiceDescriptorTableShadow = <no type information>

8046e0c0 nt!KeServiceDescriptorTable = <no type information>

kd&gt; ln 8046e100

(8046e100)   nt!KeServiceDescriptorTableShadow   | (8046e140)   nt!MmSectionExtendResource

Exact matches:

nt!KeServiceDescriptorTableShadow = <no type information>

2. 下载系统文件的符号

symchk c:\winnt\system32\ntoskrnl.exe /s srv*c:\symbols*http://msdl.microsoft.com/download/symbols

SYMCHK: FAILED files = 0

SYMCHK: PASSED + IGNORED files = 1

3. 查看 event 对象的信号状态

!object \BaseNamedObjects

dt -b nt!_KEVENT xxxxxxxx

4. 查看 LastError

!gle

5. 指定进制形式,0x/0n/0t/0y 分别表示 16/10/8/2 进制

? 0x12345678+0n10

Evaluate expression: 305419906 = 12345682

6. 过滤命令窗口输出信息

.prompt_allow -reg +dis -ea -src -sym

7. .formats 命令

以多种格式显示表达式的值

0:000&gt; .formats @eax

Evaluate expression:

Hex:     00181eb4

Decimal: 1580724

Octal:   00006017264

Binary: 00000000 00011000 00011110 10110100

Chars:   ....

Time:    Mon Jan 19 15:05:24 1970

Float:   low 2.21507e-039 high 0

Double: 7.80981e-318

8. 异常处理相关

有 sx, sxd, sxe, sxi, sxn, sxr 几条命令可用来设置异常和事件的处理方式。比如:

0:000&gt; sxe ld

可以在加载 dll 时中断下来。

9. 内核调试时切换进程

lkd&gt; !process 0 0

lkd&gt; .process xxxxxxxx

10. 可在桌面上建立一个 WinDbg.exe 的快捷方式,然后在该快捷方式的属性力设置如下命令行

C:\WinDBG\windbg.exe -c ".prompt_allow +dis -reg -ea -src -sym; .enable_unicode 1; .enable_long_status 1; .logopen /t c:\dbglog\dbglog.txt"

11. 本机内核调试

通过File/Kernel Debug… 菜单可以打开内核调试选择窗口,选择最后一个 Local 选项页,确定后可以以内核方式调试本地机器。这时所有会挂起系统的命令都用不了了,但可以读写系统内存。另外,有一个方便的用途是用来查看系统结构,比如:dt nt!_EPROCESS。

附:WinDbg 10大调试命令

u: 反编译机器码

在检查crash dump是否正确时,你已经用过了此命令,u命令有三种格式:
1.u <from> 从地址<from>开始反编译8个机器码。
2.u <from> <to> 反编译<from>到<to>之间的所有机器码。
3.u 不提供任何参数时,从上次u命令停止的位置开始反编译。
当然,反编译打段代码是十分厌烦的,但如果你只想知道在特定地址发生的事情,那这是最便捷的方法。或许u命令最令人感兴趣的特性是它可以解析代码引用到的符号----即使是目标模块没有导出的符号。

db,dw和dd:Dump Memory BYTEs、WORDs和DWORDs
如果你当前感兴趣的内存数据是二进制的,那么调试器的16进制转储命令将能完成此任务。根据你对源地址(source address)数据类型的判断,来选择dd(针对BYTES)、dw(针对WORDS)、dd(针对DWORDS)。
1.db 将指定内存范围里的数据显示为两个部分:左边是16进制表示(每2个8 bit一组),右边是对应的ASCI码。
2. dw 仅按照16进制显示(16 bit一组)
3. dw 仅按照16进制显示(32 bit一组)
此组命令可以使用与u命令相同的参数。注意,<to>所指示的地址内容,也会被显示出来。如果没有任何参数,将显示接下来的128个字节。

x:检查符号
x命令非常重要。它可以根据已安装的符号文件创建一个列表。典型的使用方式如下:
1.x *!* 显示所有可用符号的模块。在启动后,默认只有ntoskrnl.exe的符号是可用的。其他模块的符号可以使用.reload命令来加载。
2.x <module>!<filter> 显示模块<module>的符号文件中的符号名称,<filter>可以包括通配符?和*。<module>必须属于x *!*列出的模块名。例如,x nt!*将列出在内核符号文件ntoskrnl.dbg中找到的所有符号,x win32k!*将列出win32k.dbg提供的符号。如果调试器报告说“Couldn’t resolv‘X….’”,尝试用.reload再次加载所有的符号文件。
3.x <filter> 显示所有可用符号的一个子集,该子集不匹配<filter>表达式。本质上,这是x <module>!<filter>的一个变形,在这里<module>!被省略了。随符号名一起显示的,还有与其相关的虚拟地址。对于函数名,与其对应的就是函数的入口地址。对于变量,就是改变量的基地址。该命令值得的注意的地方是,它可以输出很多内部符号(internal symbols),这些在可执行文件的导出表中都是找不到的.

ln:列出最近的符号
ln是我最喜欢的一个命令。因为它可以快速且简单的访问已安装的符号文件。算是x命令的理想补充。不过后者适用于列出所有系统符号的地址。Ln命令则用于按照地址或名称查找符号。
1.ln <address> 显示<address>指示的地址以及和其前后相邻的地址的符号信息。
2.ln <symbol> 将符号名解析为与其对应的虚拟地址。其过程与ln <address>类似。像x命令一样,调试器知道所有导出的以及一些内部的符号。因此,对于想弄清楚出现在反编译列表或16进制转储中的不明指针的确切含义的人有着非常大的帮助。注意,u、db、dw、dd也会使用符号文件。

!processfield:列出EPROCESS的成员
该命令前的!号,意味着它来自于调试器的扩展模块�Dkdextx86.dll。该命令可显示内核用来代表一个进程的EPROCESS结构(该结构并没有正式的说明文档)的成员及其偏移量。
尽管该命令仅列出了成员的偏移量,但你也能很容易的猜出其正确的类型。例如,LockEvent位于0x70处,其下一个成员的偏移量为0x80。则该成员占用了16个字节,这与KEVENT结构非常类似。

!threadfields:列出ETHREAD成员
这是kdextx86.dll提供的另一个强大的选项。和!processfields类似,它列出未文档化的ETHREAD结构的成员及其偏移量。内核使用它表示一个线程.

!drivers:列出已加载的Drivers
kdextx86.dll真是太棒了。!drivers列出了当前运行的内核和文件系统模块的详细信息。如果检查crash dump,该命令会列出系统崩溃那一刻的系统状态。示例1-3是我机器上输出的摘要。注意,在输出的最后一行,导致Windows 2000崩溃的Driver的地址为0xBECC2000,这显然是w2k_kill.sys引发蓝屏后显示的地址。
注:
在新的i386kd.exe(ver: 6.3.0017.0)中,!driver命令已不被支持。取而代之的是lm命令。该命令的一般用法是:lm t n

!sel:检查Selector的值
!sel实现于kdextx86.dll。它用来显示16个连续的memory selector(按地址升序排列)。你可以反复的使用此命令直到出现“Selector is invalid”。在第4章将讨论Memory Selector,到时我会提供一个示列代码来演示如何在你的程序中crack selectors。
注:
在新的调试器中,该命令已不被支持,取而代之的是:dg命令。其一般性用法为:dg.注意末尾的.符号。dg命令最多可列出256个Selector。调试器的Online Help中有详细说明

你可能感兴趣的:(命令,职场,windbg,休闲)