web-dev-qa-db-ja.com

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

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

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

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

それには何か理由がありますか、それとも私は何か間違ったことをしていますか?

16ビットの実行可能ファイルは私がAssembly-> TASMを使用してコンパイルしたもので、32/64ビットの実行可能ファイルは私のコンピューターのシステムファイルからのものでしたC:\Windows\System32

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

それらはすべてMZで始まっていることがわかりました

MZは確かに.exeファイルの特徴的な署名です。

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

ファイルは、ファイルの先頭(「マジックナンバー」)にあるASCII string "MZ"(16進数:4D 5A))で識別できます。 "MZ"はMarkZbikowskiのイニシャルです。 、MS-DOSの主要な開発者の1人。

ソース DOS MZ実行可能ファイル-ウィキペディア

このシグニチャは、後でその子孫(NEおよびPEを含む)に拡張されました。

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

ソース New Executable-ウィキペディア

Portable Executable(PE)形式は、32ビットおよび64ビットバージョンのWindowsオペレーティングシステムで使用される実行可能ファイル、オブジェクトコード、DLLなどのファイル形式です。 PE形式は、ラップされた実行可能コードを管理するためにWindowsOSローダーに必要な情報をカプセル化するデータ構造です。これには、リンク、APIエクスポートおよびインポートテーブル、リソース管理データ、スレッドローカルストレージ(TLS)データのダイナミックライブラリ参照が含まれます。 NTオペレーティングシステムでは、PE形式はEXE、DLL、SYS(デバイスドライバー)、およびその他のファイルタイプに使用されます。 Extensible Firmware Interface(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はWindowsCEで使用されるため、MIPSのいくつかのバリアントを引き続きサポートします。ARM(ARM $ ===( Thumbを含む)、およびSuperHISA。

ソース Portable Executable-ウィキペディア

したがって、MZは16、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ビットかどうかを確認する方法 、答える Austin Hemmelgarn

Unix fileコマンド(Cygwinおよび windows-subsystem-for-linux で使用可能)を使用することもできます。

例:

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またはWin3.X実行可能ファイルに何かを言うと私は信じています。

ソース 解決済み:16/32/64ビット.exeファイルを区別するためのヒントまたはツール?|テクニカルサポートガイ

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

0
DavidPostill