PE Header 是PE相关结构NT映像头(IMAGE_NT_HEADER)的简称。里面包含了许多PE装载器用到的重要字段。
先看看该结构体:
第一个参数是一个标志。在一个有效的PE文件里, Signature 字段被设置为 00004550h , ASCI|| 字符码是: PE00 。标志着PE文件的开头。
看看下面的这个例子,使用UE查看的16进制代码:
第二个参数是:IMAGE_FILE_HEADER。如下图:
说完了这个 IMAGE_FILE_HEADER 结构,那么接下来就是第三个参数OptionalHeader。
先看看这个结构体的定义吧。
这是个可选映像头,是一个可选的结构体。里面定义了很多PE文件的属性。
然而 这个结构体的大部分字段不重要的,虽然这么多。重点掌握上面的注释以 “//---!!!!!!*****”的字段。
下面是各字段的解释:
AddressOfEntryPoint 字段
指出文件被执行时的入口地址,这是一个RVA地址。若在一个可执行文件上附加了一段代码并想让这段代码首先被执行,呢么只需要将这个入口地址指向附加的代码就行了。
ImageBase 字段:
之初文件的有点先装入地址,也就是当文件被执行时,若可能,Windows有限将文件装入到ImageBase 字段指向的地址中,只有指定的地址已经被其他的模块使用时,文件才被装入到其他地址中,链接器产生可执行文件的时候对应 这个 地址来生成机器码。当文件被装入这个地址时不需要进行重定位操作,装入速度最快,若文件被装载到其他的地址,将不得不进行重定位操作。
在链接的时候,可以自定义优先装载地址,如果不指定这个选项话,一般地EXE文件的默认装载地址是00400 0000h,而DLL文件的默认优先装土地址被定位1000 0000h。
SectionAlignment 和 FileAlignment字段
SectionAlignment字段指定了字节被装入内存 后的对齐的单位,每个字节被装入的地址必定是本子段指定的数值的整数倍。而FileAlignment字段指定了存储在磁盘文件中的对齐的单位。通常来讲X86CPU的内存对齐页面大小是4KB。
Subsystem 字段
指定使用界面的子系统。这个字段决定了系统如何为程序建立初始化的界面,连接时的/subsystem:xxx 选项指定的就是这个字段的值。
DataDirectory 字段
数据目录表。这个字段是一个指针,它由16个相同的 IMAGE_DATA_DIRECTORY,结构组成。虽然PE文件中的数据是按照装入内存后的页属性归类而被放在不同的字节中,但是这些处于各个字节中的数据按照用途可以被分为导出表,导入表,资源,重定位表等数据块,这个16个IMAGE_DATA_DIRECTORY 结构就是用来定义多种不同的数据块。它的定义很简单,仅仅指出了某种数据块的位置和长度:
在PE文件中寻找特定的数据时,就是从这些IMAGE_DATA_DIRECTORY 结构开始的。