Die Crash Dumps der 32bit- und der 64bit-Versionen von Microsoft Windows unterscheiden sich deutlich. Da 64bit-Maschinen immer häufiger anzutreffen sind, gebe ich in diesem Beitrag einige Hinweise zur Struktur der zugehörigen Crash Dumps.
Der erste Unterschied springt zumindest bei der Betrachtung im Hexeditor sofort ins Auge: statt mit "PAGEDUMP" beginnen die Dateien jetzt mit der Signatur "PAGEDU64":
Eine weitere bedeutende Änderung besteht darin, dass Adressen nun natürlich als 64bit-Zahlen angegeben werden. Gegenüber dem 32bit-Header gibt es deshalb einige Verschiebungen.
| Offset | Typ | Feld | Bemerkungen |
|---|---|---|---|
| 0x000 | char | Signature[4] | 'PAGE' |
| 0x004 | char | ValidDump[4] | 'DU64' |
| 0x008 | uint32 | MajorVersion | |
| 0x00c | uint32 | MinorVersion | Nummer der Windows Build |
| 0x010 | uint64 | DirectoryTableBase | |
| 0x018 | uint64 | PfnDataBase | |
| 0x020 | uint64 | PsLoadedModuleList | |
| 0x028 | uint64 | PsActiveProcessHead | |
| 0x030 | uint32 | MachineImageType | |
| 0x034 | uint32 | NumberProcessors | |
| ... | |||
| 0x088 | char | PhysicalMemoryBlock[0x80] | |
| ... | |||
| 0xf98 | uint32 | DumpType | 1 = full dump, 2 = kernel dump (kleiner) |
| ... | |||
| 0xfa0 | int64 | SystemUpTime | gemessen in Einheiten zu 100 ns |
| 0xfa8 | int64 | SystemTime | FILETIME |
Der PhysicalMemoryBlock enthält in der 64bit-Version bis zu 7 Runs (4 in der 32bit-Version).
typedef struct {
uint64 BasePage;
uint64 PageCount;
} _PHYSICAL_MEMORY_RUN64;
typedef struct {
uint64 NumberOfRuns;
uint64 NumberOfPages;
_PHYSICAL_MEMORY_RUN64 Run[NumberOfRuns];
} _PHYSICAL_MEMORY_DESCRIPTOR64;
Diese und einige Werte mehr kann das Template für den 010 Editor parsen. Der folgende Screenshot zeigt ein Beispiel:
Für Hinweise zum Datenformat danke ich "blufferisme".
