Cada executável que leio começa com o cabeçalho MZ

Cada executável que leio começa com o cabeçalho MZ

Inicialmente, eu estava tentando criar um programa para distinguir entre executáveis ​​​​DOS (16 bits) e Windows (32/64 bits).

Li em outra resposta que um executável pode ser classificado com base nos dois primeiros bytes. (MZ/...)

Mas quando comparei manualmente alguns executáveis ​​(16 e (32/64 bits)), descobri que todos começaram com MZ.

Existe alguma razão para isso ou estou fazendo algo errado?

Os executáveis ​​de 16 bits foram escritos por mim em assembly-> compilados usando TASM e os executáveis ​​de 32/64 bits vieram dos arquivos de sistema do meu computadorC:\Windows\System32

Existe alguma outra maneira mais precisa de distinguir um executável?

Responder1

Eu descobri que todos eles começaram comMZ

MZé de fato a assinatura característica de um .exearquivo:

O formato executável DOS MZ é o formato de arquivo executável usado para arquivos .EXE no DOS.

O arquivo pode ser identificado pela string ASCII "MZ" (hexadecimal: 4D 5A) no início do arquivo (o "número mágico"). "MZ" são as iniciais de Mark Zbikowski, um dos principais desenvolvedores do MS-DOS.

FonteExecutável DOS MZ - Wikipédia

Esta assinatura foi posteriormente estendida aos seus descendentes (incluindo NE e PE):

O Novo Executável (abreviado NE ou NewEXE) é um formato de arquivo .exe de 16 bits, um sucessor do formato executável DOS MZ. Foi usado no Windows 1.0–3.x, multitarefa MS-DOS 4.0,[1] OS/2 1.x e no subconjunto OS/2 do Windows NT até a versão 5.0 (Windows 2000). Um NE também é chamado de executável segmentado

FonteNovo executável - Wikipedia

O formato Portable Executable (PE) é um formato de arquivo para executáveis, código objeto, DLLs e outros usados ​​nas versões de 32 e 64 bits dos sistemas operacionais Windows. O formato PE é uma estrutura de dados que encapsula as informações necessárias para que o carregador do sistema operacional Windows gerencie o código executável empacotado. Isso inclui referências de biblioteca dinâmica para vinculação, tabelas de exportação e importação de API, dados de gerenciamento de recursos e dados de armazenamento local de thread (TLS). Nos sistemas operacionais NT, o formato PE é usado para EXE, DLL, SYS (driver de dispositivo) e outros tipos de arquivo. A especificação Extensible Firmware Interface (EFI) afirma que PE é o formato executável padrão em ambientes EFI.

Nos sistemas operacionais Windows NT, o PE atualmente suporta as arquiteturas de conjunto de instruções (ISAs) IA-32, IA-64, x86, x86-64 (AMD64/Intel 64), ARM e ARM64. Antes do Windows 2000, o Windows NT (e, portanto, PE) suportava os ISAs MIPS, Alpha e PowerPC. Como o PE é usado no Windows CE, ele continua a oferecer suporte a diversas variantes dos ISAs MIPS, ARM (incluindo Thumb) e SuperH.

FonteExecutável portátil - Wikipedia

So MZé usado para assinaturas de 16, 32 e 64 bits .exee não pode ser usado para distinguir entre programas de 16 e 32/64 bits.


Então, como faço para distinguir entre programas de 16 e 32/64 bits?

O Windows estendeu o antigo formato executável do DOS várias vezes, então 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 do segundo formato executável do DOS, conhecido simplesmente como formato MZ.

Além disso, você verá algum jargão aparente, seguido por algo como 'Este programa não pode ser executado no modo DOS.'. Esse jargão é na verdade um programa DOS muito simples que imprime uma mensagem para informar ao usuário que aquele programa não pode ser executado em DOS.

Depois disso, você terá 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 mensagem mencionada acima, é um aplicativo DOS de 16 bits.

FonteComo verificar se um binário é de 16 bits no Windows, responda porAustin Hemmelgarn

Você também pode usar o filecomando Unix (que está disponível no Cygwin e:

Exemplo:

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

Acredito que quando é um executável de 16 bits, ele diz algo semelhante ao executável do MS-DOS ou Win 3.X.

FonteResolvido: dica ou ferramenta para distinguir arquivos .exe de 16/32/64 bits? | Cara de suporte técnico

O link acima também inclui o código-fonte (parece C) com o qual você pode brincar.

informação relacionada