定制调试诊断工具和实用程序(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://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 的内幕。
(全文完)
- ››调试SQL server 2008功能设置
- ››调试JavaScript错误
- ››定制个性化的对话框窗口类
- ››定制 SWT/RCP 界面:如何编写一个漂亮的 SWT/RCP ...
- ››调试和测试 Swing 代码
- ››定制基于 Visual studio 2005 平台 Windows CE(AR...
- ››定制版黑雨 blackra1n 越狱3.1.2 全系 iPhone
- ››调试集成 Java 和 C/C++ 的代码
- ››定制 Eclipse RCP 应用程序,第 1 部分: 可与 SWT...
- ››调试JavaScript脚本程序(Firefox篇)
- ››调试JavaScript/VB Script脚本程序(ASP.NET篇)
- ››调试JavaScript/VB Script脚本程序(Wscript篇)
更多精彩
赞助商链接