Electronic Joint Business

Solution for E-Business

Windows PE文件结构详解

可执行文件的格式是操作系统工作方式的缩影。可执行文件头部的数据是供操作系统装载文件用的,不同操作系统的运行方式不同,所以造成可执行文件的格式也各不相同。 DOS中最早出现的的COM文件是结构最简单的可执行文件,COM文件中仅仅包括可执行代码,没有附带任何“支持性”的数据,所以COM文件在使用方便的同时也存在诸多的限制:首先是没有附加数据来指定文件入口,这样,第一句执行指令必须安排在文件头部;再就是没有重定位信息,这样代码中不能有跨段操作数据的指令,造成代码和数据,甚至包括堆栈只能限制在同一个64 KB的段中。 DOS系统中又定义了另一种可执行文件,那就是我们熟悉的EXE文件,EXE文件在代码的前面加了一个文件头,文件头中包括各种说明数据,如文件入口、堆栈的位置、重定位表等等,DOS根据文件头中的信息将代码部分装入内存,根据重定位表修正代码,最后在设置好堆栈后从文件头中指定的入口开始执行。 到Windows 9x之后的年代,纯32位的可执行文件都使用微软设计的一种新的文件格式——PE格式(Portable Executable File Format/可移植的执行体)。PE格式来源于VAX/VMS系统的COFF(Common Object File Format) 格式,原因是根据MSDN介绍上说原来的NT开发组的很多成员是来自于DEC(Digital Equipment Corporation),自然他们利用现成的代码了。 我们在Windows下用C或者C++进行编程时,都是先用编译器进行编译成.obj文件, 然后再用链接器将这些中间文件连接成一个可执行文件。在编译器内部其实就是把我们可读的代码,生成机器码和数据,这是机器能够识别的,那些二进制数据组成的代码和数据所组成的一个连续的区域我们称之为节,Microsoft 的编译器把代码放进称为.text的节中,把数据放进称为.data 的节中。 可以利用Visual Studio的一个dumpbin 的工具来分析obj文件.Linker 的任务就是把不同的obj文件中的节连接生成一个PE文件, PE文件的基本结构如图所示,这是大师Matt Pietrek绘制的PE文件格式概览图。关于此图需要注意,偏移0位于图的下方,表示此图地址是从高到低显示的。 从图上PE文件格式被组织为一个线性的数据流,它由一个MS-DOS头部开始,接着是一个PE文件标志,这之后紧接着PE文件头和可选头部。这些之后是所有的段头部,段头部之后跟随着所有的段实体。文件的结束处是一些其它的区域,其中是一些混杂的信息,包括重分配信息、符号表信息、行号信息以及字串表数据。 在PE文件中,代码、已初始化的数据、资源和重定位信息等数据被按照属性分类放到不同的节(Section)中,而每个节的属性和位置等信息用一个IMAGE_SECTION_HEADER结构来描述,所有的IMAGE_SECTION_HEADER结构组成一个节表(Section Table),节表数据在PE文件中被放在所有节数据的前面。我们知道,Win32中可以对每个内存页分别指定可执行、可读写等属性,PE文件将同样属性的数据分类放在一起是为了统一描述这些数据装入内存后的页面属性。 由于数据是按照属性在节中放置的,不同用途但是属性相同的数据(如导入表、导出表以及.const段指定的只读数据)可能被放在同一个节中,所以PE文件中还用一系列的数据目录结构IMAGE_DATA_DIRECTORY来分别指明这些数据的位置,数据目录表和其他描述文件属性的数据合在一起称为PE文件头,PE文件头被放置在节和节表的前面。 参考 PE格式的深入理解 用UltraEdit学习PE格式 PE格式详解 Win32汇编教程 No related content found.×Scan to share with WeChat

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.