我发现了几种定义PE的方式。




IMAGE_FILE_HEADER包含/ a(如何在此位置选择文章类型?)字段Characteristics可能是检查IMAGE_FILE_32BIT_MACHINE

IMAGE_OPTIONAL_HEADER包含在MagicIMAGE_NT_OPTIONAL_HDR32_MAGIC和某些IMAGE_NT_OPTIONAL_HDR64_MAGIC之间切换的IMAGE_ROM_OPTIONAL_HDR_MAGIC字段。
IMAGE_FILE_HEADER还包含可以检查

0x8664的计算机字段- x64
0xaa64-64位模式下的ARMv8
0x0200-Intel Itanium处理器家族
0x0284-64位Alpha AXP。


还包括SizeOfOptionalHeader IMAGE_FILE_HEADER可以检查两个特定值之一。


它们是否都具有相同的含义?有任何区别,特定条件和例外情况吗?


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

评论

有什么原因不能只检查decomp中的64位寄存器吗?

我在寻找真理。我需要一种快速可靠的方式来自动处理文件。

#1 楼

IMAGE_OPTIONAL_HEADER->MAGIC(一点都不是可选的:])决定了Windows OS加载程序将其加载为32位还是64位。取决于IMAGE_OPTIONAL_HEADER->MAGIC的值,加载程序将如何解析IMAGE_OPTIONAL_HEADER的其余部分。

如上所述,可以将SizeOfOptionalHeader用作交叉引用。

IMAGE_FILE_HEADER-> MAGIC用于确定目标CPU。主要用于确定应如何解释机器代码。

评论


由于Magic已经位于可选标头结构中,因此可能在IMAGE_FILE_HEADER被“映射”为32或64位类型的可选标头结构之后,在内存之前定义了位数。

– SerG
15年2月12日在21:36

#2 楼

Machine字段将告诉您目标平台,其中包括它的位数和该节内容的字节序。 PE标头本身是little-endian(而可选标头对于目标文件是完全可选的)。