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

Sep*_*ram 425 windows binary-files 32-vs-64-bit

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

Ale*_*evo 482

在检查了Richard 的回答中的标头值之后,我想出了一个快速、简单且只需要一个文本编辑器的解决方案。即使是 Windows 的默认 notepad.exe 也能工作。

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

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

这是您将要找到的内容:

32 位:

PE  L
Run Code Online (Sandbox Code Playgroud)

64 位:

PE  d†
Run Code Online (Sandbox Code Playgroud)

警告:在大文件上使用默认记事本可能会很慢,所以最好不要将它用于大于或等于几兆字节的文件。就我而言,显示 12 MiB 文件大约需要 30 秒。但是,Notepad++ 几乎可以立即显示 120 MiB 的可执行文件。

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

附加信息:

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

相关的值是0x8664一个64位可执行文件和0x014c一个32位一个(64 864c 01时分别调整字节顺序,但是当你搜索一个十六进制值,任何像样的十六进制编辑器会自动处理字节顺序)。有更多可能的值,但您可能永远不会遇到其中任何一个,或者能够在您的 Windows PC 上运行此类可执行文件。

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

  • 嘿,这是相当hacky。更好的是,因为对于绝大多数情况,这实际上似乎是最快和最简单的解决方案:) (31认同)
  • 对于以“MZ”开头的文件,您需要进一步查看。我在偏移量 0x110 处发现了 PE..L,就在“RichMQ_........”之后。 (11认同)
  • 记事本击败记事本++的罕见实例。记事本正确显示了这一点,在记事本中,您可以通过编码来显示它,但它起作用了! (8认同)
  • @CoDEmanX 此选项意味着 IDE 或 JIT 为您做出选择。请参阅[此问题](http://stackoverflow.com/q/516730/3811791) 或此[博客文章](http://blogs.microsoft.co.il/sasha/2012/04/04/what-anycpu -really-means-as-of-net-45-and-visual-studio-11/) 了解更多详情。 (3认同)
  • @IInspectable 如果您在投反对票之前真的不厌其烦地阅读整篇文章,那么您会看到“Microsoft PE 和 COFF 规范”的链接,这是一份尽可能多的文档化合同,以及有关如何执行的说明在任何 `.exe` 文件中找到 PE 头的确切地址。如果您有比 Microsoft 官方规范关于 Microsoft 自己的可执行格式更可靠的来源,我很想知道那是什么。 (2认同)
  • 我检查的第一个文件,没有“PE”,只有“MZ”,所以我想这个解决方案不是万无一失的 (2认同)
  • 谢谢你的技术!它对我有用,但请注意,您的回答“PE 签名的偏移量位于偏移量 0x3C”中的这一陈述并不总是正确的。例如,Doxygen 32 位 EXE 具有 PE​​ 标头 @ 0x108。如果有人对此感兴趣,此命令将有助于在 linux 上应用此技术: hexdump -C <file> | grep 'PE' | head -n 5(给出文件中“PE”的前 5 个匹配项) (2认同)
  • 太好了,谢谢你;) (2认同)

Ric*_*ard 157

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

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


转储文件 C:\Windows\system32\cmd.exe

找到 PE 签名

文件类型:可执行图像

文件头值
            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) 微软公司。版权所有。


转储文件 C:\Windows\syswow64\cmd.exe

找到 PE 签名

文件类型:可执行图像

文件头值
             14C机(x86)
               4 节数
        4CE78E2B 时间日期戳 2010 年 11 月 20 日星期六 09:00:27
               0 指向符号表的文件指针
               0 符号数
              可选头的 E0 大小
             102 特性
                   可执行
                   32位字机
[...]

  • 当我在超级用户的其他地方阅读时,使用 `dumpbin /headers | findstr "machine"` 极大地简化了 QA 正在寻找的内容的呈现...... (26认同)
  • 如果从 Visual Studio 命令行启动,最容易使用 dumpbin:http://stackoverflow.com/a/477389/1390430 (9认同)
  • Dumpbin.exe 位于:`C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin` (4认同)
  • @David:不一定(VS 的不同版本,不使用默认安装位置,使用来自 Windows SDK 的版本):这就是我没有指定的原因。 (4认同)
  • 您还可以查看 64 位 Itanium exe 的 (IA64)。 (2认同)

bri*_*ist 64

如果您没有或想要整个 Windows SDK 或 Visual Studio,您可以sigcheck.exe从 SysInternals使用:

sigcheck.exe C:\Windows\Notepad.exe
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

  • 似乎并不总是准确的:尝试将它与 LinqPad.exe(AnyCPU-64 位版本)一起使用,Sigcheck 会告诉您它是“32 位”...... (4认同)
  • 是的,它是一个 .NET 应用程序。在 .NET 中,如果它没有被预编译,你可以针对“x86”或“AnyCPU”。“x86”将始终以 32 位运行,但 AnyCPU 将在 64 位系统上以 64 位运行,但在 32 位系统上以 32 位运行。SigCheck 应该考虑这一点并至少显示“.NET 32 位或 64 位(AnyCPU)”。例如,在这种情况下,ILSpy 表示“架构:AnyCPU(首选 64 位)”-但 ILSpy 不适用于非 .NET EXE。 (2认同)
  • 是的,过去的美好时光,在 shell 中有一个 DOS 调试器,可以反汇编代码(其中只包含一个打印此消息的单个 DOS 调用)……并将文本替换为“答案是 42”。:-D (2认同)

wma*_*ham 58

我可以确认该file实用程序(例如来自 cygwin)将区分 32 位和 64 位可执行文件。它们如下所示:

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

