如何提取便携式可执行文件的附加数据?

逆向工程 聚乙烯
2021-06-14 06:28:36

您如何可靠地提取便携式可执行文件中的附加数据?

3个回答

澄清一下:附加数据- 也称为覆盖- 是 PE 文件中未被标头覆盖的部分。

在此处输入图片说明

由于 PE 文件格式中存在一些棘手的条件,在某些极端情况下可能难以确定,因此最好依靠强大的库,例如pefile

这是一个简单的 Python 脚本,它依赖于 pefile 来提取附加数据:

import pefile
import sys

filename = sys.argv[1]
with open(filename, "rb") as s:
    r = s.read()

pe = pefile.PE(filename)
offset = pe.get_overlay_data_start_offset()

with open(filename + ".app", "wb") as t:
    t.write(r[offset:])

使用您的文件名作为参数。


就我个人而言,我通常用 Hiew 来做 - 因为 Hiew 比其他任何东西都更快启动,而且 PE 稳健:

  1. 转到附加数据开始
    1. HexASM模式下,按下F8可查看 PE 头信息
    2. Alt+F2转到附加数据开始处
  2. 选择到最后
    1. Keypad-* 开始选择
    2. Ctrl+End转到文件底部
    3. Keypad-* 再次完成选择
  3. F2 将选择写入文件

手动完成并不难。

  1. 从 MZ 头中找到 PE 头,并确定节表的位置。
  2. 遍历截面表,并确定PointerToRawData+的最大值SizeOfRawData(注意:这些值需要使用 的FileAlignment成员进行对齐IMAGE_OPTIONAL_HEADER)。

  3. 使用确定的最大值作为覆盖数据的文件偏移量。

请注意,某些安装程序/文件格式实际上并不使用此计算,而是在文件末尾有一个小预告片,指向有效负载的开头。例如,ZIP 文件格式就是这样工作的——这就是为什么无论解包器存根是 PE、DOS MZ、ELF、Mach-O 还是其他任何东西,都可以提取自解压 ZIP。

另一种选择是mewrev/pe Go 包:

package main

import (
   "github.com/mewrev/pe"
   "io/ioutil"
   "log"
   "os"
)

func main() {
   file, e := pe.Open("vs_BuildTools.exe")
   if e != nil {
      log.Fatal(e)
   }
   y, e := file.Overlay()
   if e != nil {
      log.Fatal(e)
   }
   ioutil.WriteFile("vs_BuildTools.overlay", y, os.ModePerm)
}