Struktura PEB (opens new window) zawiera podstawowe informacje o procesie działającym w systemie Windows, m.in.:
- Informację, czy do procesu jest podczepiony debugger.
- Informację o linii 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 dostępny na MSDN (opens new window), natomiast bardziej rozbudowaną wersję można znaleźć na ntinternals.net (opens new window) lub geoffchappell.com (opens new window).
Uzyskiwanie adresu PEB
Aby pobrać adres struktury PEB, możemy wykorzystać funkcję NtQueryInformationProcess (opens new window).
NTSTATUS WINAPI NtQueryInformationProcess(
_In_ HANDLE ProcessHandle,
_In_ PROCESSINFOCLASS ProcessInformationClass,
_Out_ PVOID ProcessInformation,
_In_ ULONG ProcessInformationLength,
_Out_opt_ PULONG ReturnLength
);
Ustawienie ProcessInformationClass
na zero oraz przekazanie wskaźnika na strukturę PROCESS_BASIC_INFORMATION
w ProcessInformation
spowoduje zapisanie w polu PebBaseAddress
adresu struktury PEB w przestrzeni wirtualnej procesu właściciela.
Ile struktur PEB ma proces?
Należy uruchomić naszą 32-bitową aplikację na 64-bitowym systemie, a następnie skompilować kolejną aplikację, która będzie pytała o adres PEB w pierwszym procesie. Wynik, który uzyskamy, jak się okazuje, jest zależny od tego, w jaki sposób kompilowany był proces analizujący.
Wywołanie funkcji z procesu 32-bitowego spowoduje uzyskanie innego adresu niż wówczas, gdy proces analizujący jest 64-bitowy.
Czy zatem aplikacje WOW64 mają dwie struktury PEB?
Odpowiedź brzmi: tak. Obie także zawierają ciekawe informacje, a są względem siebie przesunięte dokładnie 0x1000 bajtów. Warto zaznaczyć, że obie są pełnoprawnymi strukturami – jedna z nich to 32-bitowa struktura, taka jak w procesie 32-bitowym, zaś druga to WOW64, wyrównana do 8 bajtów.
Adresy struktur PEB w procesie WOW64
Zawartość obu struktur PEB
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.