PE头的哪个字段可以告诉我们一个文件是否是有效的PE文件?

3

我需要验证给定的二进制文件是否为PE文件(例如,如果我将JS / HTML或.class文件重命名为.exe或.dll,则它仍然不是PE文件)。解析PE文件将为我提供有关此问题的信息; 哪个字段指示给定的二进制文件是否为有效的PE文件?

我已经检查了FileHeader的“e_magic”字段,在错误的PE文件的情况下它总是被填充,并且并不能说明PE文件的有效性。


3
你为什么需要这种检查呢?如果你打算运行 EXE 文件,最好让 Windows 自己进行检查。如果你在检查恶意二进制文件,那么你需要进行无数的检查,最终你可能会编写自己的病毒扫描器。 - Tim Robinson
1
请解释一下PE,因为我的体育定义不适用于这个上下文。 - Thomas Matthews
3个回答

6

如果存在这样的字段,那么就太容易创建一个无效的exe并故意标记为有效了。

你可以通过读取PE头并检查所有字段的值(这些值应该属于有效范围,不应指向文件外部等)来验证文件是否为PE文件。


+1 有很多 RVA(相对虚拟地址)字段需要检查;这些字段应该都指向 PE 中适当类型的节内部。然而,一旦完成这些步骤,你仍然不知道二进制文件是否恶意。 - Tim Robinson
我不认为他说了什么恶意的话。他只是不想让那些使用明显不是PE文件的文件作为PE文件的人进入。 - Billy ONeal
这里“using”的含义很重要。如果用户信任此二进制文件,并且在此检查之后立即运行它,那么Windows PE加载器将进行必要的验证。如果此检查的目的是确定二进制文件是否受信任,则需要进行大量工作。 - Tim Robinson

4
请查看可移植可执行文件格式规范,其中有三个魔数需要检查:
  • 文件开头的 MZ 头部魔数
  • PE 头部魔数“PE\0\0”,位于 PE 头部的开始处
  • 可选头的版本标识符,如果我没记错,PE 文件为 0x10b,PE+(x64)文件为 0x20b。
除此之外,您还需要解析整个文件并查看每个处理器指令以确保其有效等。其中一些文件在内部使用 COFF 规范,您可能没有一个简单的方法来区分这一点。PE 格式本身是针对多台机器设计的,可以包含许多不同形式的编译代码,同时仍保持文件有效。

感谢Billy ONeal的回答。 我认为只需要考虑PE头的PE00字节来决定PE文件的有效性就足够了。我认为MZ头字节只是告诉你该文件无法在DOS模式下运行,需要Windows才能运行。不是吗? - Usman
它还可能需要您拥有一个有效的可选头大小。 - Tim Lovell-Smith

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接