如何在Windows上检查二进制文件是32位还是64位?


319

有没有一种简单的方法来检查Windows上的二进制文件是32位还是64位?在将程序移至32位计算机上并遇到严重故障之前,我需要进行检查。


这个问题是相似的,但是需要一些工作来检查它。
ST3

3
@Guillaume:可执行映像不是进程。任务管理器仅显示进程。
IInspectable

Answers:


346

在检查了Richard的答案中的标头值之后,我想出了一个快速,简单且只需要文本编辑器的解决方案。甚至Windows的默认notepad.exe也可以使用。

  1. 在文本编辑器中打开可执行文件。您可能必须拖放或使用编辑器的Open...对话框,因为Windows不在Open with...上下文菜单中显示可执行文件的选项。

  2. 第一次出现后检查第一个可打印字符PE。该部分最有可能被至少一些空白(可能很多)包围,因此可以很容易地在视觉上完成。

这是您将要找到的:

x86:

PE  L

x64:

PE  d†

一个警告:在大文件上使用默认记事本可能会非常慢,因此最好不要将其用于大于或小于1 MB的文件。以我为例,大约需要30秒才能显示12 MiB文件。但是,Notepad ++几乎可以立即显示120 MiB可执行文件。

如果您需要在无法安装任何其他软件的计算机上检查文件,此解决方案可能很有用。

附加信息:

如果您有可用的十六进制编辑器,则PE签名的偏移量位于offset处0x3C。签名是PE\0\0(字母“ P”和“ E”,后跟两个空字节),后跟两个字节的Little Endian机器类型。

相关值适用0x8664于x64可执行文件和0x14cx86。还有更多可能的值,但您可能永远不会遇到这些值,也无法在Windows PC上运行此类可执行文件。

可以在Microsoft PE和COFF规范 机器类型部分中找到机器类型的完整列表以及其余的.exe规范。


21
嘿,这很hacky。而且更好的是,因为对于大多数情况,这实际上是最快,最简单的解决方案:)
Septagram 2015年

4
记事本击败notepad ++的罕见实例。记事本显示了此权利,在记事本中,您可能会乱七八糟地进行编码以使其显示,但它确实起作用了!
zar 2015年

2
@CoDEmanX此选项意味着IDE或JIT为您做出选择。有关更多详细信息,请参见此问题或此博客文章
亚历山大·雷沃

2
@IInspectable,如果您实际上不愿意在否决整个文章之前先阅读整个文章,那么您会看到到的链接Microsoft PE and COFF Specification,这是一份尽可能多的书面合同,以及有关如何查找PE标头确切地址的说明在任何.exe文件中。如果您有比Microsoft官方规范更可靠的来源(关于Microsoft自己的可执行格式),我想知道这是什么。
亚历山大·雷沃

6
对于以“ MZ”开头的文件,您需要再看一些。我在“ RichMQ _........”之后找到了偏移量为0x110的PE..L。
jnnnnn

120

dumpbin.exe带有该/headers选项的SDK工具包含此信息,请将两者进行比较(我为关键信息添加了粗体)

PS [64] E:\#4> dumpbin / headers C:\ Windows \ system32 \ cmd.exe
Microsoft(R)COFF / PE自卸车版本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自卸车版本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位字机
[...]

1
您还可以看到(IA64)64位Itanium exe。
Darryl Braaten

21
正如我在超级用户上的其他文章中所读到的,使用dumpbin /headers | findstr "machine"大大简化了质量检查所要查找的内容...
user1055604 2013年

3
Dumpbin.exe位于这里:C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
Devid 2014年

3
@David:不一定(不同版本的VS,不使用默认安装位置,使用Windows SDK中的版本):这就是为什么我没有指定。
理查德

6
如果从Visual Studio命令行启动dumpbin,最简单的方法是使用它:stackoverflow.com/a/477389/1390430
2015年

46

如果您没有或不需要整个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

4
似乎并不总是准确:尝试与LinqPad.exe(AnyCPU-64bit版本)一起使用,Sigcheck会告诉您它是“ 32位” ...
Matt

@马特有趣。LinqPad听起来像一个.net应用;我想知道sigcheck是否仅能在本机可执行文件上正常工作(为此)。
briantist

2
是的,它是一个.NET应用程序。在.NET中,如果未预编译,则可以定位“ x86”或“ AnyCPU”。“ x86”将始终以32位运行,但是AnyCPU将在64位系统上以64位运行,但在32位系统上将以32位运行。SigCheck应该考虑这一点,并至少显示“ .NET 32位或64位(AnyCPU)”。例如,在这种情况下,ILSpy会说“体系结构:AnyCPU(首选64位)”-但ILSpy将不适用于非.NET EXE。
马特

