Como verificar se um binário tem 16 bits no Windows

4

Eu tenho um arquivo .exe que não consigo executar no Windows 10. Eu suspeito que seja porque o binário é de 16 bits. Existe uma maneira simples de verificar? Algo como resposta de Alexander Revo seria ótimo.

    
por Jacob Stern 25.06.2018 / 21:05

2 respostas

7

O Windows estendeu o antigo formato executável DOS várias vezes, portanto, se você olhar para um executável moderno do Windows, logo no início haverá um MZ (ou possivelmente ZM se o executável for para um sistema que usa a ordem de bits oposta). Isto designa o cabeçalho para o formato executável DOS, conhecido simplesmente como o formato MZ.

Além disso, você verá alguns detalhes ininteligíveis, seguidos por algo como 'Este programa não pode ser executado no modo DOS'. Esse jargão é, na verdade, um programa DOS realmente simples que imprime uma mensagem para informar ao usuário que esse programa não pode ser executado no DOS.

Depois disso, você tem o cabeçalho do executável real, que pode começar com um dos quatro pares de letras, NE , LX , LE ou PE . Se você não vir uma dessas mensagens e a mencionada acima, é um aplicativo DOS de 16 bits.

NE executáveis (conhecidos como 'Novos executáveis') estão atualmente reprovados. Eles foram o primeiro 'novo' formato estendido formulário MZ e foram originalmente desenvolvidos para o Windows 1.0. Eles são sempre invariavelmente executáveis do Windows de 16 bits e foram oficialmente usados com o Windows 1.0-3.x, MS-DOS 4.0 (mas não versões posteriores), OS / 2 1.xe as versões do OS / 2 do Windows através de NT 5.0 (Windows 2000). Eles não podem ser executados nativamente no Windows de 64 bits e não exibirão corretamente um ícone de aplicativo em versões de 32 bits do Windows desde o Vista.

LX executáveis (uma das duas variedades de 'Executáveis Lineares') são executáveis de 32 bits em um formato que foi usado pelo OS / 2 2.xe mais recente e por alguns Extensores do DOS. Eles não são suportados em nenhuma versão moderna do Windows (e acho que talvez nunca tenham sido suportados, embora eu não tenha certeza).

LE executáveis (o outro tipo de 'Executável Linear') é um caso ímpar, que pode até conter tecnicamente o código de 64 bits. Eles também foram introduzidos com) S / 2 2.0 (como LX executáveis), mas foram projetados para serem usados para drivers de hardware. O modelo de driver VxD usado no Windows 3.xe 9x utilizou esse formato. Eles nunca foram usados para aplicativos de usuário e, portanto, não são suportados em versões mais novas do Windows.

PE executáveis, mais comumente conhecidos como 'Executáveis portáteis' são o formato usado pelos sistemas Windows modernos, e foram projetados para código de 32 bits (e, portanto, nunca suportaram código de 16 bits). Há também uma extensão chamada 'PE32 +', que é usada para binários do Windows de 64 bits, binários .NET CIL (que são agnósticos em largura de bits) e várias outras coisas que usam extensões diferentes (por exemplo, drivers UEFI e aplicativos, que usam uma extensão .efi , são o formato PE32 +).

Usando essas informações, você pode usar a mesma verificação geral sugerida na resposta que você vinculou em sua pergunta. Se você acabou de ver a MZ e não a mensagem curta, seguida de algumas letras e, em seguida, um dos quatro pares de letras acima dos primeiros 4kB do arquivo, é apenas um executável do DOS, caso contrário, é um desses quatro formatos. O único desses formatos que deve funcionar de forma nativa no Windows 10 é o formato PE.

Como exemplo, aqui está um hexdump dos primeiros 512 bytes de um executável do Windows de 64 bits (especificamente, um dos componentes do software cliente 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  [email protected]
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  ................

Observe primeiro o MZ nos dois primeiros bytes, seguido pelos dados do programa DOS que informa que ele não pode ser executado no DOS se você tentar executá-lo lá, seguido pela assinatura PE nos bytes 280 e 281. Você também pode ver esses elementos em particular em um editor de texto, embora seja muito mais difícil de ler.

Note, no entanto, que existe também a possibilidade muito real de não ser um executável do Windows, e alguém apenas deu o nome errado. O Windows geralmente reconhece algo como sendo um executável de 16 bits e diz que é por isso que ele não pode executá-lo.

    
por 25.06.2018 / 21:43
2

Se o Windows não puder executar seu aplicativo porque ele é de 16 bits, ele informará isso explicitamente. Não há necessidade de adivinhar.

O Windows 10 mantém a mesma política de compatibilidade que as versões anteriores tiveram; as versões de 64 bits não podem executar software de 16 bits. A versão de 32 bits pode executar software de 16 bits, mas, ao contrário das versões anteriores, você precisará adicionar suporte ao NTVDM através dos recursos do Windows.

    
por 26.06.2018 / 04:27