如何检查Windows可执行文件是否为64位,仅读取其二进制文件。不执行它,不使用带有dumpbin.exe选项的SDK工具/headers之类的任何工具。

#1 楼

PE标头指示可执行类型,下载文档。

PE标头的第一个字(两个字节)指示目标计算机,这是可能值的列表:

0x0000 - The contents of this field are assumed to be applicable to any machine type
0x01d3 - Matsushita AM33
0x8664 - x64
0x01c0 - ARM little endian
0x01c4 - ARMv7 (or higher) Thumb mode only
0xaa64 - ARMv8 in 64-bit mode
0x0ebc - EFI byte code
0x014c - Intel 386 or later processors and compatible processors
0x0200 - Intel Itanium processor family
0x9041 - Mitsubishi M32R little endian
0x0266 - MIPS16
0x0366 - MIPS with FPU
0x0466 - MIPS16 with FPU
0x01f0 - Power PC little endian
0x01f1 - Power PC with floating point support
0x0166 - MIPS little endian
0x01a2 - Hitachi SH3
0x01a3 - Hitachi SH3 DSP
0x01a6 - Hitachi SH4
0x01a8 - Hitachi SH5
0x01c2 - ARM or Thumb (“interworking”)
0x0169 - MIPS little-endian WCE v2


因此要检查它是否为64位,我们需要寻找:

0x8664 - x64
0xaa64 - ARMv8 in 64-bit mode
0x0200 - Intel Itanium processor family


正如Bob提到的,这是一个列表一些其他机器类型(请参阅11页),但是不太可能找到它们。

评论


不要忘记0x0200(Itanium)。与x86-64(AMD64)相反,那将是IA-64。还有更多的“ 64位”计算机类型,但是您不太可能在野外找到它们(0x0284是1999年文档中的64位Alpha AXP,在NT4 / 2000RC之后不受Windows支持) 。

–鲍勃
2014年8月8日10:55



作为直观参考,该图显示了带有0x8664(突出显示)的PE标头的位置:i.imgur.com/yHvcgdn.png(notepad++十六进制编辑器插件)

– Zamnuts
2014年8月8日14:47

要快速找到目标机器值:在偏移量0x3C处获取DWORD。将此值加四。那是机器字的偏移量。 (都是小端)

–user1354557
14年8月25日在21:45

在哪里可以找到64位模式下的0xaa64-ARMv8?我在winnt.h中没有这样的#define。

– SerG
2015年2月12日14:34在

#2 楼

检查可选的标题魔术数字更容易。

对于有效的exe,只能有两个值:

0x10B => PE32  => 32 bit
0x20B => PE32+ => 64 bit


评论


也许值得一提的是要找到偏移量的偏移量(从“ PE”魔术符开始的NT头的0x18字节)。

–乔丹
19年8月6日在23:02

#3 楼

如果在Windows环境中,并且正在检查x86或x64二进制文件,这是一个有趣,快速的小技巧:


右键单击该应用程序。
单击Properties
单击Compatibility选项卡。
Compatibility mode部分中,选中Run this program in compatibility mode for:框。
如果从下拉列表中看到Windows 95是一个选项,则它是32位应用程序。如果您不这样做,那么它是一个64位应用程序。


#4 楼

将ST3答案的内容以即用型格式转储到Powershell片段中

if($args.Count -eq 0) { "provide a file name or path to file";exit }
if((test-path -path $args) -ne $true) { "file doesnt seem to exist" ; exit }
$fs = New-Object IO.Filestream($args , [Io.FileMode]::Open)
$br = New-Object IO.BinaryReader($fs)
if($br.Readchar()-ne'M'){"no mz";exit};if($br.Readchar()-ne'Z'){"no mz";exit}
$fs.Seek(0x3c,[IO.SeekOrigin]::Begin) | Out-Null
$elfaw_new = $br.ReadUInt32();
$peheader=$fs.Seek($elfaw_new,[IO.SeekOrigin]::Begin) 
if($br.Readchar()-ne'P'){"no pe";exit};if($br.Readchar()-ne'E'){"no pe";exit}
$mctypeoff = $fs.seek($peheader+4,[IO.SeekOrigin]::Begin)
$mctype= $br.ReadUInt16()
switch($mctype) {
  0x0000 { "{0:x4} {1}" -f  $mctype , "Unknown machine type"}
  0x01d3 { "{0:x4} {1}" -f  $mctype , "Matsushita AM33"}
  0x8664 { "{0:x4} {1}" -f  $mctype , "x64"}
  0x01c0 { "{0:x4} {1}" -f  $mctype , "ARM little endian"}
  0x01c4 { "{0:x4} {1}" -f  $mctype , "ARMv7 (or higher) Thumb mode only"}
  0xaa64 { "{0:x4} {1}" -f  $mctype , "ARMv8 in 64-bit mode"}
  0x0ebc { "{0:x4} {1}" -f  $mctype , "EFI byte code"}
  0x014c { "{0:x4} {1}" -f  $mctype , "Intel 386 or later family processors"}
  0x0200 { "{0:x4} {1}" -f  $mctype , "Intel Itanium processor family"}
  0x9041 { "{0:x4} {1}" -f  $mctype , "Mitsubishi M32R little endian"}
  0x0266 { "{0:x4} {1}" -f  $mctype , "MIPS16"}
  0x0366 { "{0:x4} {1}" -f  $mctype , "MIPS with FPU"}
  0x0466 { "{0:x4} {1}" -f  $mctype , "MIPS16 with FPU"}
  0x01f0 { "{0:x4} {1}" -f  $mctype , "Power PC little endian"}
  0x01f1 { "{0:x4} {1}" -f  $mctype , "Power PC with floating point support"}
  0x0166 { "{0:x4} {1}" -f  $mctype , "MIPS little endian"}
  0x01a2 { "{0:x4} {1}" -f  $mctype , "Hitachi SH3"}
  0x01a3 { "{0:x4} {1}" -f  $mctype , "Hitachi SH3 DSP"}
  0x01a6 { "{0:x4} {1}" -f  $mctype , "Hitachi SH4"}
  0x01a8 { "{0:x4} {1}" -f  $mctype , "Hitachi SH5"}
  0x01c2 { "{0:x4} {1}" -f  $mctype , "ARM or Thumb (`“interworking`”)"}
  0x0169 { "{0:x4} {1}" -f  $mctype , "MIPS little-endian WCE v2"}
};$fs.close()


用法如下

:\>powershell -f binstreamtest.ps1
provide a file name or path to file

:\>powershell -f binstreamtest.ps1 1
file doesnt seem to exist

:\>powershell -f binstreamtest.ps1 shell32.dll
014c Intel 386 or later family processors

:\>powershell -f binstreamtest.ps1 c:\WINDOWS\system32\ntkrnlpa.exe
014c Intel 386 or later family processors

:\>powershell -f binstreamtest.ps1 xxx\test32.exe
014c Intel 386 or later family processors

:\>powershell -f binstreamtest.ps1 xxx\test64.exe
8664 x64