Каждый исполняемый файл, который я читаю, начинается с заголовка MZ

Каждый исполняемый файл, который я читаю, начинается с заголовка MZ

Первоначально я пытался создать программу, которая различала бы исполняемые файлы DOS (16-бит) и Windows (32/64-бит).

Я прочитал в каком-то другом ответе, что исполняемый файл можно классифицировать на основе его первых двух байтов. (MZ/...)

Но когда я вручную сравнил несколько исполняемых файлов (как 16-, так и (32/64-битных)), я обнаружил, что все они начинались с MZ..

Есть ли на это какая-то причина или я что-то делаю не так?

16-битные исполняемые файлы были написаны мной на ассемблере->скомпилированы с использованием TASM, а 32/64-битные исполняемые файлы были взяты из системных файлов моего компьютера.C:\Windows\System32

Есть ли другой, более точный способ отличить исполняемый файл?

решение1

Я обнаружил, что все они начинались сMZ

MZдействительно является характерной сигнатурой файла .exe:

Формат исполняемого файла DOS MZ — это формат исполняемого файла, используемый для файлов .EXE в DOS.

Файл можно идентифицировать по строке ASCII «MZ» (шестнадцатеричное: 4D 5A) в начале файла («магическое число»). «MZ» — это инициалы Марка Збиковски, одного из ведущих разработчиков MS-DOS.

ИсточникИсполняемый файл DOS MZ — Википедия

Эта подпись позднее была распространена на его потомков (включая NE и PE):

New Executable (сокращенно NE или NewEXE) — это 16-битный формат файла .exe, преемник формата исполняемого файла DOS MZ. Он использовался в Windows 1.0–3.x, многозадачной MS-DOS 4.0,[1] OS/2 1.x и подмножестве OS/2 Windows NT до версии 5.0 (Windows 2000). NE также называется сегментированным исполняемым файлом

ИсточникНовый исполняемый файл — Википедия

Формат Portable Executable (PE) — это формат файла для исполняемых файлов, объектного кода, DLL и других, используемых в 32- и 64-разрядных версиях операционных систем Windows. Формат PE — это структура данных, которая инкапсулирует информацию, необходимую загрузчику ОС Windows для управления исполняемым кодом в оболочке. Сюда входят ссылки на динамические библиотеки для связывания, таблицы экспорта и импорта API, данные управления ресурсами и данные локального хранилища потоков (TLS). В операционных системах NT формат PE используется для EXE, DLL, SYS (драйвер устройства) и других типов файлов. В спецификации Extensible Firmware Interface (EFI) указано, что PE является стандартным форматом исполняемых файлов в средах EFI.

В операционных системах Windows NT PE в настоящее время поддерживает архитектуры набора инструкций (ISA) IA-32, IA-64, x86, x86-64 (AMD64/Intel 64), ARM и ARM64. До Windows 2000 Windows NT (и, следовательно, PE) поддерживала MIPS, Alpha и PowerPC ISA. Поскольку PE используется в Windows CE, она продолжает поддерживать несколько вариантов MIPS, ARM (включая Thumb) и SuperH ISA.

ИсточникПортативный исполняемый файл — Википедия

So MZиспользуется для 16-, 32- и 64-битных .exeподписей и не может использоваться для различения 16- и 32/64-битных программ.


Так как же отличить 16- и 32/64-битные программы?

Windows несколько раз расширяла старый формат исполняемого файла DOS, поэтому если вы посмотрите на «современный» исполняемый файл Windows, то в самом начале будет MZ (или, возможно, ZM, если исполняемый файл предназначен для системы, использующей противоположный порядок битов). Это обозначает заголовок для второго формата исполняемого файла DOS, известного просто как формат MZ.

Дальше вы увидите какую-то явную тарабарщину, за которой следует что-то вроде «Эта программа не может быть запущена в режиме DOS». Эта тарабарщина на самом деле является очень простой программой DOS, которая выводит сообщение, сообщающее пользователю, что эта программа не может быть запущена в режиме DOS.

После этого у вас есть заголовок для самого исполняемого файла, который может начинаться с одной из четырех пар букв: NE, LX, LE или PE. Если вы не видите ни одного из них и вышеупомянутого сообщения, это 16-битное приложение DOS.

ИсточникКак проверить, является ли двоичный файл 16-битным в Windows, ответ поОстин Хеммельгарн

Вы также можете использовать команду Unix file(которая доступна в Cygwin и:

Пример:

C:\Program Files\GnuWin32\bin>file "C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE"
C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE; PE32 executable for MS Windows (GUI) Intel 80386 32-bit

Я считаю, что когда это 16-битный исполняемый файл, он что-то говорит исполняемым файлам MS-DOS или Win 3.X.

ИсточникРешено: Совет или инструмент для различения 16/32/64-битных .exe-файлов? | Tech Support Guy

По ссылке выше также доступен исходный код (похоже на C), с которым вы можете поэкспериментировать.

Связанный контент