如何检测给定的PE文件(exe或dll)是64位还是32位?

8
我需要检测给定的.dll或.exe文件是32位还是64位。
目前我只有一种解决方案:从指定文件中读取PE头并从中获取“Machine”字段。
(规范:Microsoft Portable Executable and Common Object File Format Specification (.docx文件),在“3.3.COFF文件头(对象和映像)”一节中)
该字段最多可以有约20个值。其中三个是:
IMAGE_FILE_MACHINE_I386  ( == 32bit )

IMAGE_FILE_MACHINE_IA64  ( == 64bit )

IMAGE_FILE_MACHINE_AMD64 ( == 64bit )

我的问题:

1)“机器”到位数的映射是否正确?我有没有遗漏什么?还有其他需要注意的地方吗?

2)是否有更简单的方法来检测32/64位(可能是PE格式中我没有注意到的特定字段或某些特殊系统函数)?


复制:https://dev59.com/C0fSa4cB1Zd3GeqPBO_W#971715 - Shay Erlichmen
那个问题在询问架构,而这个问题在询问字长。 - Draemon
截至2017年,文档已从v8更新到v11:http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx - kayleeFrye_onDeck
2个回答

17

GetBinaryType(...)返回SCS_32BIT_BINARY用于32位基于Windows的应用程序,以及SCS_64BIT_BINARY用于64位基于Windows的应用程序。


6
分析 DLL 时,很不幸会返回 0。 - Benoit
用Python编写:import win32file; print win32file.GetBinaryType("myfile.exe")。这将返回0表示32位exe文件或6表示64位文件。 - Jerome Vacher
当加载不匹配的架构时(例如在32位程序中加载64位DLL),此函数会失败。 - Tamás Szelei

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接