我讀到的每個可執行檔都以標頭 MZ 開頭

我讀到的每個可執行檔都以標頭 MZ 開頭

我最初嘗試建立一個程式來區分 DOS(16 位元)和 Windows(32/64 位元)可執行檔。

我在其他答案中讀到可執行檔可以根據前兩個位元組進行分類。 (MZ/...)

但是當我手動去比較一些可執行檔(16 和(32/64 位元))時,我發現它們都是以 MZ 開頭的。

有什麼原因或我做錯了什麼嗎?

16位元可執行檔是我在彙編中編寫的->使用TASM編譯的,32/64位元可執行檔來自我電腦的系統文件C:\Windows\System32

還有其他更準確的方法來區分可執行檔嗎?

答案1

我發現他們都是以MZ

MZ確實是文件的特徵簽名.exe

DOS MZ 可執行檔格式是 DOS 中用於 .EXE 檔案的可執行檔格式。

該檔案可以透過檔案開頭的 ASCII 字串「MZ」(十六進位:4D 5A)(「幻數」)來識別。 「MZ」是 MS-DOS 的主要開發人員之一 Mark Zbikowski 的名字縮寫。

來源DOS MZ 執行檔 - 維基百科

這個簽名後來被擴展到它的後代(包括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 也稱為分段執行檔

來源新的可執行檔 - 維基百科

可移植可執行檔 (PE) 格式是一種用於 32 位元和 64 位元版本的 Windows 作業系統中使用的可執行檔、目標碼、DLL 和其他檔案格式。 PE 格式是一種資料結構,封裝了 Windows 作業系統載入程式管理打包的可執行程式碼所需的資訊。這包括用於連結的動態庫引用、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 的多個變體。

來源可攜式可執行檔 - 維基百科

soMZ用於16、32和64位元.exe簽名,不能用來區分16和32/64位元程式。


那麼如何區分16位元和32/64位元程式呢?

Windows 多次擴展了舊的DOS 可執行文件格式,因此,如果您查看“現代”Windows 可執行文件,在開頭附近就會有一個MZ(如果可執行文件適用於使用相反位順序的系統,則可能有ZM) 。這指定了第二種 DOS 可執行格式的標頭,簡稱 MZ 格式。

除此之外,您還會看到一些明顯的亂碼,然後是「此程式無法在 DOS 模式下運作」之類的內容。那個亂碼實際上是一個非常簡單的 DOS 程序,它會列印出一條訊息來告訴用戶該程式無法在 DOS 中運行。

之後,您將獲得實際可執行檔的標頭,該標頭可能以四對字母之一(NE、LX、LE 或 PE)開頭。如果您沒有看到其中之一以及上述訊息,則它是 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 檔案的提示或工具? |技術支援人員

上面的連結還包括您可以使用的原始程式碼(看起來像 C)。

相關內容