1
情况可能就是这样,就像旧的“ MZ”标头(在非Windows(DOS))操作系统上显示“此应用程序需要Microsoft Windows” ... ;-)
Matt

2
是的,过去很不错,在外壳中有一个DOS调试器,可以反汇编代码(该代码只包含一个打印此消息的DOS调用)...然后将文本替换为“答案是42”。:-D
马特

38

我可以确认该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可执行文件,这也是显而易见的。


1
对于已安装msysgit的所有开发人员来说,该解决方案都是非常普遍的。
FrontierPsycho

为什么Windows中的可执行文件具有MZ而不是PE
BattleTested

值得注意的是,如果您不需要Cygwin,则可以将GNU实用程序作为单独的二进制文件获得。gnuwin32.sourceforge.net/packages/file.htm
MJ Walsh,

32

一种简单的方法是运行它(假设您信任它)并查看任务管理器中的“进程”选项卡。32位进程将在进程名称的末尾显示“ * 32”。如果不是您希望在计算机上运行的东西,则可以尝试使用EXE Explorer。它将显示有关可执行文件的全部信息,包括32位还是64位。


8
不幸的是,这需要您运行可执行文件。也许您需要检查程序的体系结构,以作为无法运行的原因的故障排除方法。
Mike Christiansen

6
如何运行DLL?
user34660 '16


1
@samusarin应该在帖子中。
user34660 '17

@ user34660从技术上来说您是正确的,DLL没有main入口点,因此不会作为独立的进程执行。加载时有一个初始化函数,但不是“ main”。
samis

24

许多人安装了出色的7-zip,并将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行显示为x86x64,这是在此处要求的内容:

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

哇,我还不知道7z可以做到这一点。可能其中包含一个file实现?
phuclv

17

Process Explorer的64位版本可以告诉您。只需运行可执行文件并打开进程的属性窗口即可。在主选项卡上,有一个条目显示“ Image:32 Bit”或“ Image:64 Bit”。

在此处输入图片说明


23
Simply run the executable如果不想运行该程序怎么办?
Synetech 2014年

3
@Synetech最初的问题并不意味着确实如此。
安德鲁·兰伯特

我认为,这对我来说是最简单的方法,除非可执行文件退出得太快。
starbeamrainbowlabs 2015年

7
如何运行DLL?
user34660 '16

15

最简单的方法(当数据不保密时)

我发现Virustotal File detail是找出二进制文件是32位还是64位的最简单方法。

Additional information选项还提供有关该文件的许多有用信息。

病毒总量分析


[病毒总数TrID


12

运行可执行文件然后检入进程浏览器或类似工具的方法有一些明显的缺点:

  1. 我们必须执行该过程。
  2. 对于短暂的进程(例如echo hello world类型。),进程浏览器甚至可能不会注册新进程已启动。

Dumpbin.exe方法可能可以解决目的。

另一种选择是使用cygwin的file命令。但是,我尚未在Windows上对其进行测试。它在Linuxes上运行良好。

Usage: file program_under_test.exe

编辑:刚刚在窗口上测试file.exe。工作正常。:)


1
只是想说,在某些情况下,Dracs的方法不会有太大帮助。
2012年

3
>>这仍然需要运行作者希望避免的程序:不,我们运行它的方式是:file.exe program_under_test.exe
anishsane 2012年

1
那些希望避免安装整个cygwin软件包的人可以使用gnuwin32 file软件包
鲍勃

6
@anishsane完全错误。file只需以二进制格式从磁盘读取数据,然后检查是否有任何魔术数字可以识别它们,并与数据库进行比较。Windows的32位程序称为PE32,而64位和.NET程序均称为PE32 +。的位数file本身使得绝对零差- 32位和64位应用程序可以从盘,这是它需要的所有读取数据。
鲍勃

1
@MarcH哈!那有趣。我猜这意味着.NET运行时存根是32位的。因此,它运行一个32位进程仅需不到一秒钟的时间,但是该进程所要做的只是启动.NET运行时,这将创建一个本机64位进程。
clacke 2014年

10

这是一个Powershell解决方案,没有任何外部依赖关系或其他任何东西。打开Powershell,在其中粘贴函数(按Enter键两次,以返回到提示符),然后按照下面函数中的示例使用它:

function Test-is64Bit {
    param($FilePath=“$env:windir\notepad.exe”)

    [int32]$MACHINE_OFFSET = 4
    [int32]$PE_POINTER_OFFSET = 60

    [byte[]]$data = New-Object -TypeName System.Byte[] -ArgumentList 4096
    $stream = New-Object -TypeName System.IO.FileStream -ArgumentList ($FilePath, 'Open', 'Read')
    $stream.Read($data, 0, 4096) | Out-Null

    [int32]$PE_HEADER_ADDR = [System.BitConverter]::ToInt32($data, $PE_POINTER_OFFSET)
    [int32]$machineUint = [System.BitConverter]::ToUInt16($data, $PE_HEADER_ADDR + $MACHINE_OFFSET)
    $stream.Close()

    $result = "" | select FilePath, FileType, Is64Bit
    $result.FilePath = $FilePath
    $result.Is64Bit = $false

    switch ($machineUint) 
    {
        0      { $result.FileType = 'Native' }
        0x014c { $result.FileType = 'x86' }
        0x0200 { $result.FileType = 'Itanium' }
        0x8664 { $result.FileType = 'x64'; $result.is64Bit = $true; }
    }

    $result
}

这是示例输出:

D:\> Test-is64bit

FilePath               FileType Is64Bit
--------               -------- -------
C:\Windows\notepad.exe x64         True


D:\> Test-is64bit 'C:\Program Files (x86)\Mozilla Firefox\firefox.exe'

FilePath                                           FileType Is64Bit
--------                                           -------- -------
C:\Program Files (x86)\Mozilla Firefox\firefox.exe x86        False

光滑。上面的脚本似乎使对文件的引用保持打开状态。在我第一次关闭Powershell(运行脚本以查询\ bin中的DLL)之前无法构建。
samis

1
很酷。+1。Itanium绝对是64bit :)
Rich Homolka

