我正在开发一个程序,该程序将解析 PE 对象以获取各种信息。
虽然阅读规范,但我无法找出 MZ 字节存在的原因,因为我无法在这 2 个字节应该代表的机器类型列表中找到它。
谁能澄清一下?
我正在开发一个程序,该程序将解析 PE 对象以获取各种信息。
虽然阅读规范,但我无法找出 MZ 字节存在的原因,因为我无法在这 2 个字节应该代表的机器类型列表中找到它。
谁能澄清一下?
MZ 签名是 MS-DOS 可重定位 16 位 EXE 格式使用的签名。
PE 二进制文件包含 MZ 标头的原因是为了向后兼容。如果可执行文件在基于 DOS 的系统上运行,它将运行 MZ 版本(它几乎总是只是表示您需要在 Win32 系统上运行程序的存根)。
当然,在当今世界从 DOS 过渡到之后的任何东西时,这并不像现在那么有用。
当时有一些程序实际上将 DOS 版本和 Win32 版本绑定在一个二进制文件中。
和大多数涉及 Windows 历史的事情一样,Raymond Chen 有一些关于这个主题的有趣文章:
Thety 是 Microsoft 程序员的首字母,并将文件标识为 DOS 可执行文件,请参阅http://en.wikipedia.org/wiki/DOS_executable了解更多信息。
正如我所看到的,通过阅读维基百科文章和Iczelion 的 PE 教程,它只是为了保持兼容性并启用 dos 或 HX DOS Extender 来执行 MZ 标头旁边的某些代码。
从devsource可以找到更多信息,例如 MZ 代表 MS-DOS 开发人员之一的 Mark Zbikowski。以及操作系统如何表现和处理来自 MZ 标头的数据。
Mark Zbikowski 将他的姓名缩写放入原始的 MS-DOS exe 格式。这个签名对于区分 .EXE 文件和 DOS 上更简单的 .COM 格式是必要的。
每个 PE 文件还包含一个 16 位 DOS 程序,因此以这个 .EXE 头文件开头。此 DOS 程序通常会打印出“此程序需要 Microsoft Windows”或类似内容。我不知道现代编译器是否仍然产生 DOS 存根,但 PE 标准仍然说 PE 以 16 位 EXE 标头开头。
在 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
它是 dos 可执行文件的“幻数”。你可以忽略的旧东西。