Dump文件數據存儲格式(一)


我們已經了解了什么是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

 

----未完待續


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM