#1 楼
在检查了Richard的答案中的标头值之后,我想出了一个快速,简单且只需要文本编辑器的解决方案。甚至Windows的默认notepad.exe也可以使用。在文本编辑器中打开可执行文件。您可能必须拖放或使用编辑器的
Open...
对话框,因为Windows在可执行文件的上下文菜单中不显示Open with...
选项。检查第一个可打印的首次出现
PE
之后的字符。这部分最有可能被至少一些空白包围(可能很多),因此可以很容易地在视觉上完成。这是您要执行的操作找到:
32位:
PE L
64位:
PE d†
警告:在大文件上使用默认记事本可能会很慢,因此更好不要将其用于大于或小于1 MB的文件。以我为例,大约需要30秒才能显示12 MiB文件。但是Notepad ++几乎可以立即显示120 MiB可执行文件。
如果您需要在无法安装任何其他软件的计算机上检查文件,此解决方案可能很有用。附加信息:
如果有可用的十六进制编辑器,则PE签名的偏移量位于偏移量
0x3C
处。签名是PE0x8664
0x014c
(字母“ P”和“ E”,后跟两个空字节),后跟两个字节的机器类型(在Little Endian中)。对于64位可执行文件,相关值为
64 86
,对于64位可执行文件,相关值为4c 01
。 32位元代码(调整了字节序后分别为q4312079q和q4312079q,但是任何不错的十六进制编辑器在搜索十六进制值时都会自动处理字节序)。还有更多可能的值,但您可能永远不会遇到这些值,也无法在Windows PC上运行此类可执行文件。完整的计算机类型列表以及其余的.exe规范,可以在“ Microsoft PE和COFF规范机器类型”部分中找到。
评论
嘿,这很hacky。而且更好的是,因为对于大多数情况,这实际上是最快,最简单的解决方案:)
–七卦
15年3月13日在21:51
记事本击败notepad ++的罕见实例。记事本显示了此权利,在记事本中,您可能会乱七八糟地进行编码以使其显示,但它确实起作用了!
– zar
2015年12月8日在20:01
@CoDEmanX此选项意味着IDE或JIT为您做出选择。有关更多详细信息,请参见此问题或此博客文章。
–亚历山大·雷沃(Alexander Revo)
16年8月1日在11:30
@IInspectable,如果您实际上不愿意在否决整个文章之前先阅读整篇文章,那么您会看到指向Microsoft PE和COFF规范的链接,该链接是一份尽可能多的书面合同,以及有关如何查找该文章的说明任何.exe文件中PE标头的确切地址。如果您有比Microsoft官方规范更可靠的来源(关于Microsoft自己的可执行格式),我想知道这是什么。
–亚历山大·雷沃(Alexander Revo)
17年1月21日在10:07
对于以“ MZ”开头的文件,您需要再看一些。我在“ RichMQ _........”之后找到偏移量为0x110的PE..L。
– jnnnnn
18年5月24日在4:20
#2 楼
带有dumpbin.exe
选项的SDK工具/headers
包含此信息,将这两个信息进行比较(我为关键信息添加了粗体)PS [64] E:\ #4> dumpbin /headers C:\Windows\system32\cmd.exe Microsoft (R) COFF/PE Dumper Version 10.00.40219.01 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file C:\Windows\system32\cmd.exe PE signature found File Type: EXECUTABLE IMAGE FILE HEADER VALUES 8664 machine (x64) 6 number of sections 4CE798E5 time date stamp Sat Nov 20 09:46:13 2010 0 file pointer to symbol table 0 number of symbols F0 size of optional header 22 characteristics Executable Application can handle large (>2GB) addresses [...]
和
PS [64] E:\ #5> dumpbin /headers C:\Windows\syswow64\cmd.exe Microsoft (R) COFF/PE Dumper Version 10.00.40219.01 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file C:\Windows\syswow64\cmd.exe PE signature found File Type: EXECUTABLE IMAGE FILE HEADER VALUES 14C machine (x86) 4 number of sections 4CE78E2B time date stamp Sat Nov 20 09:00:27 2010 0 file pointer to symbol table 0 number of symbols E0 size of optional header 102 characteristics Executable 32 bit word machine [...]
评论
对于64位Itanium exe,您也可以看到(IA64)。
–达里尔·布雷滕(Darryl Braaten)
2011年11月17日17:01
正如我在超级用户其他地方阅读的那样,使用dumpbin / headers | findstr“ machine”极大地简化了质量检查所要查找的内容...
–user1055604
2013年3月17日14:10
Dumpbin.exe位于:C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC \ bin
–分类
2014年7月30日在11:12
@David:不一定(VS的不同版本,不使用默认安装位置,使用Windows SDK中的版本):这就是为什么我没有指定。
–理查德
14年7月30日在11:17
如果从Visual Studio命令行启动dumpbin,最简单的方法是使用它:stackoverflow.com/a/477389/1390430
–本
15年4月27日在22:51
#3 楼
如果您没有完整的Windows SDK或Visual Studio,则可以使用SysInternals中的sigcheck.exe
: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
评论
似乎并不总是准确的:尝试将它与LinqPad.exe(AnyCPU-64bit版本)一起使用,Sigcheck会告诉您它是“ 32位” ...
–马特
17-10-18在13:55
@Matt有趣。 LinqPad听起来像一个.net应用;我想知道sigcheck是否仅能在本机可执行文件上正常工作(为此)。
–briantist
17-10-18在14:34
是的,它是一个.NET应用程序。在.NET中,如果未进行预编译,则可以定位“ x86”或“ AnyCPU”。 “ x86”将始终以32位运行,但是AnyCPU将在64位系统上以64位运行,但在32位系统上将以32位运行。 SigCheck应该考虑到这一点,并至少显示“ .NET 32位或64位(AnyCPU)”。例如,在这种情况下,ILSpy会说“体系结构:AnyCPU(首选64位)”,但ILSpy将不适用于非.NET EXE。
–马特
17-10-18在14:42
可能是这种情况,例如用于非Windows(DOS)操作系统的旧“ MZ”标头说“此应用程序需要Microsoft Windows” ... ;-)
–马特
17-10-18在14:46
是的,过去很不错,在外壳中有一个DOS调试器,可以反汇编代码(该代码只包含一个打印此消息的DOS调用)...然后将文本替换为“答案是42”。 :-D
–马特
17-10-18在14:52
#4 楼
我可以确认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可执行文件,这也很明显。
评论
对于已安装msysgit的所有开发人员来说,该解决方案都是非常普遍的。
– FrontierPsycho
17年2月6日在15:59
为什么Windows中的可执行文件使用MZ而不是PE?
–BattleTested-битвапроверено
18年5月15日在13:44
值得注意的是,如果您不需要Cygwin,则可以将GNU实用程序作为单独的二进制文件获得。 gnuwin32.sourceforge.net/packages/file.htm
– MJ Walsh
18年11月28日在11:23
#5 楼
一种简单的方法是运行它(假设您信任它)并查看任务管理器中的“进程”选项卡。 32位进程将在进程名称的末尾显示“ * 32”。如果不是您希望在计算机上运行的东西,则可以尝试EXE Explorer。它将显示有关可执行文件的全部信息,包括32位还是64位。评论
不幸的是,这需要您运行可执行文件。也许您需要检查程序的体系结构,以作为无法运行的原因的故障排除方法。
–麦克·克里斯蒂安森(Mike Christiansen)
2012年10月2日,16:20
您如何运行DLL?
–user34660
16年11月3日,19:57
@ user34660 RUNDLL32.EXE
– samis
17/12/14在18:53
@samusarin应该在帖子中。
–user34660
17年12月15日在1:22
@ user34660从技术上来说您是正确的,DLL没有主入口点,因此不会作为独立的进程执行。加载时有一个初始化函数,但不是“ main”。
– samis
17年12月18日在19:21
#6 楼
许多人安装了出色的7-zip,并将7-Zip文件夹添加到他们的PATH
中。 7-zip可以理解ZIP和RAR以外的文件格式,例如MSI文件和PE可执行文件。只需在有问题的PE文件(Exe或DLL)上使用命令行7z.exe
: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
评论
哇,我还不知道7z可以做到这一点。可能其中包含文件实现?
–phuclv
18-09-21在16:58
#7 楼
Process Explorer的64位版本可以告诉您。只需运行可执行文件,然后打开进程的属性窗口即可。在主选项卡上,有一个条目显示“ Image:32 Bit”或“ Image:64 Bit”。评论
只需运行可执行文件,如果不想运行该程序怎么办?
– Synetech
2014年2月6日在9:23
@Synetech最初的问题并不意味着确实如此。
–安德鲁·兰伯特(Andrew Lambert)
2014年2月6日在18:13
我认为这是最简单的方法,除非可执行文件退出得太快。
– starbeamrainbowlabs
15年1月27日在11:00
您如何运行DLL?
–user34660
16年11月3日,19:58
使用rundll32.exe file.dll,DllEntry运行它
– Anic17
7月17日在16:23
#8 楼
最简单的方法(当数据不是机密时)我发现Virustotal
File detail
是找出二进制是32位还是64位的最简单方法。Additional information
选项还提供有关该文件的许多有用信息。#9 楼
这是一个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
16-10-20在13:27
很酷。 +1。安腾绝对是64位的:)
– Rich Homolka
17年7月13日在21:24
@samusarin:也许添加$ stream.dispose();收盘后?应该释放文件句柄。 (stackoverflow.com/questions/1999858/…)
–约里克
17年12月13日在22:41
在检查exe是否为64位中可以找到更完整的版本
–phuclv
18-10-16在16:02
#10 楼
运行可执行文件然后检入进程浏览器或类似工具的方法有一些明显的缺点:我们必须执行该进程。
对于短暂的进程(像echo hello world类型。),进程浏览器甚至可能不会注册新进程已启动。
Dumpbin.exe方法可能可以解决此问题。
另一种替代方法是使用cygwin的file命令。但是,我尚未在Windows上对其进行测试。它在Linuxes上运行良好。
Usage: file program_under_test.exe
编辑:刚刚在窗口上测试了file.exe。工作良好。 :)
评论
只是想说,在某些情况下,Dracs的方法将无济于事。
–二十烷
2012年10月19日上午10:49
>>这仍然需要运行作者想要避免的程序:不,我们将其运行为:file.exe program_under_test.exe
–二十烷
2012年10月19日上午10:49
那些希望避免安装整个cygwin软件包的人可以抓住gnuwin32文件软件包。
–鲍勃
2012年10月19日上午11:32
@anishsane完全错误。该文件只是从磁盘上以二进制格式读取数据,并检查是否有任何魔术数字来标识它们,并与数据库进行比较。 Windows的32位程序称为PE32,而64位和.NET程序均称为PE32 +。文件本身的位数绝对不会产生零差异-32位和64位应用程序都可以从磁盘读取数据,这正是它所需要的。
–鲍勃
2014年1月17日在2:24
@MarcH哈!这太有趣了。我猜这意味着.NET运行时存根是32位的。因此,它运行一个32位进程仅需不到一秒钟的时间,但是该进程所要做的只是启动.NET运行时,这将创建一个本机64位进程。
–clacke
2014年12月16日15:15
#11 楼
例如,即使标记为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。 (标志:错误CF008:指定的文件没有有效的托管标头)
– Tomasz Gandor
16 Sep 15'在8:08
@TomaszGandor是的,此答案的上下文仅是托管代码。非托管代码由其他答案回答。据我所知,只有托管代码可以在以32位和64位执行之间切换。
– BlueMonkMN
18年8月25日在14:24
#12 楼
我的两美分只是下载依赖项遍历,并检查其中一个可执行文件中使用了什么体系结构。如何使用它:
只需下载应用程序,启动它,单击打开图标→找到一个* .exe文件→选择,然后在完成反射扫描后,在底部看到一个包含数据的网格,其中一列中包含“体系结构”详细信息(x86,x64)
打开可执行文件并查看构建体系结构
#13 楼
您还可以从mingw的msys捆绑包中使用file
工具。它的工作方式类似于unix命令。类似的作品来自GNUwin32的file
工具。#14 楼
如果您使用的是Windows 7,请在Windows资源管理器上右键单击可执行文件,然后选择“属性”。在属性窗口中,选择“兼容性”选项卡。
如果在“兼容模式”部分下看到Windows XP,是32位可执行文件。
如果您看到的是Windows Vista,则为64位。
评论
-1完全不正确。各种32位和64位二进制文件都显示Windows 8的兼容模式
– Peter Hahndorf
15年6月16日在12:14
@Peter我已经在Windows 7上尝试了很多,它一直对我有用。您能否举一个默认兼容模式为Windows 8的二进制示例?您还在使用什么Windows?谢谢。
–axxis
15年6月16日在18:46
我在Server 2012 R2上并尝试了一些随机二进制文件。一些32位版本显示为Windows XP SP2,而其他版本则显示为Vista或Windows8。因此,此方法不正确。
– Peter Hahndorf
2015年6月18日,下午3:27
@PeterHahndorf他们的语言有些偏离,但是他的意思是当您打开兼容性下拉菜单时,如果XP是一个选项,那就是32位。否则,如果您唯一的选择是从Vista开始,则为x64
–棕褐色
19-10-14在4:27
#15 楼
如何在上下文菜单中添加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栏中,然后将可执行文件拖到该文件上即可。
#16 楼
但是,WSL的file
命令工作得很好。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
#17 楼
我还没有看到这个提到。有一个NTCore的名为CFF Explorer的PE查看器程序,可以为您提供此信息。可以下载并以便携式方式运行,但也可以根据需要安装。右键单击二进制文件(
.exe
,.dll
等),然后选择“使用CFF Explorer打开”。转到Nt标头->文件标头->在“特征”字段上,单击“单击此处”。如果是32位程序,则将选中“ 32位字机”复选框。例如,我已经安装了32位版本的Notepad ++,如下图所示。否则,它是64位。
评论
使用CFF资源管理器有一种更快的方法:加载文件时,在“文件类型”下立即具有“ Portable Executable 64”或“ Portable Executable 32”
– Arthur.V
19年9月5日在11:25
#18 楼
Windows 10的任务管理器中的platform列Windows 7没有平台列。因此Windows 7任务管理器将不会显示它。
在Windows 10中,选择列不再处于“视图”之下。在Windows 10中,在“详细信息”选项卡中,右键单击列标题,然后单击“选择列”。然后选中“平台”框。
评论
这需要运行应用程序,这可能是不希望的。另外,您“无法”运行DLL。
– Andreas Rejbrand
19年11月12日在9:26
@AndreasRejbrand从某种意义上讲是公平的,尽管他没有提到dll,但他只是说了应用程序..而且,DLL将以“位数”匹配EXE。
– barlop
19年11月12日19:42
#19 楼
根据我的测试,我在Powershell中使用的简单版本似乎100%可靠。Clear-Host
$Check32Bit = $null
$Check64Bit = $null
$File = "C:\WINDOWS\system32\notepad.exe"
$ExeData = get-content $File -totalcount 50
$Check32Bit = $ExeData | select-string -Pattern "PE..L" -Quiet
$Check64Bit = $ExeData | select-string -Pattern "PE..d†" -Quiet
if ($Check32Bit) {
"File is 32bit (x86)"
}
elseif ($Check64Bit) {
"File is 64bit (x64)"
}
else {
"Couldn't identify if the file is 32bit or 64bit"
}
#20 楼
我的两分钱:作为C ++开发人员,依赖行者(http://www.dependencywalker.com/)非常有用,不仅显示64/32位,而且还显示涉及的每个Dll:
您可以在每个文件名的左侧看到64 ...
评论
屏幕截图不显示答案-32位与64位信息...
– TomTous
17年9月28日在7:51
@TomEus在屏幕快照中有“ 64”,但不在文件名中,而是在文件徽标中(在右侧)
–phuclv
1月18日2:11
#21 楼
运行应用程序
打开任务管理器
右键单击并创建转储文件
注意路径
转到路径并在Visual Studio中打开
.DMP
转储您会得到所有详细信息
检查流程体系结构:
评论
我觉得有必要强调这个答案需要运行应用程序这一事实。先前的评论者认为这可能是不可取的。此外,Visual Studio不会在所有Windows平台上自动提供。
– G-Man说“恢复莫妮卡”
15年3月19日在13:46
#22 楼
我知道这里有很多答案,但是它们都不是真正可移植的,需要某种工具才能使用。我想以编程方式为所有平台解决此问题。这可以在任何使用C编译器的计算机上运行。 #include <stdio.h>
#include <fstream> // std::fstream
#include <stdio.h>
#include <string.h>
char Header [0x200];
char Elf32Magic [20] = "\x7f\x45\x4c\x46"; //7F 45 4C 46 01 // ELF32
char Elf64Magic [20] = "\x7f\x45\x4c\x46"; //7F 45 4C 46 02 // ELF64
char Win32Magic [20] = "\x50\x45\x00\x00\x4C\x01";// PE32
char Win64Magic [20] = "\x50\x45\x00\x00\x64\x86";// PE64
char PeHeader[20] = {};
void CheckWinHeader(){
int k = 0;
for (int i = 0; i < 0x200; i++)
{
if(Header[i] == 0x50 && Header[i+1] == 0x45) // PE
{
for(int j = i; j < i + 6; j++)
{
PeHeader[k] = Header[j];
k++;
//printf("%hhx", Header[j]);
}
}
}
}
int main(){
std::fstream fs;
fs.open ("/home/PATH/TO/YOUR/BINARY", std::fstream::in | std::fstream::out | std::fstream::app);
fs.read( Header , 0x200);
if(memcmp ( Header, Elf32Magic, 5 ) == 0 ){
printf("ELF 32 Match Found ! \n");
}
if(memcmp ( Header, Elf64Magic, 5 ) == 0 ){
printf("Elf 64 Match Found ! \n");
}
CheckWinHeader();
if(memcmp ( &PeHeader, Win32Magic, 6 ) == 0 ){
printf("Win 32 Match Found ! \n");
}
if(memcmp ( &PeHeader, Win64Magic, 6 ) == 0 ){
printf("Win 64 Match Found ! \n");
}
fs.close();
return 0;
}
通过使用任何编译器进行编译。我用的是g ++。
g++ Bincheck.cpp -o bincheck
./bincheck
评论
Windows默认情况下没有C编译器,因此它不是很有用。如果您有gcc,那么您将具有文件命令,如果您具有MSVC,则可以使用dumpbin,因此无需编译此类程序。 OTOH在Windows上有记事本和Powershell,因此您无需任何第3方工具即可轻松地使用任何一种方式检查二进制类型
–phuclv
8月11日14:05
#23 楼
您可以在VS命令提示符下使用corflags更改计算机类型https://docs.microsoft.com/zh-cn/dotnet/framework/tools/corflags-exe-corflags-conversion-tool
更改机器类型:
corflags d:\abc.exe /32BITREQ-
使用corflags进行验证:
corflags d:\abc.exe
32BITREQ : 0 ** 0
表示64位
评论
这个问题是类似的,但是需要一些工作来检查它。@Guillaume:可执行映像不是进程。任务管理器仅显示进程。
如何确定我要安装的应用程序是32位还是64位?