10

我正在开发一个程序,该程序将解析 PE 对象以获取各种信息。

虽然阅读规范,但我无法找出 MZ 字节存在的原因,因为我无法在这 2 个字节应该代表的机器类型列表中找到它。

谁能澄清一下?

4

6 回答 6

18

MZ 签名是 MS-DOS 可重定位 16 位 EXE 格式使用的签名。

PE 二进制文件包含 MZ 标头的原因是为了向后兼容。如果可执行文件在基于 DOS 的系统上运行,它将运行 MZ 版本(它几乎总是只是表示您需要在 Win32 系统上运行程序的存根)。

当然,在当今世界从 DOS 过渡到之后的任何东西时,这并不像现在那么有用。

当时有一些程序实际上将 DOS 版本和 Win32 版本绑定在一个二进制文件中。

和大多数涉及 Windows 历史的事情一样,Raymond Chen 有一些关于这个主题的有趣文章:

于 2009-06-05T17:34:31.147 回答
8

Thety 是 Microsoft 程序员的首字母,并将文件标识为 DOS 可执行文件,请参阅http://en.wikipedia.org/wiki/DOS_executable了解更多信息。

于 2009-06-05T17:23:20.083 回答
3

正如我所看到的,通过阅读维基百科文章Iczelion 的 PE 教程,它只是为了保持兼容性并启用 dos 或 HX DOS Extender 来执行 MZ 标头旁边的某些代码。

devsource可以找到更多信息,例如 MZ 代表 MS-DOS 开发人员之一的 Mark Zbikowski。以及操作系统如何表现和处理来自 MZ 标头的数据。

于 2009-06-05T17:22:46.967 回答
3

Mark Zbikowski 将他的姓名缩写放入原始的 MS-DOS exe 格式。这个签名对于区分 .EXE 文件和 DOS 上更简单的 .COM 格式是必要的。

每个 PE 文件还包含一个 16 位 DOS 程序,因此以这个 .EXE 头文件开头。此 DOS 程序通常会打印出“此程序需要 Microsoft Windows”或类似内容。我不知道现代编译器是否仍然产生 DOS 存根,但 PE 标准仍然说 PE 以 16 位 EXE 标头开头。

于 2009-06-05T17:41:28.110 回答
2

在 Microsoft® Windows 的早期,Windows™ 1.x、2.x 和 3.xx 操作系统不仅存在于与 Microsoft® DOS 相同的卷中,而且还运行在 MS-DOS 操作系统之上。用户不仅有可能而且很有可能会尝试在 DOS 下运行某些 Windows® 程序。因此,Microsoft® 程序员确保所有 Windows® 程序都会在每个 Windows 可执行文件的前面放置一个简单的 16 位 DOS 程序,如果用户试图在 DOS 下运行 Windows® 程序,它会提醒用户。这就是 DOS“存根”程序所做的一切。资源:http ://thestarman.pcministry.com/asm/debug/DOSstub.htm

于 2014-09-20T10:34:50.067 回答
0

它是 dos 可执行文件的“幻数”。你可以忽略的旧东西。

DOS可执行文件

于 2009-06-05T17:20:53.363 回答