Dump文件数据存储格式(一)

简介: 我们已经了解了什么是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

----未完待续