2008-12-01 2 views
11

Я видел некоторые методы checking if a PEFile is a .NET assembly by examining the binary structure.Проверка, является ли файл сборкой .NET

Это самый быстрый способ протестировать несколько файлов? Я предполагаю, что попытка загрузить каждый файл (например, через Assembly.ReflectionOnlyLoad) может быть довольно медленным, так как он будет загружать информацию о типе файла.

Примечание: Я ищу способ проверить файлы программным путем.

ответ

6

Может быть, это помогает

из http://www.grimes.nildram.co.uk/dotnet/vistaAndDotnet.htm

Далее, я проверяю, если это .NET сборки. Для этого я проверяю, содержит ли файл заголовок CLR. Этот заголовок содержит важную информацию о местонахождении .NET-кода в файле и версии фреймворка, который использовался для написания этого кода. Местоположение этого заголовка указывается в таблице данных каталога данных. Если элемент каталога данных имеет нулевые значения, то файл неуправляемый, если он имеет ненулевые значения, тогда файл представляет собой сборку .NET.

Вы можете проверить это самостоятельно, используя утилиту dumpbin с переключателем/headers. Эта утилита будет печатать различные заголовки в файле в командной строке. В конце дополнительных значений заголовка вы увидите список каталогов данных (их всегда будет 16), и если в каталоге дескриптора COM есть ненулевое местоположение, это указывает на то, что этот файл является сборкой .NET. Содержимое заголовка CLR также может быть указано с помощью переключателя/clrheader (если файл неуправляемый, это не покажет никаких значений). XP для заголовка CLR, когда он выполняет файл, и если присутствует CLR-заголовок, он инициализирует среду выполнения и передает точку входа сборки во время выполнения, чтобы файл полностью выполнялся во время выполнения.

+0

Это полезно, но я ищу программную проверку. – 2008-12-01 18:27:04

+0

У вас есть еще одна ссылка? (текущая ссылка мертва) – Fab 2015-11-09 20:45:10

1

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

5

В прошлом я использовал AssemblyName.GetAssemblyName(), который генерирует исключение, если это не управляемая сборка. Тем не менее, я никогда не тестировал его, поэтому не могу сказать, насколько это быстро.

7

Я полагаю, что ответ Сторменета не является технически программным, поэтому я отрисую свой ответ в ответ.

Для лучшей производительности ничто не будет бить, открывая файл (ы) с StreamReader, считывая первые (n) байты и проверяя структуры данных подписи .NET в потоке байтов.

Довольно так же, как вы бы проверить что-то является DOS исполняемым:

http://en.wikipedia.org/wiki/DOS_executable

Посмотрите на коллекторных байтов «MZ», которые также случаются быть инициалами Марк Zbikowski, один из разработчики MS-DOS.

 Смежные вопросы

  • Нет связанных вопросов^_^