題 如何在Windows上檢查二進製文件是32位還是64位?


是否有一種簡單的方法可以檢查Windows上的二進製文件是32位還是64位?在將程序移動到32位機器並遇到嚴重故障之前,我需要檢查一下。


264
2017-11-17 10:29


起源


這個問題很相似但是,它需要一些工作來檢查它。 - ST3
@Guillaume:可執行圖像不是進程。任務管理器僅顯示進程。 - IInspectable
如何確定我安裝的應用程序是32位還是64位? - phuclv


答案:


檢查標頭值後 理查德的回答,我想出了一個快速,簡單,只需要文本編輯器的解決方案。即使是Windows的默認notepad.exe也能正常工作。

  1. 在文本編輯器中打開可執行文件您可能需要拖放或使用 編輯的 Open... 對話框,因為Windows沒有顯示 Open with... 可執行文件的上下文菜單中的選項。

  2. 在第一次出現後檢查第一個可打印字符 PE。這個部分最有可能被至少一些空白包圍(可能很多),所以它可以很容易地在視覺上完成。

以下是您要找到的內容:

86:

PE  L

64位:

PE  d†

一句警告: 在大文件上使用默認記事本可能會非常慢,因此最好不要將其用於大於兆字節或更少的文件。在我的情況下花了大約30秒來顯示12 MiB文件。但是,Notepad ++幾乎可以立即顯示120 MiB可執行文件。

如果您需要檢查計算機上的文件而無法安裝任何其他軟件,則此解決方案可能很有用。

附加信息:

如果您有可用的HEX-Editor,則PE Signature的偏移位於偏移處 0x3C。簽名是 PE\0\0 (字母“P”和“E”後跟兩個空字節),後跟Little Endian中的兩字節機器類型。

相關的價值觀是 0x8664 對於x64可執行文件和 0x14c 對於x86。有更多可能的值,但您可能不會遇到任何這些,或者能夠在Windows PC上運行此類可執行文件。

可以在以下位置找到完整的機器類型列表以及其餘的.exe規範 Microsoft PE和COFF規範  機器類型 部分。


277
2018-03-13 17:08



嘿,這相當hacky。並且為了更好,因為這實際上似乎是絕大多數情況下最快和最簡單的解決方案:) - Septagram
記事本擊敗記事本++的罕見情況。記事本顯示這是正確的,在記事本中你已經搞亂編碼,讓它顯示,但它的工作! - zar
@CoDEmanX此選項意味著IDE或JIT為您做出選擇。看到 這個問題 或這個 博客文章 更多細節。 - Alexander Revo
@IInspectable如果你真的打擾閱讀整個帖子,你可能會看到鏈接到 Microsoft PE and COFF Specification,這是一個盡可能多的文件合同,以及如何找到任何PE頭的確切地址的說明 .exe文件。如果你有比微軟自己的可執行格式的官方規範更可靠的來源,我很想知道那是什麼。 - Alexander Revo
對於以“MZ”開頭的文件,您需要進一步了解。我在偏移量0x110處找到了PE..L,就在“RichMQ _ms”之後。 - jnnnnn


SDK工具 dumpbin.exe 隨著 /headers 選項包含此信息,比較這兩個(我為關鍵信息添加了粗體)

PS [64] E:\#4> dumpbin / headers C:\ Windows \ system32 \ cmd.exe
Microsoft(R)COFF / PE Dumper版本10.00.40219.01
版權所有(C)Microsoft Corporation。版權所有。


轉儲文件C:\ Windows \ system32 \ cmd.exe

發現PE簽名

文件類型:EXECUTABLE IMAGE

文件標題值
             8664機器(x64)
               6個部分
        4CE798E5時間日期標記2010年11月20日星期六09:46:13
               0指向符號表的文件指針
               0個符號
              F0大小的可選標題
              22個特點
                   可執行文件
                   應用程序可以處理大(> 2GB)地址
[...]

PS [64] E:\#5> dumpbin / headers C:\ Windows \ syswow64 \ cmd.exe
Microsoft(R)COFF / PE Dumper版本10.00.40219.01
版權所有(C)Microsoft Corporation。版權所有。


轉儲文件C:\ Windows \ syswow64 \ cmd.exe

發現PE簽名

文件類型:EXECUTABLE IMAGE

文件標題值
              14C機器(x86)
               4個部分
        4CE78E2B時間日期標記2010年11月20日09:00:27
               0指向符號表的文件指針
               0個符號
              E0大小的可選標題
             102個特點
                   可執行文件
                   32位字機
[...]

112
2017-11-17 12:14



您還可以看到(IA64)64位Itanium exe。 - Darryl Braaten
當我在超級用戶的其他地方閱讀時,使用 dumpbin /headers | findstr "machine" 大大簡化了質量保證尋求的陳述...... - user1055604
Dumpbin.exe位於: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin - Devid
@David:不一定(不同版本的VS,不使用默認安裝位置,使用Windows SDK中的版本):這就是我沒有指定的原因。 - Richard
如果從visual studio命令行啟動dumpbin,最簡單的方法是使用dumpbin: stackoverflow.com/a/477389/1390430 - Ben


如果您沒有或不想要整個Windows SDK或Visual Studio,則可以使用 sigcheck.exe 來自SysInternals

sigcheck.exe C:\Windows\Notepad.exe

輸出:

