プロセス環境ブロック

プロセス環境ブロック(略称PEB )は、 Windows NTオペレーティングシステムファミリのデータ構造です。これはオペレーティングシステムが内部的に使用する不透明なデータ構造であり、そのフィールドのほとんどはオペレーティングシステム以外での使用を想定していません。[ 1 ] Microsoftは、MSDNライブラリのドキュメント(一部のフィールドのみを記載)の中で、この構造は「Windowsの将来のバージョンで変更される可能性がある」と述べています。[ 2 ] PEBには、グローバルコンテキスト、スタートアップパラメータ、プログラムイメージローダーの データ構造、プログラムイメージベースアドレス、プロセス全体のデータ構造の相互排他性を提供するために使用される同期オブジェクトなど、プロセス全体に適用されるデータ構造が含まれています。[ 1 ]

PEBはカーネルモードEPROCESSデータ構造、およびクライアントサーバーランタイムサブシステムプロセスのアドレス空間内で管理されるプロセス毎のデータ構造と密接に関連しています。しかし、CSRSSデータ構造と同様に、PEB自体はカーネルモードデータ構造ではありません。PEBは、関連するプロセスのアプリケーションモードアドレス空間に存在します。これは、PEBがNTDLLなどのオペレーティングシステムライブラリ内のアプリケーションモードコード(カーネルモード外で実行されるもの、例えばプログラムイメージローダーやヒープマネージャのコードなど)によって使用されるように設計されているためです。 [ 3 ]

WinDbgでは、PEBの内容をダンプするコマンドは!pebコマンドであり、このコマンドにはプロセスのアプリケーションアドレス空間におけるPEBのアドレスが渡されます。その情報は!processコマンドによって取得され、データ構造から情報が表示されますEPROCESS。データ構造のフィールドの1つはPEBのアドレスです。[ 3 ]

Microsoftによって文書化されているPEBのフィールド[ 2 ]
分野意味メモ
BeingDebuggedプロセスがデバッグ中かどうかマイクロソフトはこのフィールドではなく、公式のWin32ライブラリ関数を使用することを推奨しています。[ 2 ]CheckRemoteDebuggerPresent()
リーダーPEB_LDR_DATAロードされたモジュールに関する情報を提供する構造体へのポインタkernel32ntdllのベース アドレスが含まれます。
プロセスパラメータRTL_USER_PROCESS_PARAMETERSプロセス起動パラメータに関する情報を提供する構造体へのポインタまた、構造RTL_USER_PROCESS_PARAMETERSはほとんど不透明であり、Windowsの複数のバージョン間で一貫性が保証されていません。[ 4 ]
後処理初期化ルーチンDLLの初期化後、メインの実行コードが呼び出される前に呼び出されるコールバック関数へのポインタこのコールバック関数はWindows 2000で使用されますが、それ以降のバージョンのWindows NTで使用されることは保証されていません。[ 2 ]
セッションIDプロセスが属するターミナル サービス セッションのセッション IDシステムコールはカーネルの内部関数を呼び出してこれを初期化する。[ 3 ]NtCreateUserProcess()MmGetSessionId()

PEBの内容は、システムコールによって初期化されます。このシステムコールは、 Win32 、、、ライブラリ関数の一部を実装し、それらを支えるネイティブAPI関数です。これらの関数はkernel32.dllとadvapi32.dllライブラリにあります。また、Windows NT POSIXライブラリposix.dllの関数も支えています。[ 3 ]NtCreateUserProcess()CreateProcess()CreateProcessAsUser()CreateProcessWithTokenW()CreateProcessWithLogonW()fork()

Windows NT POSIXプロセスの場合、新しいプロセスのPEBの内容は、関数の動作に従って、親プロセスのPEBの直接コピーによって初期化されます。Win32プロセスの場合、新しいプロセスのPEBの初期内容は主にカーネル内で管理されているグローバル変数から取得されます。ただし、いくつかのフィールドはプロセスのイメージファイル内、特にPEファイル形式(64ビット実行イメージではPE+またはPE32+)のデータ構造から取得される場合があります。[ 3 ]NtCreateUserProcess()fork()IMAGE_OPTIONAL_HEADER32

カーネルグローバル変数から初期化されるPEBのフィールド[ 3 ]
分野初期化されるのはPE 情報によって上書き可能?
NumberOfProcessorsKeNumberOfProcessorsいいえ
NtGlobalFlagNtGlobalFlagいいえ
CriticalSectionTimeoutMmCriticalSectionTimeoutいいえ
HeapSegmentReserveMmHeapSegmentReserveいいえ
HeapSegmentCommitMmHeapSegmentCommitいいえ
HeapDeCommitTotalFreeThresholdMmHeapDeCommitTotalFreeThresholdいいえ
HeapDeCommitFreeBlockThresholdMmHeapDeCommitFreeBlockThresholdいいえ
MinimumStackCommitMmMinimumStackCommitInBytesいいえ
ImageProcessAffinityMaskKeActiveProcessorsImageLoadConfigDirectory.ProcessAffinityMask
OSMajorVersionNtMajorVersionOptionalHeader.Win32VersionValue&0xFF
OSMinorVersionNtMinorVersion(OptionalHeader.Win32VersionValue>>8)&0xFF
OSBuildNumberNtBuildNumber&0x3FFFと組み合わせるCmNtCSDVersion(OptionalHeader.Win32VersionValue>>16)&0x3FFF と組み合わせるImageLoadConfigDirectory.CmNtCSDVersion
OSPlatformIdVER_PLATFORM_WIN32_NT(OptionalHeader.Win32VersionValue>>30)^0x2

WineHQプロジェクトは winternl.hのバージョンでより完全なPEB定義を提供しています。[ 5 ] Windowsのそれ以降のバージョンでは、いくつかのフィールドの数と目的が調整されています。[ 6 ]

参考文献

  1. ^ a b Rajeev Nagar ( 1997). Windows NT ファイルシステム内部: 開発者ガイド. O'Reillyシリーズ. O'Reilly. pp.  129. ISBN 9781565922495
  2. ^ a b c d 「プロセスとスレッドの構造:PEB構造」MSDNライブラリMicrosoft 2010年7月15日。2012年10月22日時点のオリジナルよりアーカイブ。 2010年7月15日閲覧
  3. ^ a b c d e fマーク E. ルシノビッチ、デビッド A. ソロモン、アレックス イオネスク (2009)。Windows の内部構造。 Microsoft Press シリーズ (第 5 版)。マイクロソフトプレス。 pp  . 335–336、341–342、348、357–358。ISBN 9780735625303{{cite book}}: CS1 maint: 複数の名前: 著者リスト (リンク)
  4. ^ 「プロセスとスレッドの構造: RTL_USER_PROCESS_PARAMETERS構造」 . MSDNライブラリ. Microsoft . 2010年7月15日. 2010年7月15日閲覧
  5. ^ "wine winternl.h: typedef struct _PEB" . GitHub . wine-mirror. 2019年10月29日.
  6. ^ Chappel, Geoff. 「PEB」 . 2019年10月30日閲覧