一、 典型的PE文件格式
1 .1 PE文件布局如下:
文件开头是一个DOS stub程序它非常简单,用于在DOS里运行应用程序,主要是向后兼容,对于逆向而言最重要的部分是一个指向PE头部的偏移量,从文件头开始向后偏移0x3c处就是这个偏移量(DOS头共64个字节最后4个字节为PE头偏移量),指示了从文件开头偏移多少是pe头(下图中0x0100为PE头开始的地方)。
DOS 头部本身只存在于映像文件里,不会出现在其他文件里,如目标文件等。 DOS 文件头的一个特性是其开始的2个字节是“魔术”字节,一般是字符 M和Z ,表明它是 DOS 映像。受此及其他因素启发,我们可以识别一个文件是否是 PE 。跳过 DOS 头(实际上它对我们没有什么用处)就是 PE 头,DOS头和PE头中间的空余位置是一些垃圾值以及编译器填充的一些“is program cannot be run in DOS mode.”或“This program must be run under Win32”等信息 。
PE头以另外的字段标识 PE 文件的开始,通常是 PE\0\0 (这里的\0 是二进制的 0 ) ,在此之后是COFF 文件头。PE头+COFF文件头称为标准PE头共24个字节
COFF文件头第一个字段是机器类型,它有 2 字节长,几乎总是 0x8664( AMD64 )或 0x14c ( IA32 ) ,很少是 0x200 ( IA64 , 安腾处理器)。之后是又一个 2 字节的字段,指示这个文件有多少个区段。按微软的说法,它的最大值为 96 。紧接着是4字节的时间戳,下一个字段比较有趣,是一个指向 COFF 符号表的文件偏移量 。作为一名逆向工程师,几乎可以肯定碰到的文件并没有符号表,因此,这个字段为 0 ,表示没有符号表。然而,如果有符号表的话,它的偏移量将在此指定。在这个字段之后是一个 4 字节的字段,指示有多少符号。最后是两个标准的 COFF 字段.都是 2 个字节,一个指示可选头部的大小(只在映像中存在上图中的可选头部大小为0x00E0共224个字节),另一个字段称为特性,定义文件中特殊的属性。
1.1.1 可选PE头
可选PE头紧接着COFF文件头,其大小在COFF文件头中给出:大小为E0H即224字节
可选头部的布局: