利用 r2 逆向分析框架分析 Windows Minidumps

  • Post author:
  • Post category:其他


用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



版权声明:本文为systemino原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。