如何在 Windows 上检查二进制文件是否为 16 位

如何在 Windows 上检查二进制文件是否为 16 位

我有一个.exe文件无法在 Windows 10 上运行。我怀疑这是因为二进制文件是 16 位。有没有简单的方法可以检查?比如Alexander Revo 的回答会很好。

答案1

Windows 多次扩展了旧的 DOS 可执行文件格式,因此如果你查看“现代”的 Windows 可执行文件,在开头附近会有一个MZ(或者ZM如果可执行文件适用于使用相反位顺序的系统)。这指定了第二DOS 可执行格式,简称为 MZ 格式。

除此之外,您还会看到一些明显的乱码,后面跟着类似“该程序无法在 DOS 模式下运行”的内容。这些乱码实际上是一个非常简单的 DOS 程序,它会打印出一条消息来告诉用户该程序无法在 DOS 模式下运行。

之后,您将获得实际可执行文件的标头,它可能以四对字母中的一对开头,NELXLEPE。如果您没有看到其中一个和上述消息,则它是一个 16 位 DOS 应用程序。

NE可执行文件(称为“新可执行文件”)目前已弃用。它们是第一个从 MZ 扩展而来的“新”格式,最初是为 Windows 1.0 开发的。它们始终是 16 位 Windows 可执行文件,并正式用于 Windows 1.0-3.x、MS-DOS 4.0(但不是更高版本)、OS/2 1.x 和 OS/2 版本的 Windows,直至 NT 5.0(Windows 2000)。它们无法在 64 位 Windows 上本机运行,并且自 Vista 以来无法在 32 位版本的 Windows 上正确显示应用程序图标。

LX可执行文件(两种“线性可执行文件”之一)是 32 位可执行文件,其格式由 OS/2 2.x 及更新版本以及某些 DOS 扩展器使用。任何现代版本的 Windows 都不支持这些文件(我认为它们可能从未得到支持,但我不确定)。

LE可执行文件(另一种“线性可执行文件”)是一种奇怪的情况,甚至可能在技术上包含 64 位代码。它们也是在 OS/2 2.0 中引入的(就像LX可执行文件一样),但设计用于硬件驱动程序。Windows 3.x 和 9x 中使用的 VxD 驱动程序模型采用了这种格式。它们从未用于用户应用程序,因此在较新版本的 Windows 上根本不受支持。

PE可执行文件,通常称为“可移植可执行文件”,是现代 Windows 系统使用的格式,专为 32 位代码而设计(因此从不支持 16 位代码)。还有一个名为“PE32+”的扩展,用于 64 位 Windows 二进制文件、.NET CIL 二进制文件(与位宽无关)以及使用不同扩展的许多其他内容(例如,使用扩展的 UEFI 驱动程序和应用程序.efi是 PE32+ 格式)。

使用此信息,您可以使用问题中链接的答案中建议的相同常规检查。如果您在文件MZ的前 4kB 中只看到和而不是短消息,后面跟着一些乱码,然后是上述四个字母对之一,则它只是一个 DOS 可执行文件,否则,它就是这四种格式之一。这些格式中唯一可以在 Windows 10 上原生运行的是 PE 格式。

举个例子,下面是 64 位 Windows 可执行文件(具体来说,是 BOINC 客户端软件的组件之一)的前 512 个字节的十六进制转储:

00000000: 4d5a 9000 0300 0000 0400 0000 ffff 0000  MZ..............
00000010: b800 0000 0000 0000 4000 0000 0000 0000  ........@.......
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 1801 0000  ................
00000040: 0e1f ba0e 00b4 09cd 21b8 014c cd21 5468  ........!..L.!Th
00000050: 6973 2070 726f 6772 616d 2063 616e 6e6f  is program canno
00000060: 7420 6265 2072 756e 2069 6e20 444f 5320  t be run in DOS 
00000070: 6d6f 6465 2e0d 0d0a 2400 0000 0000 0000  mode....$.......
00000080: c88d b31c 8cec dd4f 8cec dd4f 8cec dd4f  .......O...O...O
00000090: 8594 4e4f 9aec dd4f e39a 414f 88ec dd4f  ..NO...O..AO...O
000000a0: 1fa2 454f 8eec dd4f e39a 434f 8eec dd4f  ..EO...O..CO...O
000000b0: e39a 774f 9fec dd4f e39a 764f 89ec dd4f  ..wO...O..vO...O
000000c0: 8594 5e4f 8dec dd4f 8594 594f 8dec dd4f  ..^O...O..YO...O
000000d0: 9771 414f 85ec dd4f 8cec dc4f 14ed dd4f  .qAO...O...O...O
000000e0: 9771 764f d0ec dd4f 9771 474f 8dec dd4f  .qvO...O.qGO...O
000000f0: 9771 404f 8dec dd4f 5269 6368 8cec dd4f  [email protected]
00000100: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000110: 0000 0000 0000 0000 5045 0000 6486 0600  ........PE..d...
00000120: 4c88 ea5a 0000 0000 0000 0000 f000 2200  L..Z..........".
00000130: 0b02 0a00 00fe 0a00 0092 0b00 0000 0000  ................
00000140: c0e4 0800 0010 0000 0000 0040 0100 0000  ...........@....
00000150: 0010 0000 0002 0000 0500 0200 0000 0000  ................
00000160: 0500 0200 0000 0000 0020 1b00 0004 0000  ......... ......
00000170: 489f 1700 0300 4081 0000 1000 0000 0000  H.....@.........
00000180: 0010 0000 0000 0000 0000 1000 0000 0000  ................
00000190: 0010 0000 0000 0000 0000 0000 1000 0000  ................
000001a0: 0000 0000 0000 0000 8cc6 0e00 6801 0000  ............h...
000001b0: 0030 1400 9cd6 0600 00a0 1300 a884 0000  .0..............
000001c0: 0094 1600 2019 0000 0010 1b00 2001 0000  .... ....... ...
000001d0: e01c 0b00 1c00 0000 0000 0000 0000 0000  ................
000001e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

首先注意MZ前两个字节,然后是 DOS 程序的数据,告诉您如果尝试在 DOS 下运行该程序,则无法在 DOS 下运行,然后是PE字节 280 和 281 中的签名。您还可以在文本编辑器中看到这些特定元素,尽管阅读起来要困难得多。

但请注意,也有可能它根本不是 Windows 可执行文件,只是有人给它起了错误的名字。Windows 通常会将某个文件识别为 16 位可执行文件,并说这就是它无法运行它的原因。

答案2

如果 Windows 无法运行您的应用程序(因为它是 16 位),它会明确地告诉您。无需猜测。

Windows 10 保留了以前版本的兼容性策略;64 位版本无法运行 16 位软件。32 位版本可以运行 16 位软件,但与以前的版本不同,您需要通过 Windows 功能添加 NTVDM 支持。

相关内容