3

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

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

4

3 回答 3

6

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

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

于 2010-07-14T12:17:56.027 回答
3

检查Portable Executable/Common Object File Format Specification。您可以检查三个魔术值:

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

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

于 2010-07-14T12:22:36.593 回答
1

一种方法是使用GetBinaryType函数(参见http://msdn.microsoft.com/en-us/library/aa364819.aspx)或使用SHGetFileInfowith SHGFI_EXETYPE

于 2010-07-14T12:21:17.047 回答