Блок среды процесса - Process Environment Block
В вычисление то Блок среды процесса (сокращенно PEB) - это структура данных в Windows NT семейство операционных систем. Это непрозрачная структура данных который используется операционной системой внутри, большинство полей которой не предназначены для использования чем-либо, кроме операционной системы.[1] Microsoft отмечает в своем Библиотека MSDN документация - в которой документированы только некоторые поля - что структура «может быть изменена в будущих версиях Windows».[2] PEB содержит структуры данных, которые применяются ко всему обработать, включая глобальный контекст, параметры запуска, структуры данных для загрузчика образа программы, базовый адрес образа программы и объекты синхронизации, используемые для предоставления взаимное исключение для структур данных всего процесса.[1]
PEB тесно связан с режим ядра ЭПРОЦЕСС
структура данных, а также со структурами данных для каждого процесса, управляемыми в адресном пространстве Подсистема времени выполнения клиент-сервер обработать. Однако (как и структуры данных CSRSS) PEB сам по себе не является структурой данных режима ядра. Он находится в адресном пространстве режима приложения процесса, к которому он относится. Это связано с тем, что он предназначен для использования кодом режима приложения в библиотеках операционной системы, таких как NTDLL, который выполняется вне режима ядра, например код для загрузчика образа программы и диспетчера кучи.[3]
В WinDbg, команда, которая выгружает содержимое PEB, является ! галька команда, которой передается адрес PEB в адресном пространстве приложения процесса. Эту информацию, в свою очередь, получает !обработать команда, которая отображает информацию из ЭПРОЦЕСС
структура данных, одно из полей которой является адресом PEB.[3]
Поле | смысл | заметки |
---|---|---|
Отложенный | Отлаживается ли процесс | Microsoft рекомендует не использовать это поле, а использовать официальную версию Win32. CheckRemoteDebuggerPresent() вместо этого библиотечная функция.[2] |
Ldr | Указатель на PEB_LDR_DATA структура, предоставляющая информацию о загруженных модулях | Содержит базовый адрес ядро32 и ntdll. |
Параметры процесса | Указатель на RTL_USER_PROCESS_PARAMETERS структура, предоставляющая информацию о параметрах запуска процесса | В RTL_USER_PROCESS_PARAMETERS структура также в основном непрозрачна и не гарантирует единообразия в нескольких версиях Windows.[4] |
PostProcessInitRoutine | Указатель на функцию обратного вызова, вызываемую после инициализации DLL, но до вызова основного исполняемого кода | Эта функция обратного вызова используется на Windows 2000, но его использование в более поздних версиях Windows NT не гарантируется.[2] |
Идентификатор сессии | Идентификатор сеанса сеанса служб терминалов, частью которого является процесс. | В NtCreateUserProcess() системный вызов инициализирует это, вызывая внутреннюю MmGetSessionId() функция.[3] |
Содержимое PEB инициализируется NtCreateUserProcess()
системный вызов, Собственный API функция, которая реализует часть и поддерживает Win32 CreateProcess()
, CreateProcessAsUser()
, CreateProcessWithTokenW()
, и CreateProcessWithLogonW()
библиотечные функции, находящиеся в библиотеки kernel32.dll и advapi32.dll а также подкрепление вилка ()
функция в Windows NT POSIX библиотека posix.dll.[3]
Для процессов POSIX Windows NT содержимое PEB нового процесса инициализируется NtCreateUserProcess()
как просто прямую копию PEB родительского процесса, в соответствии с тем, как вилка()
функция работает. Для процессов Win32 исходное содержимое PEB нового процесса в основном берется из глобальных переменных, поддерживаемых в ядре. Однако вместо этого несколько полей могут быть взяты из информации, представленной в файле образа процесса, в частности информации, представленной в IMAGE_OPTIONAL_HEADER32
структура данных в PE формат файла (PE + или PE32 + в 64-битных исполняемых образах).[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 в сочетании с CmNtCSDVersion | (OptionalHeader.Win32VersionValue >> 16) & 0x3FFF в сочетании с ImageLoadConfigDirectory.CmNtCSDVersion |
OSPlatformId | VER_PLATFORM_WIN32_NT | (OptionalHeader.Win32VersionValue >> 30) ^ 0x2 |
В WineHQ В своей версии winternl.h проект предоставляет более полное определение PEB.[5] Более поздние версии Windows изменили количество и назначение некоторых полей.[6]
использованная литература
- ^ а б Раджив Нагар (1997). Внутреннее устройство файловой системы Windows NT: руководство разработчика. Серия О'Рейли. О'Рейли. стр.129. ISBN 9781565922495.
- ^ а б c d «Структуры процессов и потоков: структура PEB». Библиотека MSDN. Microsoft. 2010-07-15. Архивировано из оригинал на 2012-10-22. Получено 2010-07-15.
- ^ а б c d е ж Марк Э. Руссинович, Дэвид А. Соломон и Алекс Ионеску (2009). Внутреннее устройство Windows. Серия Microsoft Press (5-е изд.). Microsoft Press. С. 335–336, 341–342, 348, 357–358. ISBN 9780735625303.CS1 maint: несколько имен: список авторов (ссылка на сайт)
- ^ «Структуры процессов и потоков: структура RTL_USER_PROCESS_PARAMETERS». Библиотека MSDN. Microsoft. 2010-07-15. Получено 2010-07-15.
- ^ "вино winternl.h: typedef struct _PEB". GitHub. вино-зеркало. 29 октября 2019.
- ^ Чаппел, Джефф. «ПЭБ». Получено 30 октября 2019.