7 《Undocumented Windows 2000 Secrets》翻译 --- 第四章( 四 )


译注:
对于 w2k_mem #8d 0x8046A180p 0 0 0 0 命令
0x8046A180 需要由你自己系统中的 PsActiveProcessHead 的地址来替代 。
可通过内核调试器来查找 PsActiveProcessHead 的地址 , 我在这里使用的是 livekd , 命令为: ln PsActiveProcessHead
如果命令中加入了足够的值为 0 的参数 , 16 进制转储最终会回到 PsActiveProcessHead , 它用来标识进程链表的开始和结束 。就像第二章里解释的那样 , Windows 2000 维护的双向链表实际上是一个环;也就是说 , 链表中最后一个成员的 Flink 将指向链表中的第一个成员 , 而链表中第一个成员的 Blink 指向最后一个成员 。
示列 4-9. 向下遍历活动进程链表
加载模块
有时你可能会想 dump 一个模块在内存中的映像 , 但是该模块还没有映射到 w2k_mem.exe 进程的线性地址空间 。通过使用 / 和x 选项来显示的加载一个指定模块就可解决这一问题 。每个前缀为斜线(“ / ”)的命令项将被解释为模块的全路径名 , w2k_mem.exe 将尝试使用 Win32 API 函数 LoadLibraryEx() 从该路径出加载模块 。默认情况下 , 将使用加载选项 DON"T_RESOLVE_DLL_REFERENCES , 这会使模块被加载到内存中 , 但不会被初始化 。对于一个 DLL , 这意味着它的 DllMian() 入口点将不会被调用 。同样 , 在该 DLL 的导入节中指定的依赖模块也都不会被加载 。然而 , 如果你在路径参数之前 , 指定了x 选项 , 那么模块将在加载后进行完整的初始化 。注意 , 有些模块可能会拒绝在 w2k_mem.exe 进程的上下文环境中被初始化 。例如 , 内核模式的设备驱动程序就不能在使用x 选项的情况下 , 被加载到内存中 。
加载和显示一个模块一般需要经过两个操作步骤 , 如 示列 4-10 所示 。首先 , 你应该加载模块 , 而不显示任何数据 , 以找出系统分配给该模块的基地址 。幸运的是 , 只要在此期间 , 没有其他的模块加入到进程中 , 模块的加载地址就将是唯一的 , 因此 , 接下来尝试通过相同的基地址来加载模块 。在 示列 4-10 中 , 我加载了内核模式的设备驱动程序 nwrdr.sys , 它是微软的 NetWare 重定向器 。在我的系统里没有使用 IPX/SPX , 因此 , 默认没有加载该驱动程序 。
【7 《Undocumented Windows 2000 Secrets》翻译 --- 第四章】列表 4-10. 加载和显示一个模块映像( Module Image )

推荐阅读