1 《Undocumented Windows 2000 Secrets》翻译 --- 2( 二 )

的符号文件中的符号名称,可以包括通配符?和* 。必须属于x *!*列出的模块名 。例如,x nt!*将列出在内核符号文件ntoskrnl.dbg中找到的所有符号,x win32k!*将列出win32k.dbg提供的符号 。如果调试器报告说“Couldn’t resolve ‘X….’”,尝试用.reload再次加载所有的符号文件 。
3.x 显示所有可用符号的一个子集,该子集不匹配表达式 。本质上,这是x !的一个变形,在这里!被省略了 。
随符号名一起显示的,还有与其相关的虚拟地址 。对于函数名,与其对应的就是函数的入口地址 。对于变量,就是改变量的基地址 。该命令值得的注意的地方是,它可以输出很多内部符号(internal symbols),这些在可执行文件的导出表中都是找不到的 。
ln:列出最近的符号
ln是我最喜欢的一个命令 。因为它可以快速且简单的访问已安装的符号文件 。算是x命令的理想补充 。不过后者适用于列出所有系统符号的地址 。Ln命令则用于按照地址或名称查找符号 。
l ln显示指示的地址以及和其前后相邻的地址的符号信息 。
l ln将符号名解析为与其对应的虚拟地址 。其过程与ln 类似 。
像x命令一样,调试器知道所有导出的以及一些内部的符号 。因此,对于想弄清楚出现在反编译列表或16进制转储中的不明指针的确切含义的人有着非常大的帮助 。注意,u、db、dw、dd也会使用符号文件 。
!processfIEld:列出EPROCESS的成员
该命令前的!号,意味着它来自于调试器的扩展模块—kdextx86.dll 。该命令可显示内核用来代表一个进程的EPROCESS结构(该结构并没有正式的说明文档)的成员及其偏移量 。
尽管该命令仅列出了成员的偏移量,但你也能很容易的猜出其正确的类型 。例如,LockEvent位于0x70处,其下一个成员的偏移量为0x80 。则该成员占用了16个字节,这与KEVENT结构非常类似 。如果你不知道什么是KEVENT,不要担心,我在第7章将会讨论之 。
!threadfields:列出ETHREAD成员
这是kdextx86.dll提供的另一个强大的选项 。和!processfields类似,它列出未文档化的ETHREAD结构的成员及其偏移量 。内核使用它表示一个线程 。参见示例1-2

!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中有详细说明
关闭调试器
你可以通过简单的关闭控制台窗口来关闭内核调试器 。当然,更好的关闭办法是使用q命令,这儿“q”代表着quit 。
更多的调试工具
在本书的光盘中,你可以找到两个由我的e-friends贡献的非常有价值的调试工具 。我很高兴他们允许我将完整版本放入我的光盘中 。Wayne J. Radburn的 PE and COFF文件浏览器(PEView)是本书读者的一个特殊免费工具 。Jean-Louis Seigne的Multi-Format Visual Disassembler(MFVDasm)一个限时版本 。本节将简单介绍这两个工具 。

推荐阅读