我正在开发一个程序,它会解析PE对象的各种信息。 阅读规范虽然,我找不到为什么MZ字节 有人可以澄清吗? 解决方案 MZ签名是MS-DOS可重定位16位EXE格式使用的签名。 PE二进制包含MZ头的原因是为了向后兼容。如果可执行文件在基于DOS的系统上运行,它将运行MZ版本(几乎总是只是存根,说你需要在Win32系统上运行程序)。 当然,这并不像现在世界从DOS转移到后来的任何时候一样有用。 当时有几个程序实际上将一个DOS版本和Win32版本绑定在一个单一的二进制。 和大多数事情处理Windows历史,雷蒙陈有一些有趣的文章此主题: 为什么损坏的二进制文件有时会导致”程序太大而无法放入内存中?“ COM和EXE扩展之间有什么区别?
以下是关于 pe 的编程技术问答
我正在开发一个程序,该程序将解析 PE 对象以获取各种信息. 虽然阅读规范,但我无法找出 MZ 字节存在的原因,因为我无法在这两个字节应该代表的机器类型列表中找到它. 谁能澄清一下? 解决方案 MZ 签名是 MS-DOS 可重定位 16 位 EXE 格式使用的签名. PE 二进制文件包含 MZ 标头的原因是为了向后兼容.如果可执行文件在基于 DOS 的系统上运行,它将运行 MZ 版本(它几乎总是只是表示您需要在 Win32 系统上运行程序的存根). 当然,在当今世界从 DOS 过渡到之后的任何东西时,这并不像现在那么有用. 当时有一些程序实际上可以将 DOS 版本和 Win32 版本绑定到一个二进制文件中. 与大多数涉及 Windows 历史的事情一样,Raymond Chen 有一些关于这个主题的有趣文章: 为什么损坏的二进制文件有时会导致“程序太大而无法放入内存"? COM 和 EXE 扩展有什么区别?
我正在搞乱一些相当低的级别的东西,并尝试确定我用corflags.exe实用程序获得不同的输出.供参考,输出如下: $ corflags test2.exe Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 4.0.30319.17929 Copyright (c) Microsoft Corporation. All rights reserved. Version : v4.0.30319 CLR Header: 2.5 PE : PE32 CorFlags : 0x1 ILONLY : 1 32BITREQ : 0 32BITPREF : 0 Signed : 0 $ corflags test.exe Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 4.0.30319.179
我正在尝试为 Windows 编写一个 exe 打包程序.到目前为止,我已经完成了一些基础知识.我要做的部分是读取“绑定导入目录表"(或 .idata 部分?),基本上是 PE 文件的部分,其中包含加载程序需要导入的 DLL 列表. 我想知道最好的方法是什么: [A] 找出 IAT 在哪里(因为对几个不同的 .exe 运行 PEView 似乎表明该列表可以包含在多个不同的位置),然后读取该列表 或 [B]只要想办法直接读取exe需要导入的DLL列表即可. 有没有办法做到这一点?关于 IAT 应该在哪里以及如何阅读,人们是否可以推荐任何进一步的阅读材料? 解决方案 是的,您可以通过遍历可执行文件的标头找到 IAT.在 winnt.h 中查找标头声明. 有关如何在标头中查找信息的详细说明,请参阅 Matt Pietrek 在 MSDN 杂志 中的系列文章,“深入了解 Win32 可移植可执行文件格式",部分 我 和 II. 您还可以从此处获取