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

0x0 两个文件对比

正常的notepad.exe

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

 

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的解码代码。

0x3  IMAGE_OPTIONAL_HEADER.SizeOfNumberOfRvaAndSizes

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

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

0x4   重叠节区

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

0x5  RVA to RAW

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

0x6  导入表

 

RVA是0x000261EE,大小为0x00000014

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

每个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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值