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

548
Jacob Stern

У меня есть .exeфайл, который я не могу запустить в Windows 10. Я подозреваю, что это потому, что двоичный файл 16-разрядный. Есть ли простой способ проверить? Что-то вроде ответа Александра Рево было бы здорово.

4

2 ответа на вопрос

7
Austin Hemmelgarn

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

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

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

NEисполняемые файлы (известные как «Новые исполняемые файлы») в настоящее время устарели. Они были первым «новым» форматом расширенной формы MZ и изначально разрабатывались для Windows 1.0. Они всегда являются 16-разрядными исполняемыми файлами Windows и официально использовались с Windows 1.0-3.x, MS-DOS 4.0 (но не более поздними версиями), OS / 2 1.x и версиями OS / 2 Windows вплоть до NT 5.0 (Windows 2000). Их нельзя запустить в 64-разрядной версии Windows, и они не будут правильно отображать значок приложения в 32-разрядных версиях Windows начиная с Vista.

LXисполняемые файлы (одна из двух разновидностей «линейных исполняемых файлов») - это 32-разрядные исполняемые файлы в формате, который использовался в OS / 2 2.x и более поздних версиях, а также некоторыми расширениями DOS. Они не поддерживаются ни в одной современной версии Windows (и я думаю, что они, возможно, никогда не были поддержаны, хотя я не уверен).

LEисполняемые файлы (другой тип 'Linear Executable') являются странным случаем и могут даже технически содержать 64-битный код. Они также были представлены в OS / 2 2.0 (как и LXисполняемые файлы), но были разработаны для использования с драйверами оборудования. Модель драйвера VxD, используемая в Windows 3.x и 9x, использовала этот формат. Они никогда не использовались для пользовательских приложений и, следовательно, вообще не поддерживаются в более новых версиях Windows.

PEИсполняемые файлы, более известные как «Portable Executables», представляют собой формат, используемый современными системами Windows, и были разработаны для 32-битного кода (и, следовательно, никогда не поддерживали 16-битный код). Существует также расширение под названием «PE32 +», которое используется для 64-разрядных двоичных файлов Windows, двоичных файлов .NET CIL (которые не зависят от ширины битов) и ряда других вещей, которые используют различные расширения (например, драйверы UEFI и приложения, которые используют.efi расширение, имеют формат PE32 +).

Используя эту информацию, вы можете использовать ту же общую проверку, которая предлагается в ответе, который вы указали в своем вопросе. Если вы просто видитеMZ короткое сообщение, а не короткое, за которым следует какой-то бред, а затем одна из четырех пар букв выше в первых 4 КБ файла, это просто исполняемый файл DOS, в противном случае это один из этих четырех форматов. Единственный из тех форматов, которые должны работать в Windows 10, это формат PE.

В качестве примера приведем шестнадцатеричный дамп первых 512 байтов 64-разрядного исполняемого файла Windows (в частности, одного из компонентов клиентского программного обеспечения BOINC):

00000000: 4d5a 9000 0300 0000 0400 0000 ffff 0000 MZ.............. 00000010: b800 0000 0000 0000 4000 0000 0000 0000 ........@....... 00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000030: 0000 0000 0000 0000 0000 0000 1801 0000 ................ 00000040: 0e1f ba0e 00b4 09cd 21b8 014c cd21 5468 ........!..L.!Th 00000050: 6973 2070 726f 6772 616d 2063 616e 6e6f is program canno 00000060: 7420 6265 2072 756e 2069 6e20 444f 5320 t be run in DOS  00000070: 6d6f 6465 2e0d 0d0a 2400 0000 0000 0000 mode....$....... 00000080: c88d b31c 8cec dd4f 8cec dd4f 8cec dd4f .......O...O...O 00000090: 8594 4e4f 9aec dd4f e39a 414f 88ec dd4f ..NO...O..AO...O 000000a0: 1fa2 454f 8eec dd4f e39a 434f 8eec dd4f ..EO...O..CO...O 000000b0: e39a 774f 9fec dd4f e39a 764f 89ec dd4f ..wO...O..vO...O 000000c0: 8594 5e4f 8dec dd4f 8594 594f 8dec dd4f ..^O...O..YO...O 000000d0: 9771 414f 85ec dd4f 8cec dc4f 14ed dd4f .qAO...O...O...O 000000e0: 9771 764f d0ec dd4f 9771 474f 8dec dd4f .qvO...O.qGO...O 000000f0: 9771 404f 8dec dd4f 5269 6368 8cec dd4f .q@O...ORich...O 00000100: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000110: 0000 0000 0000 0000 5045 0000 6486 0600 ........PE..d... 00000120: 4c88 ea5a 0000 0000 0000 0000 f000 2200 L..Z..........". 00000130: 0b02 0a00 00fe 0a00 0092 0b00 0000 0000 ................ 00000140: c0e4 0800 0010 0000 0000 0040 0100 0000 ...........@.... 00000150: 0010 0000 0002 0000 0500 0200 0000 0000 ................ 00000160: 0500 0200 0000 0000 0020 1b00 0004 0000 ......... ...... 00000170: 489f 1700 0300 4081 0000 1000 0000 0000 H.....@......... 00000180: 0010 0000 0000 0000 0000 1000 0000 0000 ................ 00000190: 0010 0000 0000 0000 0000 0000 1000 0000 ................ 000001a0: 0000 0000 0000 0000 8cc6 0e00 6801 0000 ............h... 000001b0: 0030 1400 9cd6 0600 00a0 1300 a884 0000 .0.............. 000001c0: 0094 1600 2019 0000 0010 1b00 2001 0000 .... ....... ... 000001d0: e01c 0b00 1c00 0000 0000 0000 0000 0000 ................ 000001e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 

Сначала обратите внимание на MZпервые два байта, за которыми следуют данные для программы DOS, которые сообщают вам, что ее нельзя запустить под DOS, если вы попытаетесь запустить ее там, а затем PEподпись в байтах 280 и 281. Вы также можете увидеть эти конкретные элементы в текстовом редакторе, хотя это гораздо сложнее читать.

Однако обратите внимание, что существует также реальная возможность того, что это вообще не исполняемый файл Windows, и кто-то просто дал ему неправильное имя. Windows обычно распознает что-то как 16-битный исполняемый файл и говорит, что поэтому не может его запустить.

"в самом начале будет МЗ" как ты это видишь? Шестнадцатеричный редактор? Moab 5 лет назад 0
@Moab Либо один, хотя текстовый редактор немного проще, так как он есть в каждой системе. Я обновлю свой ответ завтра с примером. Austin Hemmelgarn 5 лет назад 0
2
Wes Sayeed

Если Windows не может запустить ваше приложение, потому что оно 16-разрядное, оно сообщит вам об этом явно. Там нет необходимости угадывать.

Windows 10 сохраняет ту же политику совместимости, что и предыдущие версии; 64-разрядные версии не могут работать с 16-разрядным программным обеспечением. 32-разрядная версия может работать с 16-разрядным программным обеспечением, но, в отличие от предыдущих версий, вам потребуется добавить поддержку NTVDM через компоненты Windows.

Похожие вопросы