Sep*_*ram 425 windows binary-files 32-vs-64-bit
有没有一种简单的方法来检查 Windows 上的二进制文件是 32 位还是 64 位?我需要在将程序移至 32 位机器并遇到严重故障之前进行检查。
Ale*_*evo 482
在检查了Richard 的回答中的标头值之后,我想出了一个快速、简单且只需要一个文本编辑器的解决方案。即使是 Windows 的默认 notepad.exe 也能工作。
在文本编辑器中打开可执行文件。您可能需要拖放或使用编辑器的Open...对话框,因为 Windows 不会Open with...在可执行文件的上下文菜单中显示选项。
检查第一次出现后的第一个可打印字符PE。这部分最有可能被至少一些空白(可能有很多)包围,因此可以很容易地在视觉上完成。
这是您将要找到的内容:
PE L
Run Code Online (Sandbox Code Playgroud)
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 86和4c 01时分别调整字节顺序,但是当你搜索一个十六进制值,任何像样的十六进制编辑器会自动处理字节顺序)。有更多可能的值,但您可能永远不会遇到其中任何一个,或者能够在您的 Windows PC 上运行此类可执行文件。
机器类型的完整列表以及 .exe 规范的其余部分可以在Microsoft PE 和 COFF 规范 机器类型部分找到。
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位字机
[...]
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)
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 可执行文件,也很明显哪个是哪个。
Dra*_*acs 34
一个简单的方法是运行它(假设您信任它)并查看任务管理器中的进程选项卡。32 位进程将在进程名称末尾显示“* 32”。如果您不愿意在您的计算机上运行它,您可以尝试EXE Explorer。它将显示有关可执行文件的大量信息,包括它是 32 位还是 64 位。
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行读取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
Run Code Online (Sandbox Code Playgroud)
And*_*ert 23
64 位版本的Process Explorer可以告诉你。只需运行可执行文件并打开进程的属性窗口。在主选项卡上有一个条目,上面写着“图像:32 位”或“图像:64 位”。

mar*_*gle 20
最简单的方法(当数据不保密时)
我发现Virustotal File detail是确定二进制文件是 32 位还是 64 位的最简单方法。
该Additional information选项还提供有关文件的许多有用信息。


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)
ani*_*ane 15
运行可执行文件然后签入进程资源管理器或类似工具的方法有一些明显的缺点:
Dumpbin.exe 方法大概可以达到目的。
另一种选择是使用 cygwin 的file命令。但是,我还没有在 Windows 上测试过它。它在 Linux 上运行良好。
Usage: file program_under_test.exe
Run Code Online (Sandbox Code Playgroud)
编辑:刚刚在窗口上测试了 file.exe。工作正常。:)
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)
如果您使用的是 Windows 7,则在 Windows 资源管理器上,右键单击可执行文件并选择属性。在属性窗口中选择兼容性选项卡。如果在兼容模式部分下您看到 Windows XP,则这是一个 32 位可执行文件。如果您看到 Windows Vista,则它是 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 文件,然后将可执行文件拖到其上即可。
windows 10 任务管理器中的平台栏
Windows 7 没有平台栏。所以Windows 7任务管理器不会显示它。
在 Windows 10 中,选择列不再位于“视图”下。在 Windows 10 中,在详细信息选项卡中,右键单击列标题,然后“选择列”。然后选中“平台”框。
然而,WSL的file命令非常有效。
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)
| 归档时间: |
|
| 查看次数: |
351866 次 |
| 最近记录: |