PE Headers的哪个字段告诉我们是否有效的PE文件?

时间:2010-07-14 12:13:18

标签: .net c++ portability portable-executable

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

我检查了FileHeader的“e_magic”字段,它总是在错误的PE文件(即js / html / java / class文件重命名为.dll / Exe)的情况下填充,并且没有说明任何关于PE的有效性。

3 个答案:

答案 0 :(得分:6)

如果存在这样的字段,则创建无效的exe并且故意将其标记为有效是太容易了。

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

答案 1 :(得分:2)

检查Portable Executable/Common Object File Format Specification。您需要检查三个神奇的值:

  • 文件开头的MZ标题的幻数
  • PE标头的起始处的PE标头的幻数“PE \ 0 \ 0”
  • 可选标头的版本标识符IIRC,PE文件为0x10b,PE +(x64)文件为0x20b。

除此之外,您必须解析整个文件并查看每个处理器指令以确保其有效等。其中一些文件在内部使用COFF规范,您可能没有一种简单的方法来区分它。 PE的格式本身是用多台机器设计的,可以包含许多不同形式的编译代码,同时保持文件有效。

答案 2 :(得分:1)

一种方法是使用GetBinaryType函数(请参阅http://msdn.microsoft.com/en-us/library/aa364819.aspx)或SHGetFileInfoSHGFI_EXETYPE的使用。