定义可移植可执行位数 64 与 32 的方法

逆向工程 视窗 聚乙烯 可执行 二进制
2021-07-07 11:18:17

我找到了几种定义 PE 位数的方法。

  • IMAGE_FILE_HEADER包含/ A(你如何选择在这样的地方文章类型?)字段Characteristics,可以用于进行检查IMAGE_FILE_32BIT_MACHINE
  • IMAGE_OPTIONAL_HEADER包含MagicIMAGE_NT_OPTIONAL_HDR32_MAGICIMAGE_NT_OPTIONAL_HDR64_MAGIC之间切换的字段IMAGE_ROM_OPTIONAL_HDR_MAGIC
  • IMAGE_FILE_HEADER 还包含可以检查的 Machine 字段
    • 0x8664 - x64
    • 0xaa64 - 64 位模式下的 ARMv8
    • 0x0200 - 英特尔安腾处理器家族
    • 0x0284 - 64 位 Alpha AXP。
  • 同样SizeOfOptionalHeaderIMAGE_FILE_HEADER可检查两个特定值之一。

所有这些都具有相同的含义吗?有什么区别,具体情况,特殊情况?


我发现Machine字段检查是间接方式,因为该字段旨在定义处理器架构。因此,它作为启发式方法是间接且不可靠的。 SizeOfOptionalHeader即使对于相同的位数也会有所不同,因为某些图像目录可能不存在。

2个回答

IMAGE_OPTIONAL_HEADER->MAGIC(这根本不是可选的 :] )决定了 Windows 操作系统加载程序将其加载为 32 位还是 64 位。根据在值IMAGE_OPTIONAL_HEADER->MAGIC是装载机将如何解析的其余部分IMAGE_OPTIONAL_HEADER

并且如上所述SizeOfOptionalHeader可以用作交叉参考。

IMAGE_FILE_HEADER->MAGIC 用于确定预期的 CPU。主要用于确定机器代码应该如何解释。

Machine 字段会告诉您目标平台,包括它的位数和部分内容的字节序。PE 标头本身是小端的(并且可选标头对于目标文件完全是可选的)。