进程环境块
进程环境块(PEB)是 Windows NT操作系统内部使用的数据结构,用以存储每个进程的运行时数据。[1] Microsoft的MSDN文档中仅公开了PEB的少数几个域,该结构“在未来的Windows版本中可能会修改”。[2]PEB包含的数据结构适用于整个进程,如全局上下文,启动参数,程序image装载器的数据结构,程序image的基地址,进程级互斥同步访问对象等。[1]
PEB与kernel mode EPROCESS
数据结构密切相关。也是逐进程数据结构,在客户-服务器运行时子系统(CSRSS)进程地址空间被管理。但是,类似于CSRSS数据结构,PEB自身并不是内核模式数据结构。它驻留在所关联的进程的用户态内存空间中。这是因为它被设计为被操作系统的用户态的程序所使用,如NTDLL,在内核态之外执行,如程序映象的加载器与堆管理器。[3]
WinDbg中,卸载PEB内容的命令是!peb,命令参数是PEB在进程地址空间的地址,它实际上是通过!process命令获取,将显示来自于EPROCESS
数据结构的信息,其中一个域是PEB地址。[3]
域 | 含义 | 注释 |
---|---|---|
BeingDebugged |
进程是否被调试 | Microsoft建议不要使用这个域,而是用Win32 CheckRemoteDebuggerPresent() 库函数代替[2]
|
Ldr | 到PEB_LDR_DATA 结构的指针,提供被加载模块的信息。 |
包含kernel32 与ntdll的基地址 |
ProcessParameters | 到RTL_USER_PROCESS_PARAMETERS 结构的指针,提供进程起始参数信息。 |
这个RTL_USER_PROCESS_PARAMETERS 结构几乎不透明,不保证在不同Windows版本一致[4]
|
PostProcessInitRoutine | 为一个回调函数指针,在DLL被初始化后但DLLMain执行之前被调用 executable code is invoked | 该回调函数被用于Windows 2000, 不保证以后Windows版本一致[2] |
SessionId | 进程所在的Terminal Services任务的ID | 系统调用NtCreateUserProcess() 通过调用内核内部的MmGetSession Id() 函数来初始化它.[3]
|
PEB的内容通过系统调用NtCreateUserProcess()
初始化。该系统调用也是Native API的Win32函数 CreateProcess()
, CreateProcessAsUser()
, CreateProcessWithTokenW()
, CreateProcessWithLogonW()
(在kernel32.dll 与advapi32.dll中)的实现基础,也是Windows NT POSIX的posix.dll中的API函数Fork()
的实现基础.[3]
对于Windows NT POSIX进程,新进程的PEB内容通过简单直接复制父进程的PEB来初始化。NtCreateUserProcess()
这是在fork()
函数内部实现。对于Win32进程,新进程的PEB的初始化主要来自内核维护的全局变量。但几个域的初始化来自程序映象,特别是来自PE文件格式(PE+ 或 PE32+在64位)的IMAGE_OPTIONAL_HEADER32
数据结构。[3]
域 | 初始化自... | 是否被PE信息覆盖? |
---|---|---|
NumberOfProcessors |
KeNumberOfProcessors |
否 |
NtGlobalFlag |
NtGlobalFlag |
否 |
CriticalSectionTimeout |
MmCriticalSectionTimeout |
否 |
HeapSegmentReserve |
MmHeapSegmentReserve |
否 |
HeapSegmentCommit |
MmHeapSegmentCommit |
否 |
HeapDeCommitTotalFreeThreshold |
MmHeapDeCommitTotalFreeThreshold |
否 |
HeapDeCommitFreeBlockThreshold |
MmHeapDeCommitFreeBlockThreshold |
否 |
MinimumStackCommit |
MmMinimumStackCommitInBytes |
否 |
ImageProcessAffinityMask |
KeActiveProcessors |
ImageLoadConfigDirectory.ProcessAffinityMask
|
OSMajorVersion |
NtMajorVersion |
OptionalHeader.Win32VersionValue & 0xFF
|
OSMinorVersion |
NtMinorVersion |
(OptionalHeader.Win32VersionValue >> 8) & 0xFF
|
OSBuildNumber |
NtBuildNumber & 0x3FFF combined with CmNtCSDVersion |
(OptionalHeader.Win32VersionValue >> 16) & 0x3FFF combined with ImageLoadConfigDirectory.CmNtCSDVersion
|
OSPlatformId |
VER_PLATFORM_WIN32_NT |
(OptionalHeader.Win32VersionValue >> 30) ^ 0x2
|
参考文献
编辑- ^ 1.0 1.1 Rajeev Nagar. Windows NT file system internals: a developer's guide. O'Reilly Series. O'Reilly. 1997: 129. ISBN 9781565922495.
- ^ 2.0 2.1 2.2 2.3 Process and Thread structures: PEB Structure. MSDN Library. Microsoft. 2010-07-15 [2010-07-15]. (原始内容存档于2012-10-22).
- ^ 3.0 3.1 3.2 3.3 3.4 3.5 Mark E. Russinovich, David A. Solomon, and Alex Ionescu. Windows internals. Microsoft Press Series 5th. Microsoft Press. 2009: 335–336,341–342,348,357–358. ISBN 9780735625303.
- ^ Process and Thread structures: RTL_USER_PROCESS_PARAMETERS Structure. MSDN Library. Microsoft. 2010-07-15 [2010-07-15]. (原始内容存档于2012-10-22).