我最初尝试创建一个程序来区分 DOS(16 位)和 Windows(32/64 位)可执行文件。
我在其他答案中看到,可以根据可执行文件的前两个字节对其进行分类。(MZ /......)
但是当我手动去比较几个可执行文件(16 位和 32/64 位)时,我发现它们都以 MZ 开头。
这是有什么原因吗?或者我做错了什么?
16 位可执行文件是我用汇编语言编写的,然后使用 TASM 编译,32/64 位可执行文件来自我电脑的系统文件C:\Windows\System32
还有其他更准确的方法来区分可执行文件吗?
答案1
我发现他们都开始于MZ
MZ
确实是文件的特征签名.exe
:
DOS MZ 可执行格式是 DOS 中用于 .EXE 文件的可执行文件格式。
该文件可以通过文件开头的 ASCII 字符串“MZ”(十六进制:4D 5A)(“魔幻数字”)来识别。“MZ”是 MS-DOS 主要开发人员之一 Mark Zbikowski 的姓名首字母缩写。
此签名后来扩展到其后代(包括 NE 和 PE):
新可执行文件(缩写为 NE 或 NewEXE)是一种 16 位 .exe 文件格式,是 DOS MZ 可执行文件格式的后继者。它用于 Windows 1.0–3.x、多任务 MS-DOS 4.0、[1] OS/2 1.x 和 Windows NT 的 OS/2 子集,直至版本 5.0(Windows 2000)。NE 也称为分段可执行文件
可移植可执行文件 (PE) 格式是 32 位和 64 位 Windows 操作系统中使用的可执行文件、目标代码、DLL 和其他文件的文件格式。PE 格式是一种数据结构,它封装了 Windows 操作系统加载程序管理包装的可执行代码所需的信息。这包括用于链接的动态库引用、API 导出和导入表、资源管理数据和线程本地存储 (TLS) 数据。在 NT 操作系统上,PE 格式用于 EXE、DLL、SYS(设备驱动程序)和其他文件类型。可扩展固件接口 (EFI) 规范规定 PE 是 EFI 环境中的标准可执行格式。
在 Windows NT 操作系统上,PE 目前支持 IA-32、IA-64、x86、x86-64 (AMD64/Intel 64)、ARM 和 ARM64 指令集架构 (ISA)。在 Windows 2000 之前,Windows NT(以及 PE)支持 MIPS、Alpha 和 PowerPC ISA。由于 PE 在 Windows CE 上使用,因此它继续支持 MIPS、ARM(包括 Thumb)和 SuperH ISA 的几种变体。
因此MZ
用于 16、32 和 64 位.exe
签名,不能用于区分 16 位和 32/64 位程序。
那么如何区分 16 位和 32/64 位程序?
Windows 多次扩展了旧的 DOS 可执行文件格式,因此如果您查看“现代”Windows 可执行文件,在开头附近会有一个 MZ(如果可执行文件用于使用相反位顺序的系统,则可能是 ZM)。这指定了第二个 DOS 可执行文件格式的标头,简称为 MZ 格式。
除此之外,您还会看到一些明显的乱码,后面跟着类似“该程序无法在 DOS 模式下运行”的内容。这些乱码实际上是一个非常简单的 DOS 程序,它会打印出一条消息来告诉用户该程序无法在 DOS 模式下运行。
之后,您将看到实际可执行文件的标头,该标头可能以四对字母中的一对字母开头:NE、LX、LE 或 PE。如果您没有看到其中任何一个字母和上述消息,则说明它是一个 16 位 DOS 应用程序。
来源如何在 Windows 上检查二进制文件是否为 16 位,回答者奥斯汀·赫默加恩
您还可以使用 Unixfile
命令(在 Cygwin 中可用,并且适用于 Linux 的 Windows 子系统:
例子:
C:\Program Files\GnuWin32\bin>file "C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE" C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE; PE32 executable for MS Windows (GUI) Intel 80386 32-bit
我相信当它是一个 16 位可执行文件时,它会对 MS-DOS 或 Win 3.X 可执行文件进行一些说明。
来源已解决:区分 16/32/64 位 .exe 文件的技巧或工具?| 技术支持人员
上面的链接还包括您可以使用的源代码(看起来像 C)。