进程环境块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]

Microsoft文档公布的PEB的域[2]
含义 注释
BeingDebugged 进程是否被调试 Microsoft建议不要使用这个域,而是用Win32 CheckRemoteDebuggerPresent()库函数代替[2]
Ldr PEB_LDR_DATA结构的指针,提供被加载模块的信息。 包含kernel32ntdll的基地址
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]

内核全局变量初始化的PEB的域[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. ^ 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. ^ 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. ^ 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. 
  4. ^ Process and Thread structures: RTL_USER_PROCESS_PARAMETERS Structure. MSDN Library. Microsoft. 2010-07-15 [2010-07-15]. (原始内容存档于2012-10-22).