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页),但是不太可能找到它们。
#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
评论
不要忘记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在