WEB开发网
开发学院软件开发VC 定制调试诊断工具和实用程序(8) 阅读

定制调试诊断工具和实用程序(8)

 2006-07-20 11:42:17 来源:WEB开发网   
核心提示: \REGISTRY\USER\S-1-5-21-1021013165-1664506389-1469997231-1938\Control Panel\International上面这行被转化为:HKCU\Control Panel\International你应该用来自 http://w
\REGISTRY\USER\S-1-5-21-1021013165-1664506389-1469997231-1938\
Control Panel\International

上面这行被转化为:

HKCU\Control Panel\International

你应该用来自 http://www.sysinternals.com 的 HANDLE 工具取代 OH。它提供了更好的格式化输出。FileUsage 工具如 Figure 15 所示,利用了本文上一部分介绍的类,并实现了从一个从 CConsoleAppDriver 派生的类来解析在 OnNewLine 方法中的 HANDLE 输出(解析细节参见 FileInfo.cpp)。这两者都必须用资源包中的 GFlags 来启用“Maintain a list of objects for each type”标志。

Figure 15 FileUsage 工具

文档

在 Win32 这一层,Windows 用来管理进程、线程和模块的一个有趣的数据结构是 PEB。你在 Platform SDK 或 DDK 中找不到任何关于该结构的文档。但是,如果你下载 Windows 的调试工具(Debugging Tools for Windows),其中有一个工具是 WinDbg。用这个工具你可以钻研 PEB 以及更多其它信息。

WinDbg 除了是一个内核模式的调试器外,它还带有几个非常有用的扩展 DLLs。kdex2x86 实现了一个 strct 命令,这个命令使你能找到几个有趣的无正式文档的 C 式样数据结构,包括:PEB、EPROCESS、KPROCESS 和 KTHREAD。确保遵循下列简单规则:总是使用与你所需的 Windows 版本一致的扩展;否则,这些内部结构可能会与你的应用程序实际试图存取的扩展版本不一致。为了使用该命令,你只须借助对任何进程的调试,比如:NotePad;在命令行随时调用 kdex2x86.strct 即可。对一个给定的进程,用 PROCESS_VM_READ 作为希望的进程句柄访问方式,用 ReadProcessMemory 存取其 PEB 内容并不难。这是因为其 PEB 总是位于地址 0x7ffdf000 处(或者用 NtQueryInformationProcess 得到地址)。不幸的是,后面的三个结构属于内核,因此,从一般的 Win32 应用程序无法对它们进行存取。如果你想跨越雷池,请首先阅读 James Finnegan在 1998 年 3 月的 MSJ 文章:“op Open a Privileged Set of APIs with Windows NT Kernel Mode Drivers”。

Figure 16 是对 Windows 2000 PEB 的剖析,本文 2002 年 6 月第一部分里那个神秘的辅助函数 GetProcessCmdLine 的源代码中用到两个很相似的但不太透明的数据结构:

typedef struct
{
  DWORD Filler[4];
  DWORD InfoBlockAddress;
} __PEB;
typedef struct
{
  DWORD Filler[17];
  DWORD wszCmdLineAddress;
} __INFOBLOCK;

命令行应该被存储在 __INFOBLOCK 中的某个域指向的一个内存块中,借助此域可以在 PEB 开始位置到四个DWORD偏移量处找到命令行。参见 Figure 16,你能看到四个 DWORD 偏移(0x10)到 ProcessParameter 指针。

下一步是找到 _RTL_USER_PROCESS_PARAMETERS 结构指向的定义,再次用 strct 扩展命令获得答案,如 Figure 17 所示。填充 17 个 DWORD 到 _RTL_USER_PROCESS_PARAMETERS 的 0x44 偏移处,并直接跳至 _UNICODE_STRING CommandLine 域指针,未使用 Length 域。4

+040 struct _UNICODE_STRING CommandLine
+040 uint16 Length
+042 uint16 MaximumLength
+044 uint16 *Buffer

除了列出每个 PEB 域之外,你还可以用 WinDbg 的 !peb 命令轻松译解这些域。

如 Figure 18 所示,如果你加载某个进程(如 Resource Kit 中的 oh.exe ),!peb 命令列出了一些有趣的字段的值,比如:ProcessParameters.CommandLine。借助这些命令,你可以进一步深入钻研到 Windows NT、Windows 2000 和 Windows XP 的内幕。

(全文完)

上一页  1 2 3 4 5 

Tags:定制 调试 诊断

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接