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

 

----未完待续

相关文章
相关标签/搜索