Cada ejecutable que leo comienza con el encabezado MZ

Cada ejecutable que leo comienza con el encabezado MZ

Inicialmente estaba intentando crear un programa para distinguir entre ejecutables de DOS (16 bits) y Windows (32/64 bits).

Leí en alguna otra respuesta que un ejecutable se puede clasificar según sus dos primeros bytes. (MZ/...)

Pero cuando fui manualmente y comparé algunos ejecutables (tanto de 16 como (32/64 bits)), descubrí que todos comenzaban con MZ.

¿Hay alguna razón para ello o estoy haciendo algo mal?

Los ejecutables de 16 bits fueron escritos por mí en ensamblador-> compilados usando TASM y los ejecutables de 32/64 bits fueron de los archivos del sistema de mi computadora.C:\Windows\System32

¿Existe alguna otra forma más precisa de distinguir un ejecutable?

Respuesta1

Descubrí que todos comenzaban conMZ

MZDe hecho, es la firma característica de un .exearchivo:

El formato ejecutable DOS MZ es el formato de archivo ejecutable utilizado para archivos .EXE en DOS.

El archivo se puede identificar por la cadena ASCII "MZ" (hexadecimal: 4D 5A) al principio del archivo (el "número mágico"). "MZ" son las iniciales de Mark Zbikowski, uno de los principales desarrolladores de MS-DOS.

FuenteEjecutable DOS MZ - Wikipedia

Esta firma se extendió posteriormente a sus descendientes (incluidos NE y PE):

El nuevo ejecutable (abreviado NE o NewEXE) es un formato de archivo .exe de 16 bits, sucesor del formato ejecutable DOS MZ. Se utilizó en Windows 1.0–3.x, MS-DOS 4.0 multitarea,[1] OS/2 1.x y el subconjunto OS/2 de Windows NT hasta la versión 5.0 (Windows 2000). Un NE también se denomina ejecutable segmentado.

FuenteNuevo ejecutable - Wikipedia

El formato Portable Executable (PE) es un formato de archivo para ejecutables, código objeto, DLL y otros utilizados en las versiones de 32 y 64 bits de los sistemas operativos Windows. El formato PE es una estructura de datos que encapsula la información necesaria para que el cargador del sistema operativo Windows administre el código ejecutable empaquetado. Esto incluye referencias de bibliotecas dinámicas para vinculación, tablas de exportación e importación de API, datos de administración de recursos y datos de almacenamiento local de subprocesos (TLS). En los sistemas operativos NT, el formato PE se utiliza para EXE, DLL, SYS (controlador de dispositivo) y otros tipos de archivos. La especificación Extensible Firmware Interface (EFI) establece que PE es el formato ejecutable estándar en entornos EFI.

En los sistemas operativos Windows NT, PE actualmente admite las arquitecturas de conjunto de instrucciones (ISA) IA-32, IA-64, x86, x86-64 (AMD64/Intel 64), ARM y ARM64. Antes de Windows 2000, Windows NT (y por lo tanto PE) admitía las ISA MIPS, Alpha y PowerPC. Debido a que PE se usa en Windows CE, continúa admitiendo varias variantes de MIPS, ARM (incluido Thumb) y SuperH ISA.

FuenteEjecutable portátil - Wikipedia

So MZse utiliza para .exefirmas de 16, 32 y 64 bits y no se puede utilizar para distinguir entre programas de 16 y 32/64 bits.


Entonces, ¿cómo distingo entre programas de 16 y 32/64 bits?

Windows ha extendido el antiguo formato ejecutable de DOS varias veces, por lo que si observa un ejecutable de Windows "moderno", justo al principio habrá un MZ (o posiblemente ZM si el ejecutable es para un sistema que usa el orden de bits opuesto). . Esto designa el encabezado para el segundo formato ejecutable de DOS, conocido simplemente como formato MZ.

Más allá de eso, verá algunas tonterías aparentes, seguidas de algo como "Este programa no se puede ejecutar en modo DOS". Ese galimatías es en realidad un programa de DOS realmente simple que imprime un mensaje para decirle al usuario que ese programa no se puede ejecutar en DOS.

Después de eso, tiene el encabezado del ejecutable real, que puede comenzar con uno de los cuatro pares de letras: NE, LX, LE o PE. Si no ve ninguno de estos ni el mensaje mencionado anteriormente, es una aplicación DOS de 16 bits.

FuenteCómo comprobar si un binario es de 16 bits en Windows, respuesta porAustin Hemmelgarn

También puede utilizar el filecomando Unix (que está disponible en Cygwin y:

Ejemplo:

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

Creo que cuando es un ejecutable de 16 bits dice algo del tipo de ejecutable de MS-DOS o Win 3.X.

FuenteResuelto: ¿Consejo o herramienta para distinguir archivos .exe de 16/32/64 bits? | Chico de soporte técnico

El enlace de arriba también incluye el código fuente (parece C) con el que puedes jugar.

información relacionada