
Ich habe zunächst versucht, ein Programm zu erstellen, um zwischen ausführbaren Dateien unter DOS (16 Bit) und Windows (32/64 Bit) zu unterscheiden.
Ich habe in einer anderen Antwort gelesen, dass eine ausführbare Datei anhand ihrer ersten beiden Bytes klassifiziert werden kann. (MZ/...)
Aber als ich manuell ein paar ausführbare Dateien (sowohl 16 als auch (32/64 Bit)) verglich, stellte ich fest, dass sie alle mit MZ begannen.
Gibt es dafür einen Grund oder mache ich etwas falsch?
Die 16-Bit-Programme wurden von mir in Assembler geschrieben und mit TASM kompiliert. Die 32/64-Bit-Programme stammen aus den Systemdateien meines Computers.C:\Windows\System32
Gibt es eine andere, genauere Möglichkeit, eine ausführbare Datei zu unterscheiden?
Antwort1
Ich fand heraus, dass sie alle begannen mitMZ
MZ
ist in der Tat die charakteristische Signatur einer .exe
Datei:
Das ausführbare DOS-MZ-Format ist das ausführbare Dateiformat, das für EXE-Dateien in DOS verwendet wird.
Die Datei kann durch die ASCII-Zeichenfolge „MZ“ (hexadezimal: 4D 5A) am Anfang der Datei (die „magische Zahl“) identifiziert werden. „MZ“ sind die Initialen von Mark Zbikowski, einem der führenden Entwickler von MS-DOS.
QuelleAusführbare DOS-MZ-Datei – Wikipedia
Diese Signatur wurde später auf ihre Nachkommen (einschließlich NE und PE) erweitert:
New Executable (abgekürzt NE oder NewEXE) ist ein 16-Bit-.exe-Dateiformat, ein Nachfolger des DOS MZ-Ausführungsformats. Es wurde in Windows 1.0–3.x, Multitasking MS-DOS 4.0,[1] OS/2 1.x und der OS/2-Untermenge von Windows NT bis Version 5.0 (Windows 2000) verwendet. Ein NE wird auch segmentierte ausführbare Datei genannt.
QuelleNeue ausführbare Datei – Wikipedia
Das Portable Executable (PE)-Format ist ein Dateiformat für ausführbare Dateien, Objektcode, DLLs und andere, das in 32-Bit- und 64-Bit-Versionen von Windows-Betriebssystemen verwendet wird. Das PE-Format ist eine Datenstruktur, die die Informationen kapselt, die der Windows OS Loader benötigt, um den verpackten ausführbaren Code zu verwalten. Dazu gehören dynamische Bibliotheksverweise zum Verknüpfen, API-Export- und Importtabellen, Ressourcenverwaltungsdaten und Thread-Local-Storage-Daten (TLS). Unter NT-Betriebssystemen wird das PE-Format für EXE, DLL, SYS (Gerätetreiber) und andere Dateitypen verwendet. Die Extensible Firmware Interface (EFI)-Spezifikation besagt, dass PE das standardmäßige ausführbare Format in EFI-Umgebungen ist.
Unter Windows NT-Betriebssystemen unterstützt PE derzeit die Befehlssatzarchitekturen (ISAs) IA-32, IA-64, x86, x86-64 (AMD64/Intel 64), ARM und ARM64. Vor Windows 2000 unterstützte Windows NT (und damit auch PE) die ISAs MIPS, Alpha und PowerPC. Da PE unter Windows CE verwendet wird, unterstützt es weiterhin mehrere Varianten der ISAs MIPS, ARM (einschließlich Thumb) und SuperH.
QuellePortable ausführbare Datei – Wikipedia
Wird also MZ
für 16-, 32- und 64-Bit- .exe
Signaturen verwendet und kann nicht zur Unterscheidung zwischen 16- und 32/64-Bit-Programmen verwendet werden.
Wie unterscheide ich also zwischen 16- und 32/64-Bit-Programmen?
Windows hat das alte DOS-Ausführungsformat mehrfach erweitert. Wenn Sie sich also eine „moderne“ Windows-Ausführungsdatei ansehen, finden Sie gleich am Anfang ein MZ (oder möglicherweise ZM, wenn die Ausführungsdatei für ein System mit umgekehrter Bitreihenfolge bestimmt ist). Dies bezeichnet den Header für das zweite DOS-Ausführungsformat, das einfach als MZ-Format bezeichnet wird.
Darüber hinaus werden Sie offensichtliches Kauderwelsch sehen, gefolgt von etwas in der Art von „Dieses Programm kann nicht im DOS-Modus ausgeführt werden.“ Dieses Kauderwelsch ist eigentlich ein ganz einfaches DOS-Programm, das eine Meldung ausgibt, um dem Benutzer mitzuteilen, dass dieses Programm nicht unter DOS ausgeführt werden kann.
Danach folgt der Header für die eigentliche ausführbare Datei, der mit einem der vier Buchstabenpaare NE, LX, LE oder PE beginnen kann. Wenn Sie weder eines dieser Buchstaben noch die oben genannte Meldung sehen, handelt es sich um eine 16-Bit-DOS-Anwendung.
QuelleSo prüfen Sie, ob eine Binärdatei unter Windows 16 Bit ist, Antwort vonAustin Hemmelgarn
Sie können auch den Unix-Befehl verwenden file
(der in Cygwin verfügbar ist undWindows-Subsystem für Linux:
Beispiel:
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
Ich glaube, wenn es sich um eine ausführbare 16-Bit-Datei handelt, sagt das etwas über die Art ausführbarer MS-DOS- oder Win 3.X-Dateien aus.
QuelleGelöst: Tipp oder Tool zum Unterscheiden von 16/32/64-Bit-EXE-Dateien? | Tech Support Guy
Der obige Link enthält auch Quellcode (sieht aus wie C), mit dem Sie spielen können.