進程環境塊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).