用Microsoft使用minidump格式存储用户模式的内存转储(dump),它是一种公开记录的文件格式,以前几乎都是在WinDbg进行分析。
本文介绍如何使用radare2 mdmp模块进行Minidumps转储文件分析。
0x01 文件格式
该格式其实很简单,因为基本上都是数据流,这些数据流根据其内容而有所不同
奇热
。
$ r2 mini.dmp [0x00690efa]> i blksz 0x0 block 0x100 fd 6 file mini.dmp format mdmp iorw false mode -r-- size 0xc53a7be humansz 197.2M type MDMP (MiniDump crash report data) arch x86 binsz 206809022 bintype mdmp bits 32 canary false crypto false endian little flags 0x00061826 havecode true hdr.csum 0x00000000 linenum false lsyms false machine i386 maxopsz 16 minopsz 1 nx false os Windows NT Workstation 6.1.7601 pcalign 0 pic false relocs false rpath NONE static false streams 13 stripped false va true
我们可以看到上面的文件mini.dmp包含13个stream,并且文件类型为MiniDuMP(MDMP)。有关MDMP格式基础的其他知识,请参阅Brendan Dolan-Gavitt撰写的文章
:
http://moyix.blogspot.co.uk/2008/05/parsing-windows-minidumps.html
0x02 分析
MDMP格式会生成一个信息量很大的文件,因此对文件的简单解析就足够了。使用radare2的pf命令很容易做到这一点,请参阅使用radare2解析文件格式的这篇文章:
http://radare.today/posts/parsing-a-fileformat-with-radare2/
以下是当前支持的文件结构的列表
:
[0x00000000]> pf. pf.mdmp_memory_descriptor pf.mdmp_misc_info pf.mdmp_thread_info pf.mdmp_thread_list pf.mdmp_module pf.mdmp_unloaded_module_list pf.mdmp_system_info pf.mdmp_module_list pf.mdmp_thread_info_list pf.mdmp_location_descriptor pf.mdmp_string pf.mdmp_memory64_list pf.mdmp_vs_fixedfileinfo pf.mdmp_location_descriptor64 pf.mdmp_header pf.mdmp_unloaded_module pf.mdmp_memory_descriptor64 pf.mdmp_directory pf.mdmp_memory_info pf.mdmp_thread pf.mdmp_handle_data_stream pf.mdmp_memory_info_list
通过radare2的预定义二进制结构模式打开文件,可以查看MDMP文件的结构。mini.dmp文件具有如下所示的格式:
[0x00000000]> pf.mdmp_header Signature : 0x00000000 = MDMP Version : 0x00000004 = 1812113299 NumberOfStreams : 0x00000008 = 13 StreamDirectoryRVA : 0x0000000c = 32 CheckSum : 0x00000010 = 0 TimeDateStamp : 0x00000014 = Tue Jan 31 18:44:24 2017 Flags : 0x00000018 = Flags (bitfield) = 0x00061826 : MiniDumpWithFullMemory | MiniDumpWithHandleData | MiniDumpWithUnloadedModule | MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo | MiniDumpIgnoreInaccessibleMemory | MiniDumpWithTokenInformation
上面的标识记录了将被写入MDMP文件的信息,因此,需要某些标识来执行不同类型的分析,可以注意到文件项NumberOfStreams的file匹配项。使用NumberOfStreams和StreamDirectoryRVA可以打印出目录结构列表。
以下是线程信息和模块列表的结构,描述了它们的位置和大小
:
[0x00000000]> pf.mdmp_stream_directory [13]? (mdmp_directory)directories [0x00000000]> pf.mdmp_stream_directory @ 32 directories : [ [snip] struct<mdmp_directory> StreamType : 0