Blok środowiska procesowego

W obliczeniach Process Environment Block (w skrócie PEB ) jest strukturą danych w rodzinie systemów operacyjnych Windows NT . Jest to nieprzezroczysta struktura danych używana wewnętrznie przez system operacyjny, której większość pól nie jest przeznaczona do użytku przez nic innego niż system operacyjny. Microsoft zauważa w swojej biblioteki MSDN — która dokumentuje tylko kilka pól — że struktura „może zostać zmieniona w przyszłych wersjach systemu Windows”. PEB zawiera struktury danych, które mają zastosowanie w całej całości proces , w tym kontekst globalny, parametry uruchamiania, struktury danych dla programu ładującego obraz programu, adres bazowy obrazu programu oraz obiekty synchronizacji używane do zapewnienia wzajemnego wykluczania struktur danych obejmujących cały proces.

PEB jest ściśle powiązany ze strukturą danych EPROCESS w trybie jądra , jak również ze strukturami danych dla poszczególnych procesów zarządzanymi w przestrzeni adresowej procesu podsystemu środowiska wykonawczego klient-serwer . Jednak (podobnie jak struktury danych CSRSS) PEB nie jest samą strukturą danych trybu jądra. Znajduje się w przestrzeni adresowej trybu aplikacji procesu, do którego się odnosi. Dzieje się tak dlatego, że jest przeznaczony do użycia przez kod trybu aplikacji w bibliotekach systemu operacyjnego, takich jak NTDLL , który jest wykonywany poza trybem jądra, na przykład kod programu ładującego obraz programu i menedżera sterty.

W WinDbg poleceniem, które zrzuca zawartość PEB, jest polecenie !peb , które przekazuje adres PEB w przestrzeni adresowej aplikacji procesu. Informacje te z kolei uzyskuje się poleceniem !process , które wyświetla informacje ze struktury danych EPROCESS , której jednym z pól jest adres PEB.

Pola PEB udokumentowane przez firmę Microsoft
Pole oznaczający notatki
Bycie debugowanym Czy proces jest debugowany Firma Microsoft zaleca, aby zamiast tego używać oficjalnej funkcji bibliotecznej Win32 CheckRemoteDebuggerPresent () .
Ldr Wskaźnik do struktury PEB_LDR_DATA dostarczający informacji o załadowanych modułach Zawiera adres podstawowy kernel32 i ntdll .
Parametry procesu Wskaźnik do struktury RTL_USER_PROCESS_PARAMETERS dostarczającej informacji o parametrach uruchamiania procesu Struktura RTL_USER_PROCESS_PARAMETERS jest również w większości nieprzejrzysta i nie ma gwarancji, że będzie spójna w wielu wersjach systemu Windows.
PostProcessInitRoutine Wskaźnik do funkcji wywołania zwrotnego wywoływanej po zainicjowaniu biblioteki DLL, ale przed wywołaniem głównego kodu wykonywalnego Ta funkcja wywołania zwrotnego jest używana w systemie Windows 2000 , ale nie ma gwarancji, że będzie używana w nowszych wersjach systemu Windows NT.
Identyfikator sesji Identyfikator sesji usługi terminalowej, której częścią jest proces NtCreateUserProcess () inicjuje to poprzez wywołanie wewnętrznej funkcji jądra MmGetSessionId () .

Zawartość PEB jest inicjowana przez wywołanie systemowe NtCreateUserProcess () , natywną funkcję API , która implementuje część funkcji bibliotecznych Win32 CreateProcess () , CreateProcessAsUser () , CreateProcessWithTokenW () i CreateProcessWithLogonW () , które są w biblioteki kernel32.dll i advapi32.dll , a także stanowiące podstawę funkcji fork() w systemie Windows NT POSIX biblioteka, posix.dll.

W przypadku procesów Windows NT POSIX zawartość PEB nowego procesu jest inicjowana przez NtCreateUserProcess () jako bezpośrednia kopia PEB procesu nadrzędnego, zgodnie z działaniem funkcji fork () . W przypadku procesów Win32 początkowa zawartość PEB nowego procesu pochodzi głównie ze zmiennych globalnych utrzymywanych w jądrze. Jednak zamiast tego można pobrać kilka pól z informacji dostarczonych w pliku obrazu procesu, w szczególności informacji dostarczonych w IMAGE_OPTIONAL_HEADER32 w PE format pliku (PE+ lub PE32+ w 64-bitowych obrazach wykonywalnych).

Pola z PEB, które są inicjowane ze zmiennych globalnych jądra
Pole jest inicjowany od nadrzędny przez informacje PE?
Liczba procesorów KeLiczba procesorów NIE
NtGlobalFlaga NtGlobalFlaga NIE
Limit czasu sekcji krytycznej MmCriticalSectionTimeout NIE
HeapSegmentReserve MmHeapSegmentReserve NIE
Zatwierdzenie segmentu sterty Zatwierdzenie segmentu sterty NIE
HeapDeCommitTotalFreeThreshold MmHeapDeCommitTotalFreeThreshold NIE
HeapDeCommitFreeBlockThreshold MmHeapDeCommitFreeBlockThreshold NIE
Minimalne zatwierdzenie stosu MmMinimumStackCommitInBytes NIE
ImageProcessAffinityMask Procesory KeActive ImageLoadConfigDirectory . ProcessAffinityMask
OSMajorVersion NtMajorVersion Opcjonalny nagłówek . Win32VersionValue & 0xFF
OSMinorVersion Wersja NtMinor ( Opcjonalny nagłówek . Win32VersionValue >> 8 ) & 0xFF
Numer kompilacji systemu operacyjnego NtBuildNumber i 0x3FFF w połączeniu z CmNtCSDVersion ( OptionalHeader . Win32VersionValue >> 16 ) & 0x3FFF w połączeniu z ImageLoadConfigDirectory . Wersja CmNtCSD
OSPlatformId VER_PLATFORM_WIN32_NT ( Opcjonalny nagłówek . Win32VersionValue >> 30 ) ^ 0x2

Projekt WineHQ zapewnia pełniejszą definicję PEB w swojej wersji winternl.h. W późniejszych wersjach systemu Windows dostosowano liczbę i przeznaczenie niektórych pól.

  1. ^ ab Rajeev Nagar   (1997). Wewnętrzne elementy systemu plików Windows NT: przewodnik dla programistów . Seria O'Reilly. O'Reilly. s. 129 . ISBN 9781565922495 .
  2. ^ a b c d „Struktury procesów i wątków: struktura PEB” . Biblioteka MSDN . Microsoftu . 2010-07-15. Zarchiwizowane od oryginału w dniu 2012-10-22 . Źródło 2010-07-15 .
  3. ^ a b c d e f   Mark E. Russinovich , David A. Solomon i Alex Ionescu (2009). Wewnętrzne elementy systemu Windows . Seria Microsoft Press (wyd. 5). Microsoft Press. s. 335–336, 341–342, 348, 357–358. ISBN 9780735625303 . {{ cite book }} : CS1 maint: wiele nazwisk: lista autorów ( link )
  4. ^ „Struktury procesów i wątków: struktura RTL_USER_PROCESS_PARAMETERS” . Biblioteka MSDN . Microsoftu . 2010-07-15 . Źródło 2010-07-15 .
  5. ^ "wino winternl.h: typedef struct _PEB" . GitHub . lustro do wina. 29 października 2019 r.
  6. Bibliografia _ „PEB” . Źródło 30 października 2019 r .

Linki zewnętrzne