Delphi 如何从外部进程获取进程环境块(PEB)?

Delphi 如何从外部进程获取进程环境块(PEB)?,delphi,winapi,api,Delphi,Winapi,Api,我想从“notepad.exe”进程中获取PEB。有人知道怎么做吗 我尝试了GetModuleHandleAPI,但它没有返回有效指针(每次都返回零),因为我必须是该模块的调用进程 出于这个原因,我想知道如何让它与EnumProcessModules或CreateToolhelp32SnapshotMatt Pietrek在一篇文章中描述了如何做到这一点。它是关于如何获取另一个进程的环境变量,其中第一步是获取指向PEB的指针。要做到这一点,他说,打电话。它填充的PROCESS\u BASIC\u

我想从“notepad.exe”进程中获取PEB。有人知道怎么做吗

我尝试了
GetModuleHandle
API,但它没有返回有效指针(每次都返回零),因为我必须是该模块的调用进程


出于这个原因,我想知道如何让它与
EnumProcessModules
CreateToolhelp32Snapshot

Matt Pietrek在一篇文章中描述了如何做到这一点。它是关于如何获取另一个进程的环境变量,其中第一步是获取指向PEB的指针。要做到这一点,他说,打电话。它填充的
PROCESS\u BASIC\u INFORMATION
结构包含PEB结构的基址。(您需要使用
ReadProcessMemory
读取它,因为地址将位于外部进程的地址空间上下文中,而不是您的地址空间。)


要调用
NtQueryInformationProcess
,您需要该进程的句柄。如果您自己启动了该进程(通过调用
CreateProcess
),那么您已经有了一个句柄。否则,您需要找到进程ID,然后调用
OpenProcess
。要获取进程ID,请使用
enumprocess
Process32First
/
Process32Next
搜索所需的进程。(我更喜欢后者,因为它能以更少的工作量提供更多的信息。)

神圣的天堂!你真是个天才!应该注意的是,一个WOW64进程有两个PEB,这会使事情稍微复杂一点IIRC@Anders这是正确的
ZwQueryInformationProcess
返回与调用进程位匹配的PEB。在32位(WOW64)进程尝试检索本机64位进程的PEB的情况下,
process\u BASIC\u INFORMATION.PebBaseAddress
为空,因为本机64位进程没有32位PEB。还请注意,32位和64位PEB具有不同的结构偏移量,因此必须修改此方法才能使64位进程成功读取32位PEB。文档中有一条注释说明:"... 查询在wow64下运行的进程时。。。返回的PebBaseAddress实际上是针对wow64下加载的64位模块。。。与32位模块相关的PEB可以通过获取PebBaseAddress并从其值中减去一页(0x1000)来找到……”显然,这将不再适用于Windows 8以后的版本,但提供了一种从32位TEB检索32位PEB地址的替代方法。