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

咱們已經瞭解了什麼是Dump文件,它保存了什麼數據,有什麼做用,但它是如何存儲的,數據格式是怎樣的呢。下面簡單說一下。數組

1、整體結構數據結構

 

2、文件頭spa

首先文件的最開始的32個字節是Dump文件的文件頭,這裏包含了Dump文件標識、格式版本、校驗和、時間戳和一些標誌,數據結構以下3d

typedef struct _MINIDUMP_HEADER { code

ULONG32 Signature;
  ULONG32 Version;
  ULONG32 NumberOfStreams;
  RVA     StreamDirectoryRva;
  ULONG32 CheckSum;
  union {
    ULONG32 Reserved;
    ULONG32 TimeDateStamp;
  };
  ULONG64 Flags;
} MINIDUMP_HEADER, *PMINIDUMP_HEADER

上面的結構包含了不少信息,總共32個字節,存放在文件的最開始的位置,下面分別說下各成員:blog

  • Signature---文件標識
    4個字節,存放內容是"MDMP"字符串的ASSIC碼。能夠簡單的讀取文件的頭4個字節是否等於"MDMP"來判斷一個文件是不是Dump文件。
  • Version---Dump格式的版本
    低兩字節是MiniDump的版本號,高兩字節是一個特定整形值
  • NumberofStreams----文件裏內存數據流的計數
    也就是MiniDump目錄表的元素個數。dump文件是以流的形式保存內存數據,各個流的類型不同。
  • StreamDirectoryRVA
    流目錄表的文件偏移地址,從文件最開始處也就是地址0開始,那麼要尋址流目錄:0+StreamDirectoryRva(字節)
  • CheckSum
    文件校驗和,能夠爲0
  • TimeDataStamp
    時間戳,文件的修改時間
  • Flags
    一個或多個MINIDUMP_TYPE的枚舉值組成的標誌,說明本文件裏包含了哪些信息。

3、流目錄ip

文件頭事後緊接着的是流目錄。經過文件頭裏的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給出,好比it

咱們就能夠知道,流目錄的大小=sizeof(MINIDUMP_DIRECTORY)*MINIDUMP_HEADER::NumberOfStreams。這個文件裏的流目錄的大小=12*17=204B

 

----未完待續

相關文章
相關標籤/搜索