如您所见,很明显哪个是哪个。此外,它还区分了控制台和 GUI 可执行文件,也很明显哪个是哪个。

  • 对于任何安装了 msysgit 的开发人员来说,这个解决方案非常普遍。 (2认同)
  • 为什么Windows中的可执行文件有“MZ”而不是“PE”? (2认同)
  • 我们还可以使用 Git Bash 实用程序来使用“file”命令。如今许多人会与 GIT 安装一起安装 (2认同)

Dra*_*acs 34

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

  • 不幸的是,这需要您运行可执行文件。也许您需要检查程序的体系结构,作为解决程序未运行原因的故障排除方法。 (11认同)
  • **你**如何运行DLL? (11认同)

Lum*_*umi 34

许多人安装了优秀的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
Run Code Online (Sandbox Code Playgroud)

输出将包括如下行,该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
Run Code Online (Sandbox Code Playgroud)


And*_*ert 23

64 位版本的Process Explorer可以告诉你。只需运行可执行文件并打开进程的属性窗口。在主选项卡上有一个条目,上面写着“图像:32 位”或“图像:64 位”。

在此处输入图片说明

  • `只需运行可执行文件` 如果您不想*运行*程序怎么办? (29认同)
  • **你**如何运行DLL? (12认同)
  • @Synetech 最初的问题并不意味着就是这种情况。 (4认同)

mar*_*gle 20

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

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

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

病毒总分析


[病毒总 TrID


meg*_*orf 19

这是一个 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
}
Run Code Online (Sandbox Code Playgroud)

这是示例输出:

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
Run Code Online (Sandbox Code Playgroud)

  • 更完整的版本可以在[Check if exe is 64-bit](https://reverseengineering.stackexchange.com/a/11373/2563)中找到 (2认同)

ani*_*ane 15

运行可执行文件然后签入进程资源管理器或类似工具的方法有一些明显的缺点:

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

Dumpbin.exe 方法大概可以达到目的。

另一种选择是使用 cygwin 的file命令。但是,我还没有在 Windows 上测试过它。它在 Linux 上运行良好。

Usage: file program_under_test.exe
Run Code Online (Sandbox Code Playgroud)

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

  • @anishsane 完全错误。`file` 只是以二进制格式从磁盘读取数据,并检查识别它们的任何幻数,并与数据库进行比较。Windows 的 32 位程序显示为 PE32,而 64 位和 .NET 程序显示为 PE32+。`file` 本身的位数绝对是零差异 - 32 位和 64 位应用程序都可以从磁盘读取数据,这就是它所需要的。 (7认同)
  • >>这仍然需要运行作者想要避免的程序:不..我们像这样运行:file.exe program_under_test.exe (3认同)

Blu*_*kMN 10

即使是标记为 32 位的可执行文件也可以作为 64 位运行,例如,如果它是可以作为 32 位或 64 位运行的 .NET 可执行文件。有关更多信息,请参阅/sf/ask/264753401/,其中有一个回答说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
Run Code Online (Sandbox Code Playgroud)

对于 64 位可执行文件:

Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32+
CorFlags  : 0x1
ILONLY    : 1
32BITREQ  : 0
32BITPREF : 0
Signed    : 0
Run Code Online (Sandbox Code Playgroud)

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

Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 0x1
ILONLY    : 1
32BITREQ  : 0
32BITPREF : 0
Signed    : 0
Run Code Online (Sandbox Code Playgroud)

对于可以以 32 位或 64 位运行,但除非加载到 64 位进程中,否则将以 32 位运行的可执行文件:

Version   : v4.0.30319
CLR Header: 2.5
PE        : PE32
CorFlags  : 0x20003
ILONLY    : 1
32BITREQ  : 0
32BITPREF : 1
Signed    : 0
Run Code Online (Sandbox Code Playgroud)


axx*_*xis 8

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

  • @PeterHahndorf 他们的语言有点偏离,但他的意思是当你打开兼容性下拉菜单时,如果 XP 是一个选项,它就是 32 位。否则,如果您拥有的唯一选项是 Vista 版本,则是 x64 (2认同)

小智 8

我的两分钱只是下载依赖项walker并检查其中一个可执行文件中使用了什么架构。

如何使用它:

只需简单地下载应用程序,启动它,点击打开图标?找到一个 *.exe 文件?选择并在反射扫描完成后的底部,您会看到一个包含数据的网格,其中一列具有“架构”详细信息(x86、x64)

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

依赖步行者截图


jum*_*ack 7

如何将 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\""
Run Code Online (Sandbox Code Playgroud)

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

c:\temp\x86or64.vbs %1
Run Code Online (Sandbox Code Playgroud)

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

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\""
Run Code Online (Sandbox Code Playgroud)

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

[HKEY_CLASSES_ROOT\exefile\shell\command32_64\command]
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 我想感谢您发布这个答案。它启发我编写一个更通用的函数,并将其发布到我的 GitHub 存储库(https://github.com/franklesniak/VBScript_Resources)中名为“GetExecutableProcessorArchitectureFromFile.vbs”的文件中。它读取 exe 的 PE 标头,获取机器类型,并以字符串格式返回处理器体系结构(即,如果可执行文件正在运行并访问 PROCESSOR_ARCHITECTURE 环境变量,则返回该变量的内容)。 (2认同)

bar*_*lop 6

windows 10 任务管理器中的平台栏

Windows 7 没有平台栏。所以Windows 7任务管理器不会显示它。

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

在此输入图像描述

在此输入图像描述


小智 5

您还可以filemingw-w64msys2 包中使用该工具。它的工作方式类似于 unix 命令。file来自GNUwin32的工具类似。


Boh*_*ohr 5

然而,WSLfile命令非常有效。

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

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

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

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