
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 .exe
arquivo:
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 .exe
e 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 file
comando Unix (que está disponível no Cygwin esubsistema windows para linux:
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.
O link acima também inclui o código-fonte (parece C) com o qual você pode brincar.