Freigeben über


Zuordnungssymbole beim Ausblättern des PEB

Zum Laden von Symbolen prüft der Debugger die Liste der vom Betriebssystem geladenen Module. Der Zeiger auf die Modulliste im Benutzermodus ist eines der Elemente, die im Prozessumgebungsblock (PEB) gespeichert sind.

Um Arbeitsspeicher freizugeben, kann der Speicher-Manager Benutzermodusdaten ausblättern, um Platz für andere Prozess- oder Kernelmoduskomponenten zu schaffen. Die ausgelagerten Benutzermodusdaten können die PEB-Datenstruktur enthalten. Ohne diese Datenstruktur kann der Debugger nicht ermitteln, für welche Bilder Symbole geladen werden sollen.

Hinweis Dies betrifft nur Symboldateien für die Benutzermodusmodule. Kernelmodusmodule und Symbole sind nicht betroffen, da sie in einer anderen Liste nachverfolgt werden.

Angenommen, ein Benutzermodusmodul ist dem aktuellen Prozess zugeordnet, und Sie möchten die Symbole dafür korrigieren. Suchen Sie eine beliebige Adresse im Bereich der virtuellen Adressen des Moduls. Angenommen, ein Modul ist einem virtuellen Adressbereich zugeordnet, der die Adresse 7f78e9e00F enthält. Geben Sie den folgenden Befehl ein.

3: kd> !vad 7f78e9e000F 1

Die Befehlsausgabe zeigt Informationen zum virtuellen Adressdeskriptor (VAD) für das Modul an. Die Befehlsausgabe enthält auch eine Reload-Befehlszeichenfolge, mit der Sie die Symbole für das Modul laden können. Die Reload-Befehlszeichenfolge enthält die Startadresse (000007f7'8e9e000) und die Größe (32000) des Editor-Moduls.

VAD @ fffffa80056fb960
...
Reload command: .reload notepad.exe=000007f7`8e9e0000,32000

Um die Symbole zu laden, geben Sie den Befehl ein, der in der Reload-Befehlszeichenfolge angegeben wurde.

.reload notepad.exe=000007f7`8e9e0000,32000

Hier sehen Sie ein weiteres Beispiel, das eine etwas andere Technik verwendet. Im Beispiel wird veranschaulicht, wie Die !vad-Erweiterung zum Zuordnen von Symbolen verwendet wird, wenn der PEB ausgelagert wird. Die Grundidee besteht darin, die Startadresse und größe der relevanten DLL zu finden, damit Sie dann den Befehl .reload verwenden können, um die erforderlichen Symbole zu laden. Angenommen, die Adresse des aktuellen Prozesses lautet 0xE0000126'01BA0AF0, und Sie möchten die Symbole dafür korrigieren. Verwenden Sie zunächst den Befehl !process , um die VAD-Stammadresse (Virtual Address Descriptor) abzurufen:

kd> !process e000012601ba0af0 1
PROCESS e000012601ba0af0
    SessionId: 2  Cid: 0b50    Peb: 6fbfffde000  ParentCid: 0efc
    DirBase: 079e8461  ObjectTable: e000000600fbceb0  HandleCount: 360.
    Image: explorer.exe
    VadRoot e000012601a35e70 Vads 201 Clone 0 Private 917. Modified 2198. Locked 0.
...

Verwenden Sie dann die Erweiterung !vad , um die dem Prozess zugeordnete VAD-Struktur auflisten. Diese VADs mit der Bezeichnung "EXECUTE_WRITECOPY" gehören zu Codemodulen.

kd> !vad e000012601a35e70
VAD     level      start      end    commit
...
e0000126019f9790 ( 6)      3fff0    3fff7        -1 Private      READONLY
e000012601be1080 ( 7)   37d9bd30 37d9bd3e         2 Mapped  Exe  EXECUTE_WRITECOPY  <-- these are DLLs
e000012600acd970 ( 5)   37d9bec0 37d9bece         2 Mapped  Exe  EXECUTE_WRITECOPY
e000012601a5cba0 ( 7)   37d9c910 37d9c924         2 Mapped  Exe  EXECUTE_WRITECOPY
...

Verwenden Sie dann erneut die Erweiterung !vad , um die Startadresse und größe des ausgelagerten Arbeitsspeichers zu ermitteln, der die interessante DLL enthält. Dadurch wird bestätigt, dass Sie die richtige DLL gefunden haben:

kd> !vad e000012601be1080 1

VAD @ e000012601be1080
  Start VPN:      37d9bd30  End VPN: 37d9bd3e  Control Area:  e00001260197b8d0
  First ProtoPte: e0000006013e00a0  Last PTE fffffffffffffffc  Commit Charge         2 (2.)
  Secured.Flink          0  Blink           0  Banked/Extend:        0
  File Offset   0
   ImageMap ViewShare EXECUTE_WRITECOPY

...
        File: \Windows\System32\ExplorerFrame.dll

Das Feld "VPN starten" – in diesem Fall 0x37D9BD30 – gibt die Startnummer der virtuellen Seite an. Dies muss in eine tatsächliche Adresse konvertiert werden, indem sie mit der Seitengröße multipliziert wird. Sie können verwenden ? (Evaluate-Ausdruck) befehl, um diesen Wert mit 0x2000 zu multiplizieren. Dies ist die Seitengröße für den Itanium-basierten Computer, aus dem das Beispiel stammt.

kd> ? 37d9bd3e*2000 
Evaluate expression: 7676040298496 = 000006fb`37a7c000

Anschließend kann die Größe des Bereichs in Bytes konvertiert werden:

kd> ? 37d9bd3e-37d9bd30+1 <--   computes the number of pages
Evaluate expression: 15 = 00000000`0000000f
kd> ? f*2000
Evaluate expression: 122880 = 00000000`0001e000        

Daher beginnt ExplorerFrame.dll bei der Adresse 0x000006Fb'37A7C000 und ist 0x1E000 Bytes groß. Sie können die zugehörigen Symbole laden mit:

kd> .reload /f ExplorerFrame.dll=6fb`37a7c000,1e000