Sigcheck v2.1 - File version and signature viewer
Copyright (C) 2004-2014 Mark Russinovich
Sysinternals - www.sysinternals.com

c:\windows\notepad.exe:
    Verified:       Signed
    Signing date:   8:59 AM 8/22/2013
    Publisher:      Microsoft Windows
    Description:    Notepad
    Product:        Microsoft« Windows« Operating System
    Prod version:   6.3.9600.16384
    File version:   6.3.9600.16384 (winblue_rtm.130821-1623)
    MachineType:    64-bit

41
2017-09-06 15:02



似乎並不總是準確:嘗試使用它與LinqPad.exe(AnyCPU-64bit版本)和Sigcheck會告訴你它是“32位”... - Matt
@Matt很有意思。 LinqPad聽起來像一個.net應用程序;我想知道sigcheck是否只能在本機可執行文件上正常工作(為此目的)。 - briantist
是的,它是一個.NET應用程序。在.NET中,如果未預編譯,則可以定位“x86”或“AnyCPU”。 “x86”將始終以32位運行,但AnyCPU將在64位系統上以64位運行,但在32位系統上以32位運行。 SigCheck應該考慮這個並至少顯示“.NET 32位或64位(AnyCPU)”。例如,ILSpy在這種情況下說“架構:AnyCPU(64位首選)” - 但ILSpy不適用於非.NET EXE。 - Matt
可能就是這種情況,就像舊的“MZ”標題一樣,非Windows(“DOS”)操作系統說“此應用程序需要Microsoft Windows”...... ;-) - Matt
是的,過去很好的時候,你在shell中有一個DOS調試器並且可以反彙編代碼(它只包含一個打印此消息的單個DOS調用)...並將文本替換為“答案是42”。 :-D - Matt


我可以確認一下 file 實用程序(例如來自cygwin)將區分32位和64位可執行文件。它們如下所示:

32.exe: PE32 executable (GUI) Intel 80386, for MS Windows
64.exe: PE32+ executable (console) x86-64, for MS Windows

正如你所看到的,很明顯哪個是哪個。此外,它區分了控制台和GUI可執行文件,也是明顯的哪個。


33
2018-01-17 02:08



這個解決方案通常適用於已安裝msysgit的任何開發人員。 - FrontierPsycho
為什麼Windows中的可執行文件有 MZ 代替 PE? - Mohammadreza Panahi


一個簡單的方法是運行它(假設您信任它)並查看任務管理器中的進程選項卡。 32位進程將在進程名稱的末尾顯示“* 32”。如果您不願意在計算機上運行,可以試試 EXE Explorer。它將顯示有關可執行文件的大量信息,包括它是32位還是64位。


30
2017-11-17 10:39



不幸的是,這需要您運行可執行文件。也許您需要檢查程序的體系結構,作為其運行原因的故障排除方法。 - Mike Christiansen
怎麼做 您 運行DLL? - user34660
@ user34660 RUNDLL32.EXE <dllname>,<entrypoint> - samsara
@samusarin應該在崗位上。 - user34660
@ user34660你在技術上是正確的,DLL沒有 main 入口點等不會作為一個獨立的過程執行。加載時調用初始化函數,但不是“main”。 - samsara


很多人都很優秀 7拉鍊 已安裝,並已將7-Zip文件夾添加到其中 PATH。 7-zip可識別ZIP和RAR以外的文件格式,例如MSI文件和PE可執行文件。只需使用命令行 7z.exe 在有問題的PE文件(Exe或DLL)上:

7z l some.exe | more
7z l some.exe | findstr CPU

輸出將包括以下行,其中包括 CPU 讀行也是 x86 要么 x64這是在這裡問的問題:

Path = C:\Extra\AV\neroAacEnc.exe
Type = PE
CPU = x86
Characteristics = Executable 32-bit

Path = C:\Extra\AV\LAME\lame_enc.dll
Type = PE
CPU = x86
Characteristics = Executable DLL 32-bit

Path = C:\Extra\AV\FFmpeg\bin\ffmpeg.exe
Type = PE
CPU = x64
64-bit = +
Characteristics = Executable LargeAddress NoRelocs NoLineNums NoLocalSyms NoDebugInfo

Path = C:\Extra\AV\FFmpeg\bin\avcodec-56.dll
Type = PE
CPU = x64
64-bit = +
Characteristics = Executable DLL LargeAddress NoLineNums NoLocalSyms NoDebugInfo

21
2017-10-04 10:56



哇我從來不知道7z可以做到這一點。可能它包含一個 file 實施裡面? - phuclv


64位版本的 Process Explorer 可以告訴你。只需運行可執行文件並打開進程的屬性窗口即可。在主選項卡上有一個條目,表示“圖像:32位”或“圖像:64位”。

enter image description here


18
2017-11-17 13:36



Simply run the executable 如果你不想要怎麼辦? 跑 該程序? - Synetech
@Synetech原始問題並不意味著就是這種情況。 - Andrew Lambert
對我來說這是最簡單的方法,除非可執行文件退出太快。 - starbeamrainbowlabs
怎麼做 您 運行DLL? - user34660


最簡單的方法 (當數據不保密時)

我發現 Virustotal  File detail 找出二進制是32位還是64位的最簡單方法。

Additional information 選項還提供了有關該文件的許多有用信息。

Virustotal analysis


[Virustotal TrID


14
2018-01-05 16:53