我們已經了解了什么是Dump文件,它保存了什么數據,有什么作用,但它是如何存儲的,數據格式是怎樣的呢。下面簡單說一下。
一、總體結構
二、文件頭
首先文件的最開始的32個字節是Dump文件的文件頭,這里包含了Dump文件標識、格式版本、校驗和、時間戳和一些標志,數據結構如下
typedef struct _MINIDUMP_HEADER {
ULONG32 Signature;
ULONG32 Version;
ULONG32 NumberOfStreams;
RVA StreamDirectoryRva;
ULONG32 CheckSum;
union {
ULONG32 Reserved;
ULONG32 TimeDateStamp;
};
ULONG64 Flags;
} MINIDUMP_HEADER, *PMINIDUMP_HEADER
上面的結構包含了很多信息,總共32個字節,存放在文件的最開始的位置,下面分別說下各成員:
- Signature---文件標識
4個字節,存放內容是"MDMP"字符串的ASSIC碼。可以簡單的讀取文件的頭4個字節是否等於"MDMP"來判斷一個文件是否是Dump文件。 - Version---Dump格式的版本
低兩字節是MiniDump的版本號,高兩字節是一個特定整形值 - NumberofStreams----文件里內存數據流的計數
也就是MiniDump目錄表的元素個數。dump文件是以流的形式保存內存數據,各個流的類型不一樣。 - StreamDirectoryRVA
流目錄表的文件偏移地址,從文件最開始處也就是地址0開始,那么要尋址流目錄:0+StreamDirectoryRva
(字節) - CheckSum
文件校驗和,可以為0 - TimeDataStamp
時間戳,文件的修改時間 - Flags
一個或多個MINIDUMP_TYPE的枚舉值組成的標志,說明本文件里包含了哪些信息。
三、流目錄
文件頭過后緊接着的是流目錄。通過文件頭里的StreamDirectoryRVA字段決定我們可以快速定位到流目錄在文件里的位置。
我們可以看到流目錄緊挨着文件頭的尾部。
流目錄記錄內存數據的流的摘要數據組成的數組,方便解析器進行解析和數據定位。數組元素由如下結構填充:
typedef struct _MINIDUMP_DIRECTORY { ULONG32 StreamType; MINIDUMP_LOCATION_DESCRIPTOR Location; } MINIDUMP_DIRECTORY, *PMINIDUMP_DIRECTORY;
StreamType---流類型
這是一個4字節的MINIDUMP_STREAM_TYPE枚舉類型的數據
typedef enum _MINIDUMP_STREAM_TYPE { UnusedStream, ReservedStream0, ReservedStream1, ThreadListStream, ModuleListStream, MemoryListStream, ExceptionStream, SystemInfoStream, ThreadExListStream, Memory64ListStream, CommentStreamA, CommentStreamW, HandleDataStream, FunctionTableStream, UnloadedModuleListStream, MiscInfoStream, MemoryInfoListStream, ThreadInfoListStream, HandleOperationListStream, TokenStream, JavaScriptDataStream, SystemMemoryInfoStream, ProcessVmCountersStream, IptTraceStream, ThreadNamesStream, ceStreamNull, ceStreamSystemInfo, ceStreamException, ceStreamModuleList, ceStreamProcessList, ceStreamThreadList, ceStreamThreadContextList, ceStreamThreadCallStackList, ceStreamMemoryVirtualList, ceStreamMemoryPhysicalList, ceStreamBucketParameters, ceStreamProcessModuleMap, ceStreamDiagnosisList, LastReservedStream } MINIDUMP_STREAM_TYPE;
- Location---流數據的位置信息
位置信息也是由一個結構MINIDUMP_LOCATION_DESCRIPTOR
來描述的,包含流數據大小和文件偏移地址
typedef struct _MINIDUMP_LOCATION_DESCRIPTOR { ULONG32 DataSize; RVA Rva; } MINIDUMP_LOCATION_DESCRIPTOR;
通過上面的相關結構,我們可以得出,一個流目錄項總供有12個字節,那么有多少個項呢,由文件頭里的字段NumberOfStreams
給出,比如
我們就可以知道,流目錄的大小=sizeof(MINIDUMP_DIRECTORY
)*MINIDUMP_HEADER
::NumberOfStreams。這個文件里的流目錄的大小=12*17=204B
----未完待續