PE是目前Windows平台上主流的可执行文件格式,包括常见的可执行程序EXE文件、动态链接库DLL文件等。
学习PE文件格式对于了解windows操作系统是必不可少的。
与PE有关的基本概念
地址
虚拟内存地址(Virtual Address, VA)PE文件中的指令被装入内存后的地址。
相对虚拟内存地址(Reverse Virtual Address, RVA相对虚拟地址是内存地址相对于映射基址的偏移量。
文件偏移地址(File Offset Address, FOA)数据在PE文件中的地址叫文件偏移地址,这是文件在磁盘上存放时相对于文件开头的偏移。
装在基址(Image base)PE装入内存时的基地址。默认情况下,EXE文件在内存中的基地址时0x00400000, DLL文件是0x10000000。这些位置可以通过修改编译选项更改。
虚拟内存地址、映射基址、相对虚拟内存地址的关系:
VA = Image Base + RVA
文件偏移是相对于文件开始处0字节的偏移,相对虚拟地址则是相对于装载基址0x00400000处的偏移。(1)PE文件中的数据按照磁盘数据标准存放,以0x200字节为基本单位进行组织,PE数据节的大小永远是0x200的整数倍。(2)当代码装入内存后,将按照内存数据标准存放,并以0x1000字节为基本单位进行组织,内存中的节总是0x1000的整数倍。
内存中数据节相对于装载基址的偏移量和文件中数据节的偏移量的差异称为节偏移。
文件偏移地址 = 虚拟内存地址(VA) - 装载基址(Image Base) - 节偏移
= RVA - 节偏移
DOS头的下面是DOS Stub。整个DOS Stub是一个字节块,其内容随着链接时使用的链接器不同而不同,PE中并没有与之对应的相关结构。
PE头部解析
紧跟在DOS stub后面的是PE头标识Signature。与大部分文件格式的头部结构一样,PE头部信息中有一个四字节的标识,其内容固定,对应的ASCII码的字符串是“PE00”。
PE头IMAGE_NT_HEADERS
IMAGE_NT_HEADERS是广义上的PE头,在标准的PE文件中其大小为456个字节,由4个字节的PE标识符 + IMAGE_FILE_HEADER + IMAGE_OPTIONAL_HEADER32组成。
IMAGE_NT_HEADERS {
DWORD Signature; // +0000h - PE文件标识,“PE00”
IMAGE_FILE_HEADER FileHeader; // +0004h - PE标准头
IMAGE_OPTIONAL_HEADER32 OptionalHeader; // +0018h - PE扩展头
}
标准PE头IMAGE_FILE_HEADER
标准PE头IMAGE_FILE_HEADER紧跟在PE头标识后,即位于IMAGE_DOS_HEADER的e_lfanew + 4的位置。由此位置开始的20个字节为数据结构标准PE头IMAGE_FILE_HEADER的内容。它记录了PE文件的全局属性,如该PE文件运行的平台、PE文件类型、文件中存在的节的总数等
欢迎分享,转载请注明来源:品搜搜测评网