Upack文件分析学习笔记

Upack的PE文件分析


原来的notepad.exe文件头

 

 

Upack压缩后的文件头

 

看到upack后的文件头有点奇怪

用Stud_PE分析一下文件头(PEView分析不出来)


在PE头最重要的是e_magic和e_lfanew,可以看到这里e_lfanew的值为10,就是说IMAGE_NT_HEADERS的起始位置是10,更具PE的规范,一个正常的程序中

e_lfanew = MZ文件头大小(40)+DOS存根大小(可变)

这里u_lfanew为10但是不违反PE的规范,只是钻了规范的空子,这样做就可以把MZ文件头与PE文件头重叠在一起。

详细地看一下,发现Upack把IMAGE_FILE_HEADER.SizeOfOptionalHeader的值修改为148,这个值比正常的值(E0)要大一些


然后看到IMAGE_OPTIONAL_HEADER的起始地址是28,所以加上148是170,所以

IMAGE_SECTION_HEADER是从偏移170开始的。

 

问题那么UPack为什么要修改这个值呢?

Upack的基本特征就是把PE文件头变形,像扭曲的麻花一样,向文件头适当的位置插入解码需要的代码。增大SizeOfOptionHeader后,就在IMAGE_OPTIONAL_HEADER与IMAGE_SECTION_HEADER之间增加了额外的空间。Upack就向这个区域添加解码代码。


从图中看出IMAGE_OPTIONAL_HEADER的结束位置是D7,因此从D7到170之间的数据都是解码代码了。

 

用调试器看一下


这里是Upack的解码代码,如果PE工具把这里识别为PE文件头信息,就会导致错误。

 

IMAGE_OPTIONAL_HEADER.NumberOfRvaAndSizes

从下面的图中可以看到这个值也被修改了,原来是10,现在修改成了A,这个值是用来指出紧接在后面的IAMGE_DATA_DIRECTORY结构体数组的元素个数。在PE规范中这个值是10,这里改为了A,所以后面的6个元素被忽略。


根据结构体的定义,最后的6个元素现在没用了,被用来写Upack的代码。

 


箭头所指的地方就是Upack自己的解码代码。可以用调试器来看一下。

 

IMAGE_SECTION_HEADER

Upack会向PE文件头中不使用的区域覆写自身的代码和数据。现在才发现pe头中有这么多未使用的区域。

 

 

重叠节区

Upack的主要特征之一就是可以随意重叠PE节区与文件头


看一下节区头,发现第一节区和第三节区的大小和文件偏移地址是一样的,但是内存的其实RVA和内存大小是不一样的,这是为什么呢?

正常情况下,PE装载器会把文件分别映射到3个不同的内存位置(文件头、第一节区、第三节区)。就是说用相同的文件可以分别创建出处于不同位置的、大小不同的内存映像。

因此,可以理解为,在文件中,第二个节区很大,文件就压缩存储在这里,在程序运行的时候,PE装载器会对文件进行解压缩并且进行内存的映射,将文件还原到第一个节区。(原来的文件有三个节区,都被解压到第一个节区)。

 

RVAtoRAW

这里就一句话要说:Upack的FileAlignment为200,所以PointerToRawData的值应该是0、200、400、600等。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值