有没有一种简单的方法来检查Windows上的二进制文件是32位还是64位?在将程序移至32位计算机上并遇到严重故障之前,我需要进行检查。
有没有一种简单的方法来检查Windows上的二进制文件是32位还是64位?在将程序移至32位计算机上并遇到严重故障之前,我需要进行检查。
Answers:
在检查了Richard的答案中的标头值之后,我想出了一个快速,简单且只需要文本编辑器的解决方案。甚至Windows的默认notepad.exe也可以使用。
在文本编辑器中打开可执行文件。您可能必须拖放或使用编辑器的Open...
对话框,因为Windows不在Open with...
上下文菜单中显示可执行文件的选项。
第一次出现后检查第一个可打印字符PE
。该部分最有可能被至少一些空白(可能很多)包围,因此可以很容易地在视觉上完成。
这是您将要找到的:
PE L
PE d†
一个警告:在大文件上使用默认记事本可能会非常慢,因此最好不要将其用于大于或小于1 MB的文件。以我为例,大约需要30秒才能显示12 MiB文件。但是,Notepad ++几乎可以立即显示120 MiB可执行文件。
如果您需要在无法安装任何其他软件的计算机上检查文件,此解决方案可能很有用。
如果您有可用的十六进制编辑器,则PE签名的偏移量位于offset处0x3C
。签名是PE\0\0
(字母“ P”和“ E”,后跟两个空字节),后跟两个字节的Little Endian机器类型。
相关值适用0x8664
于x64可执行文件和0x14c
x86。还有更多可能的值,但您可能永远不会遇到这些值,也无法在Windows PC上运行此类可执行文件。
可以在Microsoft PE和COFF规范 机器类型部分中找到机器类型的完整列表以及其余的.exe规范。
Microsoft PE and COFF Specification
,这是一份尽可能多的书面合同,以及有关如何查找PE标头确切地址的说明在任何.exe
文件中。如果您有比Microsoft官方规范更可靠的来源(关于Microsoft自己的可执行格式),我想知道这是什么。
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位字机 [...]
dumpbin /headers | findstr "machine"
大大简化了质量检查所要查找的内容...
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
如果您没有或不需要整个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
我可以确认该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可执行文件,这也是显而易见的。
MZ
而不是PE
?
一种简单的方法是运行它(假设您信任它)并查看任务管理器中的“进程”选项卡。32位进程将在进程名称的末尾显示“ * 32”。如果不是您希望在计算机上运行的东西,则可以尝试使用EXE Explorer。它将显示有关可执行文件的全部信息,包括32位还是64位。
main
入口点,因此不会作为独立的进程执行。加载时有一个初始化函数,但不是“ main”。
许多人安装了出色的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
行显示为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
file
实现?
Process Explorer的64位版本可以告诉您。只需运行可执行文件并打开进程的属性窗口即可。在主选项卡上,有一个条目显示“ Image:32 Bit”或“ Image:64 Bit”。
Simply run the executable
如果不想运行该程序怎么办?
最简单的方法(当数据不保密时)
我发现Virustotal File detail
是找出二进制文件是32位还是64位的最简单方法。
该Additional information
选项还提供有关该文件的许多有用信息。
运行可执行文件然后检入进程浏览器或类似工具的方法有一些明显的缺点:
Dumpbin.exe方法可能可以解决目的。
另一种选择是使用cygwin的file命令。但是,我尚未在Windows上对其进行测试。它在Linuxes上运行良好。
Usage: file program_under_test.exe
编辑:刚刚在窗口上测试file.exe。工作正常。:)
cygwin
软件包的人可以使用gnuwin32 file
软件包。
file
只需以二进制格式从磁盘读取数据,然后检查是否有任何魔术数字可以识别它们,并与数据库进行比较。Windows的32位程序称为PE32,而64位和.NET程序均称为PE32 +。的位数file
本身使得绝对零差- 32位和64位应用程序可以从盘,这是它需要的所有读取数据。
这是一个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
$stream.dispose();
结束后添加?应该释放文件句柄。(stackoverflow.com/questions/1999858/...)
例如,即使标记为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
corflags : error CF008 : The specified file does not have a valid managed header
)
如果您使用的是Windows 7,请在Windows资源管理器上右键单击可执行文件,然后选择“属性”。在属性窗口中,选择“兼容性”选项卡。如果在“兼容模式”部分下看到Windows XP,则这是32位可执行文件。如果您看到Windows Vista,则为64位。
Windows 8
Windows XP SP2
而其他一些显示为Vista
或Windows 8
。所以这种方法是不正确的。
创建一个名为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栏中,然后将可执行文件拖到该文件上即可。
我还没有提到这个。有一个NTCore的名为CFF Explorer的PE查看器程序,可以为您提供此信息。可以下载并以便携式方式运行,但也可以根据需要安装。
右键单击二进制文件(.exe
,.dll
等等),然后选择“使用CFF Explorer打开”。转到Nt标头->文件标头->在“特征”字段上,单击“单击此处”。
如果是32位程序,则将选中“ 32位字机”复选框。例如,我已经安装了32位版本的Notepad ++,如下图所示。否则,它是64位。
我的两分钱:作为一个C ++开发人员,dependency walker(http://www.dependencywalker.com/)非常有用,不仅显示64/32位,而且还显示所有涉及的Dll:
您可以在每个文件名的左侧看到64 ...