0x0 两个文件对比

正常的notepad.exe

****核心原理之UPack PE文件头

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

 ****核心原理之UPack PE文件头

0x1  重叠文件头

IMAGE_NT_HEADER的起始位置是可变的

****核心原理之UPack PE文件头

 

0x2  修改SizeOfOptionalHeader的值

****核心原理之UPack PE文件头

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文件头

0x3  IMAGE_OPTIONAL_HEADER.SizeOfNumberOfRvaAndSizes

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

****核心原理之UPack PE文件头

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

****核心原理之UPack PE文件头

0x4   重叠节区

****核心原理之UPack PE文件头

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

0x5  RVA to RAW

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

0x6  导入表

****核心原理之UPack PE文件头

 

RVA是0x000261EE,大小为0x00000014

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

****核心原理之UPack PE文件头

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

****核心原理之UPack PE文件头

11E8-1000+0=1E8

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

****核心原理之UPack PE文件头

****核心原理之UPack PE文件头

****核心原理之UPack PE文件头

相关文章:

  • 2021-06-28
  • 2021-10-13
  • 2022-12-23
  • 2021-09-05
  • 2021-07-13
  • 2021-06-14
  • 2022-12-23
  • 2021-08-18
猜你喜欢
  • 2022-01-13
  • 2022-01-11
  • 2021-05-01
  • 2021-10-15
  • 2021-04-06
  • 2021-08-05
  • 2022-01-21
相关资源
相似解决方案