我有一个.exe无法在 Windows 10 上运行的文件。我怀疑这是因为二进制文件是 16 位的。有没有简单的检查方法?像亚历山大雷沃的回答会很棒。
Windows 已多次扩展旧的 DOS 可执行文件格式,因此如果您查看“现代”Windows 可执行文件,就会在开头附近有一个MZ(或者,ZM如果可执行文件适用于使用相反位顺序的系统)。这指定了第二种DOS 可执行格式的标题,简称为 MZ 格式。
除此之外,您会看到一些明显的胡言乱语,然后是“此程序不能在 DOS 模式下运行。”之类的内容。那个乱码实际上是一个非常简单的 DOS 程序,它打印出一条消息告诉用户该程序不能在 DOS 中运行。
之后,您就有了实际可执行文件的标题,它可能以四对字母中的一个开头,NE, LX, LE, 或PE。如果您没有看到这些和上面提到的消息之一,则它是一个 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 .q@O...ORich...O
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 ................
Run Code Online (Sandbox Code Playgroud)
首先注意前MZ两个字节中的 ,然后是 DOS 程序的数据,它告诉您如果您尝试在 DOS 下运行它,则它不能在 DOS 下运行,然后是PE字节 280 和 281 中的签名。您也可以在文本编辑器中查看这些特定元素,尽管阅读起来困难得多。
但是请注意,也有可能它根本不是 Windows 可执行文件,只是有人给它起了错误的名字。Windows 通常会将某些内容识别为 16 位可执行文件,并说这就是它无法运行的原因。
| 归档时间: |
|
| 查看次数: |
3156 次 |
| 最近记录: |