Какое поле PE Headers говорит о том, является ли действительный файл PE или нет? - PullRequest
2 голосов
/ 14 июля 2010

Мне нужно проверить, является ли данный двоичный файл PE-файлом или нет (например, если я переименую файлы JS / HTML или .class в .exe или .dll), они все равно не будут PE-файлами. Разбор PE-файлов даст мне информацию об этой проблеме; какое поле указывает, что данный двоичный файл является допустимым файлом PE или нет?

Я проверил поле "e_magic" в FileHeader, оно всегда заполняется в случае неправильных PE-файлов (т.е. файлов js / html / java / class, переименованных в .dll / Exe) и ничего не говорит о срок действия ЧП.

Ответы [ 3 ]

6 голосов
/ 14 июля 2010

Если бы такое поле существовало, было бы слишком легко создать недопустимый exe-файл и специально пометить его как допустимый.

Вы проверяете, что файл является файлом PE, читая заголовок PE и проверяязначения для всех полей (значения должны принадлежать допустимым диапазонам, не должны указывать вне файла и т. д.).

2 голосов
/ 14 июля 2010

Проверьте Спецификация формата файла исполняемого / общего объектного файла .Вам нужно проверить три магических значения:

  • Магическое число заголовка MZ в начале файла
  • Магическое число заголовка PE "PE \ 0 \ 0" вначало PE-заголовка
  • Идентификатор версии для необязательного заголовка, IIRC, 0x10b для PE-файлов и 0x20b для PE + (x64).

Помимо этого, вам нужнонеобходимо проанализировать весь файл и просмотреть каждую инструкцию процессора, чтобы убедиться, что она действительна и т. д. В некоторых файлах внутренне используется спецификация COFF, и у вас может не быть простого способа отличить это.Сам формат PE был разработан для нескольких машин, и в нем можно хранить много разных форм скомпилированного кода, сохраняя файл действительным.

1 голос
/ 14 июля 2010

Одним из способов является использование функции GetBinaryType (см. http://msdn.microsoft.com/en-us/library/aa364819.aspx) или использование SHGetFileInfo с SHGFI_EXETYPE.

...