В вычислении в процесс окружающей среды блок (сокращенно PEB ) представляет собой структуру данных в Windows NT операционной системы семейства. Это непрозрачная структура данных, которая используется операционной системой внутри, большинство полей которой не предназначены для использования чем-либо, кроме операционной системы. [1] Microsoft отмечает в своей документации библиотеки MSDN, которая документирует только несколько полей, что структура «может быть изменена в будущих версиях Windows». [2] PEB содержит структуры данных, которые применяются ко всему процессу., включая глобальный контекст, параметры запуска, структуры данных для загрузчика программного образа, базовый адрес программного образа и объекты синхронизации, используемые для обеспечения взаимного исключения для структур данных всего процесса. [1]
PEB тесно связан со структурой данных режима ядра EPROCESS
, а также со структурами данных каждого процесса, управляемыми в адресном пространстве процесса подсистемы времени выполнения клиент-сервер . Однако (как и структуры данных CSRSS) PEB сам по себе не является структурой данных режима ядра. Он находится в адресном пространстве режима приложения процесса, к которому он относится. Это связано с тем, что он предназначен для использования кодом режима приложения в библиотеках операционной системы, таких как NTDLL , который выполняется вне режима ядра, например, код для загрузчика образа программы и диспетчера кучи. [3]
В WinDbg команда, которая выгружает содержимое PEB, - это команда ! Peb , которой передается адрес PEB в адресном пространстве приложения процесса. Эта информация, в свою очередь, получается командой ! Process , которая отображает информацию из EPROCESS
структуры данных, одно из полей которой является адресом PEB. [3]
Поле | имея в виду | заметки |
---|---|---|
BeingDebugged | Отлаживается ли процесс | Microsoft рекомендует не использовать это поле, а использовать вместо него функцию официальной библиотеки Win32 . [2]CheckRemoteDebuggerPresent() |
Ldr | Указатель на PEB_LDR_DATA структуру, предоставляющую информацию о загруженных модулях | Содержит базовый адрес kernel32 и ntdll . |
Параметры процесса | Указатель на RTL_USER_PROCESS_PARAMETERS структуру, предоставляющую информацию о параметрах запуска процесса. | RTL_USER_PROCESS_PARAMETERS Структура также в основном непрозрачная и не гарантируется быть последовательными в нескольких версиях Windows. [4] |
PostProcessInitRoutine | Указатель на функцию обратного вызова, вызываемую после инициализации DLL, но до вызова основного исполняемого кода | Эта функция обратного вызова используется в Windows 2000 , но ее использование в более поздних версиях Windows NT не гарантируется. [2] |
Идентификатор сессии | Идентификатор сеанса сеанса служб терминалов, частью которого является процесс. | Системный вызов инициализирует путем вызова внутреннего ядра в функцию. [3]NtCreateUserProcess() MmGetSessionId() |
Содержимое ПЭБ инициализируются системного вызова Native API функции , которая реализует часть, и подкрепляет, в Win32 , , и библиотечные функции , которые находятся в в kernel32.dll и ADVAPI32.dll библиотек , а также лежащих в основе функции в библиотеке POSIX Windows NT - posix.dll. [3]NtCreateUserProcess()
CreateProcess()
CreateProcessAsUser()
CreateProcessWithTokenW()
CreateProcessWithLogonW()
fork()
Для процессов POSIX Windows NT содержимое нового процесса PEB инициализируется как прямая копия PEB родительского процесса в соответствии с тем, как работает функция. Для процессов Win32 исходное содержимое PEB нового процесса в основном берется из глобальных переменных, поддерживаемых в ядре. Однако вместо этого несколько полей могут быть взяты из информации, предоставленной в файле образа процесса, в частности информации, предоставленной в структуре данных в формате PE- файла (PE + или PE32 + в 64-битных исполняемых образах). [3]NtCreateUserProcess()
fork()
IMAGE_OPTIONAL_HEADER32
Поле | инициализируется из | можно переопределить с помощью информации 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 предоставляет более полное определение PEB в своей версии winternl.h. [5] В более поздних версиях Windows изменилось количество и назначение некоторых полей. [6]
Рекомендации
- ^ a b Раджив Нагар (1997). Внутреннее устройство файловой системы Windows NT: руководство разработчика . Серия О'Рейли. О'Рейли. С. 129 . ISBN 9781565922495.
- ^ а б в г «Структуры процессов и потоков: структура PEB» . Библиотека MSDN . Microsoft . 2010-07-15. Архивировано из оригинала на 2012-10-22 . Проверено 15 июля 2010 .
- ^ а б в г д е Марк Э. Руссинович , Дэвид А. Соломон и Алекс Ионеску (2009). Внутреннее устройство окон . Серия 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 . Проверено 15 июля 2010 .
- ^ "вино winternl.h: typedef struct _PEB" . GitHub . вино-зеркало. 29 октября 2019.
- ^ Чаппел, Джефф. «ПЭБ» . Проверено 30 октября 2019 года .
Внешние ссылки
- Определения PEB для различных версий Windows