私が読んだすべての実行ファイルは、MZ ヘッダーで始まります

私が読んだすべての実行ファイルは、MZ ヘッダーで始まります

当初は、DOS (16 ビット) と Windows (32/64 ビット) の実行ファイルを区別するプログラムを作成しようとしていました。

他の回答で、実行可能ファイルは最初の 2 バイトに基づいて分類できると読みました。(MZ/...)

しかし、手動でいくつかの実行可能ファイル (16 ビットと (32/64 ビット) の両方) を比較したところ、すべてが MZ で始まっていることがわかりました。

何か理由があるのでしょうか、それとも私が何か間違っているのでしょうか?

16ビットの実行ファイルは私がアセンブリで書き、TASMを使用してコンパイルしました。32/64ビットの実行ファイルは私のコンピュータのシステムファイルから作成されました。C:\Windows\System32

実行可能ファイルを区別するより正確な方法は他にありますか?

答え1

それらはすべてMZ

MZまさにファイルの特徴的な署名です.exe

DOS MZ 実行可能形式は、DOS の .EXE ファイルに使用される実行可能ファイル形式です。

ファイルは、ファイルの先頭にある ASCII 文字列「MZ」(16 進数: 4D 5A) (「マジック ナンバー」) によって識別できます。「MZ」は、MS-DOS の主要な開発者の 1 人である Mark Zbikowski の頭文字です。

ソースDOS MZ 実行ファイル - Wikipedia

この署名は後にその子孫(NE および PE を含む)に拡張されました。

New Executable(略称NEまたはNewEXE)は、16ビットの.exeファイル形式で、DOS MZ実行可能形式の後継です。Windows 1.0~3.x、マルチタスクMS-DOS 4.0、[1] OS/2 1.x、およびWindows NTのOS/2サブセットのバージョン5.0(Windows 2000)まで使用されました。NEはセグメント化実行可能ファイルとも呼ばれます。

ソース新しい実行ファイル - Wikipedia

ポータブル実行可能 (PE) 形式は、32 ビット版および 64 ビット版の Windows オペレーティング システムで使用される実行可能ファイル、オブジェクト コード、DLL などのファイル形式です。PE 形式は、Windows OS ローダーがラップされた実行可能コードを管理するために必要な情報をカプセル化するデータ構造です。これには、リンク用の動的ライブラリ参照、API エクスポートおよびインポート テーブル、リソース管理データ、およびスレッド ローカル ストレージ (TLS) データが含まれます。NT オペレーティング システムでは、PE 形式は EXE、DLL、SYS (デバイス ドライバー)、およびその他のファイル タイプに使用されます。拡張ファームウェア インターフェイス (EFI) 仕様では、PE が EFI 環境の標準実行可能形式であると規定されています。

Windows NT オペレーティング システムでは、PE は現在、IA-32、IA-64、x86、x86-64 (AMD64/Intel 64)、ARM、および ARM64 命令セット アーキテクチャ (ISA) をサポートしています。Windows 2000 より前の Windows NT (および PE) は、MIPS、Alpha、および PowerPC ISA をサポートしていました。PE は Windows CE で使用されるため、MIPS、ARM (Thumb を含む)、および SuperH ISA の複数のバリアントを引き続きサポートします。

ソースポータブル実行ファイル - Wikipedia

これはMZ16 ビット、32 ビット、64 ビットの.exe署名に使用され、16 ビット プログラムと 32/64 ビット プログラムを区別するために使用することはできません。


では、16 ビット プログラムと 32/64 ビット プログラムをどのように区別すればよいのでしょうか?

Windows は古い DOS 実行可能形式を何度も拡張しているため、「最新の」Windows 実行可能ファイルを見ると、先頭近くに MZ (または、反対のビット順序を使用するシステムの実行可能ファイルの場合は ZM) があります。これは、単に MZ 形式と呼ばれる 2 番目の DOS 実行可能形式のヘッダーを指定します。

その先では、意味不明な文字列が表示され、その後に「このプログラムは DOS モードでは実行できません」のようなメッセージが表示されます。この意味不明な文字列は、実際には非常に単純な DOS プログラムであり、ユーザーにそのプログラムは DOS では実行できないことを通知するメッセージを表示します。

その後に、実際の実行ファイルのヘッダーがあります。これは、NE、LX、LE、または PE の 4 つの文字のペアのいずれかで始まる場合があります。これらのいずれかが表示されず、上記のメッセージも表示されない場合は、16 ビット DOS アプリケーションです。

ソースWindows でバイナリが 16 ビットかどうかを確認する方法、回答者オースティン・ヘメルガーン

Unixfileコマンド(Cygwinおよび:

例:

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

16 ビット実行可能ファイルの場合、MS-DOS または Win 3.X 実行可能ファイルのようなものになると思います。

ソース解決済み: 16/32/64 ビットの .exe ファイルを区別するためのヒントまたはツールはありますか? | Tech Support Guy

上記のリンクには、実際に試すことができるソース コード (C のような) も含まれています。

関連情報