查看原文
其他

逆向技巧之计算dump文件大小

aWelBs 看雪学院 2019-05-25

dump文件是逆向中经常会遇到的一个问题。如果病毒将恶意模块解密出来后,直接在内存中加载执行,就不会有文件释放。为了能够使用IDA分析恶意模块功能或者单独调试,需要将它dump下来,即转存为文件。

 

但dump之前有一个问题,原始文件的大小是多少呢?

 

比如像下面这样,病毒解密出PE文件内容后将其分段写入其他进程。这里我们可以定位到PE文件在内存中的起始地址0x011860D0,可以看到“MZ”标志。现在的问题是,结束地址是什么?

 

可以有3种方法:


  • 直接往后拖,看到哪里像是文件末尾,就当做结束地址。这种方法需要非常丰富的逆向经验,适用于少数逆向大佬。


  • 直接拖到内存块末尾,把它当做结束地址。这种方式也不是不可以,毕竟很多时候,解密出来的PE文件都是放在单独一块内存中的 ,而且就算dump出的文件末尾多了一些内容,也不会影响分析,但如果要提取文件的MD5的话就麻烦了。


  • 根据PE结构计算出原始文件的大小。


我们先看一下PE文件的结构及其在内存中的映射方式。PE文件主要分为DOS头部PE文件头块表各区块以及文件末尾的不能映射部分(如调试信息等,在逆向时用处不大,而且很多时候都没有这部分)。

 

其中除了不能映射部分,其他部分的大小我们都是可以通过解析PE文件获取到的。我们现在只是需要获取总的大小,可以先把DOS头部、PE文件头、块表这几部分dump出来。只需要找到块表的位置即可,在内存中很容易找,一般带有“.text”、“.data”这样的区块名字符串,这里由于dump对象加了upx壳,所以区块名是“UPX0”“UPX1”,也是同样的道理。

 

如果不确定块表的结束地址的话,直接找到后面0x00结束的地方全部dump下来就可以了。这里是0x11864AA,大小为0x3DB。dump多了也没关系,这里不需要精准。

 

用LoadPE dump下来。

 

将dump下来的PE头放到DIE里面,主要关注“Offset”和“R.Size”两项,分别表示区块在文件中的偏移以及大小。我们直接找到最后一个区块“UPX2”的偏移以及大小:0x66a00,0x200。相加为0x66c00,即为需要dump文件除了文件末尾不能映射部分以外的大小。

 

重新dump。 

 

Dump出的文件的hash值可以在VT中找到,说明这是一个完整的文件。

 

由于在这个例子中,被dump的文件没有文件末尾的不能映射部分,所以能够精确dump。如果有这部分内容的情况下,就不能做到精确了,毕竟PE文件末尾的这部分大小是没有办法通过计算获取到的。不过对于被dump的文件,这部分内容对于分析它是没有影响的,只是会影响提取MD5。




- End -



看雪ID:aWelBs                            

https://bbs.pediy.com/user-839884.htm



本文由 aWelBs 原创

转载请注明来自看雪社区




热门图书推荐:

立即购买!


看雪学院官方QQ群

QQ:953174865


欢迎入群交流!


热门技术文章:        



公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存