欢迎来到天天文库
浏览记录
ID:51890905
大小:70.00 KB
页数:11页
时间:2020-03-18
《【精品】pe文件浅析.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、pe文件一个操作系统的川执行文件格式在很多方面是这个系统的一面镜子。址然学习一个可执行文件格式通常不是一个程序员的首要任务,但是你可以从这其中学到大量的知识。在这篇文章中,我会给出Microsoft的所有基于Win32系统(如winnt,win9x)的可移植可执行(PE)文件格式的详细介绍。在可预知的未来,包括Windows2000,PE文件格式在Microsoft的操作系统屮扮演一个威要的角色。如果你在使用Win32或Winnt,那么你己经在使用PE文件了。甚至你只是在Windows3.1下使用VisualC++编程,你使用的仍然是PE文件(
2、VisualC++的32位MS-DOS扩展纽件用这个格式)。简而言之,PE格式已经普遍应用,并且在不短的将來仍是不可避免的。现在是时候找出这种新的可执行文件格式为操作系统带來的东西了。我最后不会止你盯住无穷无尽的十/'、进制Dump,也不会详细讨论页面的每一个单独的位的匝要性。代替的,我会向你介绍包含在PE文件中的概念,并且将他们和你每天都遇到的东西联系起來。比如,线程局部变最的概念,如下所述:declspec(thread)inti;我快要发疯了,直到我发现它在可执行文件屮实现起來是如此的简单并且优雅。既然你们中的许多人都有使用16Windo
3、ws的背景,我将把Win32PE文件的构造追溯到和它等价的16位NE文件。除了一个不同的可执行文件格式,Microsoft还引入了一个用它的缠逹和汇编器生成的新的目标模块格式。这个新的OBJ文件格式有许多和PE文件共同的东东。我做了许多无用功去查找这个新的OBJ文件格式的文档。所以我以自己的理解对它进行解析,并且,在这里,除了PE文件,我会描述它的一部分。大家都知I道,WindowsNT继承了VAX?VMS?和UNIX?的传统。许多WindowsNT的创始人在进入鯉前都在这些平台上进行设计和编码。当他们开始设计WindowsNT时,很自然的,为
4、了最小化项目心动时间,他们会使用以前写好的并且己经测试过的工具。用这些工具生成的并且工作的可执行和OBJ文件格式叫做COFF(CommonObjectFileFormat的首字母缩写)。COFF的相对年龄可以用八进制的域來指定。COFF本身是一个好的起点,但是需要扩展到一个现代操作系统如Windows95和WindowsNT的需要。这个更新的结果就是(PE格式)可移植可执行文件格式。它被称为“可移植的”是因为在所有平台(如x86,Alpha,MIPS等等)上实现的WindowsNT都使用相同的可执行文件格式。当然了,也有许多不同的东两如二进制代
5、码的CPU指令。重要的是操作系统的装入器和程序设计工具不需要为任何一种CPU完全匝垢就能达到目的。Microsoft抛弃现存的32位工具和可执行文件格式的爭实证实了他们想让WindowsNT刃级并且运行的更快的决心。为16位Windows编写的虚拟设备驱动程序用一种不同的32位文件布局-LE文件格式-WindowsNT111现很早以前就存在了。比这更重要的是对OBJ文件的替换!在WindowsNT的C编译器以前,所有的微软编译器都用Intel的OMF(ObjectModuleFormat)规范。就像前面提到的,Microsoft的Win32编译
6、器生成COFF格式的OBJ文件。一些微软的竞争者,如Borland和Symentec,选择放弃了COFF格式并坚持Intel的OMF文件格式。这样的结果是制作OBJ和LIB的公司为了使用多个不同的编译器,不得不为每个不同的编译器分发这些库的不同版本(如果他们不这么做)。PE文件格式在winnt.h头文件中文档化了(用最不蒂确的语言)!大约在winnth的中间部分标题为"ImageFormat”的一个快。在把MS-DOS的MZ文件头和NE文件头移入新的PE文件头之前,这个块就开始于一个小栏。WINNT.H提供PE文件用到的生鲜数据结构的定义,但只
7、有很少有助于理解这些数据结构和标志变量的注释。不管谁为PE文件格式写出这样的头文件都肯定是一个信徒无疑(突然持续地冒IBMichaelJ.O'Leary的名字來)。描述名字,连同深嵌的结构体和宏。当你R!套winnthMfr编码时,类似下血这样的表达式并不鲜见:pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress;为了有助于逻辑的理解这些winnt.h中的信息,阅读可移植可执行和公共对象文件格式的规格说明,这些在MSDN既看光盘中是
8、可用的,一直包括到2001年8月。现在让我们转换到COFF格式的OBJ文件的主体上來,WINNT.H包括COFFOBJ和LIB的结构化定义和类型定义。
此文档下载收益归作者所有