Question Comment vérifier si un binaire est 16 bits sous Windows


j'ai un .exe fichier que je ne peux pas exécuter sur Windows 10. Je pense que c'est parce que le binaire est 16 bits. Existe-t-il un moyen simple de vérifier? Quelque chose comme La réponse d'Alexander Revo serait génial.


4
2018-06-25 19:05


origine




Réponses:


Windows a étendu l’ancien format d’exécutable DOS à plusieurs reprises, donc si vous regardez un exécutable Windows «moderne», il y aura un MZ (ou éventuellement ZM si l'exécutable est pour un système qui utilise l'ordre des bits opposés). Cela désigne l'en-tête du seconde Format exécutable DOS, connu simplement sous le format MZ.

Au-delà de cela, vous verrez un charabia apparent, suivi de quelque chose comme «Ce programme ne peut pas être exécuté en mode DOS». Ce charabia est en réalité un programme DOS très simple qui imprime un message pour indiquer à l'utilisateur que ce programme ne peut pas être exécuté sous DOS.

Après cela, vous avez l'en-tête de l'exécutable réel, qui peut commencer par l'une des quatre paires de lettres, NE, LX, LE, ou PE. Si vous ne voyez pas l'un de ces messages et le message mentionné ci-dessus, il s'agit d'une application DOS 16 bits.

NE les exécutables (appelés «nouveaux exécutables») sont actuellement obsolètes. Ils étaient le premier «nouveau» format au format MZ, et ont été initialement développés pour Windows 1.0. Ils sont toujours des exécutables Windows 16 bits invariablement, et ont été officiellement utilisés avec Windows 1.0-3.x, MS-DOS 4.0 (mais pas les versions ultérieures), OS / 2 1.x et les versions OS / 2 de Windows jusqu'à NT 5.0 (Windows 2000). Celles-ci ne peuvent pas être exécutées en mode natif sur Windows 64 bits et n’afficheront pas correctement une icône d’application sur les versions 32 bits de Windows depuis Vista.

LX Les exécutables (une des deux variétés de «Linear Executables») sont des exécutables 32 bits dans un format utilisé par OS / 2 2.x et plus récents, ainsi que par certains extenseurs DOS. Ceux-ci ne sont pris en charge par aucune version moderne de Windows (et je pense qu'ils n'ont peut-être jamais été supportés, même si je ne suis pas sûr).

LE les exécutables (l'autre type de «Linear Executable») sont un cas impair, qui peut même contenir techniquement du code 64 bits. Ils ont également été introduits avec) S / 2 2.0 (tout comme LX exécutables), mais ont été conçus pour être utilisés avec des pilotes de matériel. Le modèle de pilote VxD utilisé sous Windows 3.x et 9x utilisait ce format. Ils n'ont jamais été utilisés pour des applications utilisateur et ne sont donc pas du tout pris en charge par les nouvelles versions de Windows.

PE Les exécutables, plus connus sous le nom de «exécutables portables», sont le format utilisé par les systèmes Windows modernes et ont été conçus pour du code 32 bits (et donc jamais pris en charge par du code 16 bits). Il existe également une extension appelée «PE32 +», qui est utilisée pour les fichiers binaires Windows 64 bits, les fichiers binaires .NET CIL (qui sont indépendants de la largeur du bit) et un certain nombre d’autres extensions qui utilisent des extensions applications, qui utilisent un .efi extension, sont au format PE32 +).

En utilisant ces informations, vous pouvez utiliser la même vérification générale suggérée dans la réponse à laquelle vous avez lié votre question. Si vous voyez juste le MZet pas le court message suivi d'un charabia et de l'une des quatre paires de lettres ci-dessus dans les 4 premiers Ko du fichier, ce n'est qu'un exécutable DOS, sinon c'est l'un de ces quatre formats. Le seul des formats qui devrait fonctionner en mode natif sous Windows 10 est le format PE.

A titre d'exemple, voici un hexdump des 512 premiers octets d'un exécutable Windows 64 bits (en particulier, l'un des composants du logiciel client 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  ................

Remarquez d'abord le MZ dans les deux premiers octets, suivis par les données du programme DOS qui vous indiquent qu'il ne peut pas être exécuté sous DOS si vous essayez de l'exécuter, suivi du PE signature dans les octets 280 et 281. Vous pouvez également voir ces éléments particuliers dans un éditeur de texte, mais il est beaucoup plus difficile à lire.

Notez toutefois qu'il existe une possibilité très réelle qu'il ne s'agisse pas d'un exécutable Windows, et que quelqu'un lui a simplement donné un nom erroné. Windows reconnaîtra généralement quelque chose comme étant un exécutable 16 bits et dit que c'est la raison pour laquelle il ne peut pas l'exécuter.


7
2018-06-25 19:43



"juste au début il y aura un MZ" comment voyez-vous cela? Éditeur Hex? - Moab
@Moab L'un ou l'autre, bien qu'un éditeur de texte soit un peu plus facile car chaque système en a un. Je mettrai à jour ma réponse demain avec un exemple. - Austin Hemmelgarn


Si Windows ne peut pas exécuter votre application car elle est 16 bits, cela vous le dira explicitement. Il n'y a pas besoin de deviner.

Windows 10 conserve la même politique de compatibilité que les versions précédentes. les versions 64 bits ne peuvent pas exécuter de logiciel 16 bits. La version 32 bits peut exécuter un logiciel 16 bits, mais contrairement aux versions précédentes, vous devrez ajouter la prise en charge de NTVDM via les fonctionnalités Windows.


2
2018-06-26 02:27