Notatnik techniczny

Dwie struktury PEB w procesie

Struktura PEB zawiera podstawowe informacje o procesie działającym w systemie Windows, m.in.:

  • Informację, czy do procesu jest podczepiony debugger,
  • Informację o inni poleceń, jaka została użyta do stworzenia procesu,
  • Informację o modułach załadowanych do pamięci procesu.

Oficjalny opis znaczenia poszczególnych pól jest na MSDN, a bardziej rozbudowany ale nieoficjalny na ntinternals.net lub geoffchappell.com.

Uzyskiwanie adresu PEB

Aby pobrać adres stryktury PEB, możemy wykorzystać funkcję NtQueryInformationProcess.

NTSTATUS WINAPI NtQueryInformationProcess(
  _In_      HANDLE           ProcessHandle,
  _In_      PROCESSINFOCLASS ProcessInformationClass,
  _Out_     PVOID            ProcessInformation,
  _In_      ULONG            ProcessInformationLength,
  _Out_opt_ PULONG           ReturnLength
);

Jeśli ProcessInformationClass ustawimy na zero oraz w ProcessInformation przekażemy wskaźnik na strukturę PROCESS_BASIC_INFORMATION, to w polu PebBaseAddress poznamy adres struktury PEB w przestrzeni wirtualnej procesu właściciela.

Ile struktur PEB ma proces?

Odpalamy naszą 32-bitową aplikację na 64-bitowym systemie, następnie kompilujemy kolejną aplikację, która będzie pytała o adres PEB w pierwszym procesie. Okazuje się, że uzyskany wynik zależy od tego, jak kompilowaliśmy proces analizujący.

Jeśli wywołaliśmy funkcję z procesu 32-bitowego, to uzyskamy inny adres niż wtedy, gdy nasz proces analizujący jest 64-bitowy.

Czyli co – aplikacje WOW64 mają dwie struktury PEB? Tak, i obie zawierają ciekawe informacje, a są względem siebie przesunięte dokładnie o 0x1000 bajtów. Warto dodać, że to są obie pełnoprawne struktury: jedna to 32-bitowa struktura, taka jak w procesie 32-bitowym, wyrównana do 4 bajtów, kolejna to struktura WOW64, wyrównana do 8 bajtów.

Adresy struktur PEB w procesie WOW64

PEB adres

Zawartość obu struktur PEB

PEB 1

PEB 2

Czy to dotyczy tylko PEB?

Inne ważne struktury systemowe są również zduplikowane. Mamy po dwie struktury TEB dla każdego wątku oraz osobne stosy i sterty dla kodu 32-bitowego i 64-bitowego.

PEB