PE即Portable Executable,是Windows OS下使用的可执行文件格式。PE文件是指32位的可执行文件,亦称为PE32。64位的可执行文件称为PE+或PE32+,是PE文件的一种扩展形式。
PE文件种类如下表:
PE文件基本结构:
从DOS头至节区头是PE头部分,下面的节区合称PE体。文件的内容一般分为代码(.text)、数据(.data)、资源(.rsrc)节,分别保存。
VA&RVA:
文件中使用偏移(offset),内存中使用VA(Virtual Address虚拟地址)来表示位置。当文件加载到内存时,节区的大小和位置等会发生改变。
VA是指进程虚拟内存的绝对地址,RVA(Relative Virtual Address相对虚拟地址)是指从某个基准位置(ImageBase)开始的相对地址:RVA + ImageBase = VA
PE头内部信息大多以RVA形式存在,因为PE文件(主要是DLL)加载到进程虚拟内存的特定位置时,该位置可能已经加载了其他PE文件,此时必须通过重定位将其加载到其他空白位置。
PE头:
1、DOS头:
PE头最前面添加的IMAGE_DOS_HEADER结构体,用来扩展已有的DOS EXE头。该结构体大小为40(h)字节,其中有两个重要的成员e_magic和e_lfanew。
e_magic:DOS签名(4D5Z,即“MZ”)。
e_lfanew:指示NT头的偏移。
所有PE文件在开始部分(e_magic)都有DOS签名(“MZ”),e_lfanew值指向NT头所在位置(NT即IMAGE_NT_HEADERS)。
使用WinHex打开notepad查看:
PE文件开始即为“MZ”DOS签名,e_lfanew值为000000E0。
2、DOS存根:
DOS存根(stub)在DOS下方,是个可选项,由代码和数据混合而成,大小不固定(即使没有DOS存根,文件也可以正常运行)。
32位Windows OS不会运行其中的代码,但在DOS环境中可以运行。下面notepad示例是输出如图的字符串后便终止。
3、NT头:
IMAGE_NT_HEADERS结构体大小为F8,由3个成员组成:Signature签名结构体,其值为50450000h(“PE”00);IMAGE_FILE_HEADER文件头结构体;IMAGE_OPTIONAL_HEADER32可选头结构体。
(1)文件头:
IMAGE_FILE_HEADER结构体用于表示文件大致属性。其中有4个重要成员。
1.Machine:每个CPU都有唯一的MAchine码,如Intel 386为14C。
2.NumberOfSectio