在察看 Windows 2000 内核代码时 , 你会经常遇到像 MOV EAX, FS:[18h] 这样的指令 。这些指令用于取出属于 TEB 或 KPCR 的成员的值 , 或者是属于其他包含在 FS 段中的结构体的成员的值 。它们中的大多数都指向其他的内部结构 。命令行选项u 和k 允许你;u 表示使用用户模式下的 FS 段;k 表示使用内核模式下的 FS 段 。例如 , 命令: w2k_memdu #0x1E8 0x30 (见 示列 4-6 )将在用户模式下 , 从位于 FS:[30h] 处的内存块中转储( dump ) 488 个字节 。而命令: w2k_memdk #0x1C 0x20 (见 示列 4-7 )将显示由内核模式下的 FS:[20h] 指向的内存块的前 28 个字节 , 这实际上是指向 KPRCB 的一个指针 。如果你不知道 PEB 或 KPRCB 是什么 , 不要着急 , 读完本书你就会一目了然了 。
示列 4-6. 显示进程环境块( PEB )
示列 4-7. 显示内核的处理器控制区域( KPRCB )
句柄 / 对象 解析
假设你有一个对象句柄 , 而且你想要看看该句柄对应的对象在内存中是什么样子 。如果你使用h 选项 , 你就会发现完成这一任务太简单了 , 该选项将调用 Spy 设备的 SPY_IO_HANDLE_INFO 函数(见 列表 4-26 )来查找给定句柄的对象体( Object Body ) 。Windows 2000 对象世界是一个令人惊讶的主题 , 我将在第七章深入剖析它 。所以 , 现在先把它丢掉一边去 。
相对寻址
有时使用这种寻址方式可以很容易显示一系列内存块 , 这些内存块间隔相同大小的字节 。这很有可能 , 比如 , 一个数组结构 , 像朵线程程序中的 TEB 堆栈 。a 和s 选项通过将给定的地址解释为一个偏移量 , 来进行对寻址 。这两个选项的区别是:a ( add bias )将产生一个正的偏移量 , s ( subtract bias )则产生一个负的偏移量 。示列 4-8 展示了命令: w2k_memd #32 0xC0000000a 4096 4096 的输出结果 。它将取出三个连续 4KB 页中的前 32 个字节 , 起始地址为: 0xC0000000 , 系统的页表就位于此处 。注意 , a 选项接近命令的结尾处 。它将使随后的“ 4096 ”将被解释为偏移量 , 该偏移量将被加到前面的基地址上 。
示列 4-8. 页表样本
示列 4-8 还展示了如果传入一个无效的线性地址会发生什么 。显然 , 第一对页表涉及的 4MB 地址范围: 0x00000000----0x003F0000 和 0x00400000-----0x007F0000 是有效的 。而第三对页表则是无效的 。w2k_mem.exe 会通过显示一个空表来反映这一现实 。程序知道那个地址范围是有效的 , 因为 Spy 设备的 SPY_IO_MEMORY_DATA 函数将此信息放入作为结果的 SPY_MEMORY_DATA 结构中(参见 列表 4-25 ) 。
间接寻址
我所钟爱的命令选项之一就是:p , 因为在我准备这本书的时候 , 它为我节省了很多打字的时间 。该选项和u 和k 的工作方式类似 , 但不使用 FS 段 , 而是使用先前显示过的数据块 。这是一个很棒的特性 , 如果你想向下寻找链表上的对象 , 例如 , 读取下一个成员的地址 , 随该命令一起 , 键入一个新的命令等等 , 通过简单在命令中加入p 选项和一系列偏移量 , 就可以指定下一个对象的链接在前一个 16 进制 Dump 表中的位置 。
在 示列 4-9 中 , 我使用该选项来向下遍历当前活动进程的链表 。首先 , 我告诉通过内核调试器获取系统内部变量 PsActiveProcessHead 的地址 , 该地址是一个 LIST_ENTRY 结构 , 用于标识进程链表的开始 。LIST_ENTRY 结构中包含一个 Flink (向前指针)成员和一个 Blink (向后)成员 。Flink 成员位于偏移量 0 处 , Blink 成员位于偏移量 4 处(参见 列表 2-7 ) 。命令: w2k_mem #8d 0x8046A180p 0 0 0 0 首先转储 PsActiveProcessHead (这是一个 LIST_ENTRY 结构) , 然后从p 选项出开始转为间接寻址 。选项后的四个 0 是用来告诉 w2k_mem.exe 提取前一个数据块中偏移量为 0 的值 , 这正是 Flink 所在的位置 。注意 , 示列 4-9 中的 Blink 成员在偏移量为 4 的位置上 , 它指向前一个 LSIT_ENTRY 之后 , 就像我们期望的那样 。
推荐阅读
- 怀旧服暗月马戏团时间
- 如何在Windows2000中动态禁用/启用Ctrl-Alt-Delete
- 部分未公开的Windows 2000核心功能调用
- Windows 2000服务器配置攻略
- 关掉Windows 2000不必要的服务
- Windows 2000的“隐形”武器
- Windows 2000 快速查找文件
- 获得Windows 2000的帮助信息
- Windows 2000 用户和计算机帐户管理
- 三国演义中文丑被谁杀的