逆向工程核心原理之UPack PE文件头

0x0 两个文件对比

正常的notepad.exe

逆向工程核心原理之UPack PE文件头_第1张图片

使用Upack压缩后的notepad.exe,可以看到无法正常读取PE文件头。

 逆向工程核心原理之UPack PE文件头_第2张图片

0x1  重叠文件头

IMAGE_NT_HEADER的起始位置是可变的

 

0x2  修改SizeOfOptionalHeader的值

SizeOfOptionalHeader的值被修改成了0x0148(原来定义的是32位是E0,64位是F0)。

IMAGE_OPTION_HEADER的起始偏移是0x28,加上0x148,得到IMAGE_SECTION_HEADER的起始偏移0x170。所以说SizeOfOptionalHeader的另一层含义是确定IMAGE_SECTION_HEADER的起始偏移。

红框中的是Option_header,后面的是Data_Directories,以NULL结尾,从0xD7开始到0x170,是额外的空间,被填充了Upack的解码代码。

逆向工程核心原理之UPack PE文件头_第3张图片

0x3  IMAGE_OPTIONAL_HEADER.SizeOfNumberOfRvaAndSizes

SizeOfNumberOfRvaAndSizes指出IMAGE_DATA_DIRECTORY结构体个数。默认是0x10,可以看到图中是0xA0,剩下的区域则可以填充自己的代码。

红框中未被描深的地方是IMAGE_DATA_DIRECTORY结构体,一共0xA个,以NULL结尾。剩下的从0xB-0x10都填充了Upack的代码。

逆向工程核心原理之UPack PE文件头_第4张图片

0x4   重叠节区

PE装载器会将文件偏移0-1FF的区域分别映射到3个不同的内存位置(文件头,第一节区、第三节区)。用相同的文件映像可以分别创建出处于不同位置的、大小不同的内存映像。

0x5  RVA to RAW

节区开始的文件偏移的PointerToRawData值应该是FileAlignment的整数倍。PE装载器发现第一个节区的PointerToRawData值不是FileAlignment的整数倍时,会强制将其识别为整数倍。

0x6  导入表

逆向工程核心原理之UPack PE文件头_第5张图片

 

RVA是0x000261EE,大小为0x00000014

RAW=0x261EE-0x26000+0(本来是10,但是强制对齐了)=0x1EE

逆向工程核心原理之UPack PE文件头_第6张图片

每个IID是20个字节。

从上图中看出,跟在后面的不是NULL结尾也不是第二个结构体。

从之前重叠节区那张图可以看到第三节区起始偏移为0x10,大小是0x1F0,所以第三节区到0x200就结束了,0x200以下的部分是不会映射的第三个节区内存的。剩下的地址用NULL填充。

0x7  导入地址表

根据0x6中的IID结构,可以得到如下信息:

INT:0(RVA)

Name:2

FirstThunk(IAT):11E8

Name的RVA值为2,属于Header区域,RAW也是1

11E8-1000+0=1E8

IAT区域,该处是Name Pointer(RVA)数组。有两个函数地址,0x28和0xBE



你可能感兴趣的:(逆向)