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