@samusarin:也许在$stream.dispose();结束后添加?应该释放文件句柄。(stackoverflow.com/questions/1999858/...
Yorik


6

例如,即使标记为32位的可执行文件也可以以64位运行,例如,它是可以以32位或64位运行的.NET可执行文件。有关更多信息,请参见https://stackoverflow.com/questions/3782191/how-do-i-determine-if-a-net-application-is-32-or-64-bit,其答案是: CORFLAGS实用程序可用于确定.NET应用程序的运行方式。

CORFLAGS.EXE输出

对于32位可执行文件:

Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 0x3
ILONLY    : 1
32BITREQ  : 1
32BITPREF : 0
Signed    : 0

对于64位可执行文件:

Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32+
CorFlags  : 0x1
ILONLY    : 1
32BITREQ  : 0
32BITPREF : 0
Signed    : 0

对于可以以32位或64位运行并且在可能的情况下将以64位运行的可执行文件:

Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 0x1
ILONLY    : 1
32BITREQ  : 0
32BITPREF : 0
Signed    : 0

对于可以以32位或64位运行,但是除非加载到64位进程中才能以32位运行的可执行文件,请执行以下操作:

Version   : v4.0.30319
CLR Header: 2.5
PE        : PE32
CorFlags  : 0x20003
ILONLY    : 1
32BITREQ  : 0
32BITPREF : 1
Signed    : 0

很酷的命令,但不适用于本机(非托管)可执行文件/ dll。(corflags : error CF008 : The specified file does not have a valid managed header
Tomasz Gandor

@TomaszGandor是的,此答案的上下文仅是托管代码。非托管代码由其他答案回答。据我所知,只有托管代码可以在以32位和64位执行之间切换。
BlueMonkMN


3

如果您使用的是Windows 7,请在Windows资源管理器上右键单击可执行文件,然后选择“属性”。在属性窗口中,选择“兼容性”选项卡。如果在“兼容模式”部分下看到Windows XP,则这是32位可执行文件。如果您看到Windows Vista,则为64位。


-1完全不正确。各种32位和64位二进制文​​件都显示了兼容模式Windows 8
Peter Hahndorf

@Peter我已经在Windows 7上尝试了很多,它一直对我有用。您能否举一个默认兼容模式为Windows 8的二进制示例?您还在使用什么Windows?谢谢。
axxis

我在Server 2012 R2上并尝试了一些随机二进制文件。一些32位显示为,Windows XP SP2而其他一些显示为VistaWindows 8。所以这种方法是不正确的。
Peter Hahndorf

3

如何在上下文菜单中添加32/64位测试

创建一个名为exetest.reg的文本文件,其中包含以下代码:

Windows Registry Editor Version 5.00

; What will appear in the contextual menu when right-clicking on a .exe file
[HKEY_CLASSES_ROOT\exefile\shell\command32_64]
@="32/64 bit test"

; What to do with it
; here, %1 is the file given as argument of the script
[HKEY_CLASSES_ROOT\exefile\shell\command32_64\command]
@="\"c:\\temp\\x86TestStart.bat\" \"%1\""

创建一个x86TestStart.bat仅包含以下代码行的文本文件,并将其保存在C:\ temp中:

c:\temp\x86or64.vbs %1

创建一个x86or64.vbs包含此代码的文本文件,并将其保存在C:\ temp中:

rem Reading binary file in VBScript: http://stackoverflow.com/questions/21249440/modify-first-two-bytes-of-a-file-using-vbscript
rem Info on executables: https://dmoj.ca/problem/exe

rem x86/64 signature is located dinamycally; its position is addressed
rem from bytes in 0x3C-0x3D position.

rem Possible signatures;
rem "PE..L" (hex code: 50.45.00.00.4C) = 32 bit
rem "PE..d†" (hex code: 50.45.00.00.64.86) = 64 bit

' ------------------------------------
' Source code by Jumpkack 2015
' ------------------------------------

' Read all arguments from command line:
Set args = Wscript.Arguments

' Store first argument (full path to file)
FileName = args(0)

' Find address of executable signature:
FirstChars = readBinary(FileName)
FirstChars = FirstChars
Addr1 = asc(mid(FirstChars,61,1))
Addr2 = asc(mid(FirstChars,62,1))
AddrFinal = Addr2*256 + Addr1 + 1

' Check signature:
if ucase(hex(asc(mid(FirstChars,AddrFinal+4,2)))) = "4C" then Wscript.Echo Filename & " is a 32 bit executable."
if ucase(hex(asc(mid(FirstChars,AddrFinal+4,2)))) = "64" then Wscript.Echo Filename & " is a 64 bit executable."


Function readBinary(path)
    Dim a, fso, file, i, ts
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set file = fso.getFile(path)
    If isNull(file) Then
        wscript.echo "File not found: " & path
        Exit Function
    End If
    Set ts = file.OpenAsTextStream()
    'a = makeArray(file.size)
    a=""
    i = 0
    While (Not ts.atEndOfStream) and (i<60000)
       'a(i) = ts.read(1)
       a = a + ts.read(1)
       i = i + 1
    Wend
    ts.close
    readBinary = a
 End Function

双击exetest.reg文件:Windows注册表中将添加一个新项:

[HKEY_CLASSES_ROOT\exefile\shell\command32_64\command]

右键单击可执行文件,它将在上下文菜单中显示为“ 32/64位测试 ”。

单击该项目将导致启动批处理文件c:\\temp\\x86TestStart.bat\,这将启动VBscript文件x86or64.vbs,该文件读取exe签名并显示结果。

如果您不能或不想篡改注册表,则只需将.vbs文件复制到QuickLaunch栏中,然后将可执行文件拖到该文件上即可。


3

我的两分钱将只是下载依赖行者,并检查其中一个可执行文件已使用的体系结构。

如何使用它:

只需下载应用程序,启动它,单击打开图标→找到一个* .exe文件→选择,然后在完成反射扫描后在底部看到一个网格,其中的数据其中一列包含“体系结构”详细信息(x86, x64)

打开可执行文件并查看构建架构

依赖沃克截图


1

我还没有提到这个。有一个NTCore的名为CFF Explorer的PE查看器程序,可以为您提供此信息。可以下载并以便携式方式运行,但也可以根据需要安装。

右键单击二进制文件(.exe.dll等等),然后选择“使用CFF Explorer打开”。转到Nt标头->文件标头->在“特征”字段上,单击“单击此处”。

如果是32位程序,则将选中“ 32位字机”复选框。例如,我已经安装了32位版本的Notepad ++,如下图所示。否则,它是64位。

在此处输入图片说明


CFF浏览器有一个更快的方法:加载文件时,在“文件类型”下立即具有“ Portable Executable 64”或“ Portable Executable 32”
Arthur.V

0
  • 运行应用程序
  • 打开任务管理器
  • 右键单击并创建转储文件
  • 记下路径
  • 转到路径并.DMP在Visual Studio中打开转储
  • 在那里,您可以获得所有详细信息
  • 检查流程架构:

3
我觉得有必要强调这个答案需要运行应用程序这一事实。先前的评论者认为这可能是不可取的。此外,Visual Studio并非在所有Windows平台上都自动可用。
G-Man

0

我的两分钱:作为一个C ++开发人员,dependency walker(http://www.dependencywalker.com/)非常有用,不仅显示64/32位,而且还显示所有涉及的Dll: 在此处输入图片说明

您可以在每个文件名的左侧看到64 ...


1
屏幕截图无法显示答案
-32

0

但是,WSLfile命令非常有效。

file /mnt/c/p/bin/rg.exe 将输出:

/mnt/c/p/bin/rg.exe: PE32+ executable (console) x86-64, for MS Windows

file /mnt/c/p/bin/u.exe 将输出:

/mnt/c/p/bin/u.exe: PE32 executable (GUI) Intel 80386, for MS Windows, UPX compressed

0

Windows 10任务管理器中的平台列

Windows 7没有平台专栏。因此Windows 7任务管理器不会显示它。

在Windows 10中,选择列不再处于“查看”之下。在Windows 10中,在“详细信息”选项卡中,右键单击列标题,然后单击“选择列”。然后选中“平台”框。

在此处输入图片说明

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.