本文已参与「新人创作礼」活动,一起开启掘金创作之路。
参考:
定义
PE文件是windows系统中遵循PE结构的文件,比如以.exe .dll为后缀名的文件以及系统驱动文件sys。
PE组成
PE文件大体分为两部分,头(包括下图中的DOS头,PE文件头,块表)与主体(块)。
DOS头
每个PE文件都是以DOS头开始的 DOS头由DOS 'MZ' HEADER 和DOS stub组成,DOS "MZ"头中的MZ是PE文件的一个标志之一。
PE文件头
PE文件头记录了PE文件中所有的数据的组织方式,它类似于一本书的目录,通过目录我们可以快速定位到某个具体的章节;通过PE文件头部分对某些数据结构的描述,我们也可以定位到那些不在头文件部的信息,比如导入表数据、导出表数据、资源表数据等。
块表
区块头表
pe文件头与原始数据之间存在一个区块表 区块表包含了每个块在映像(内存)中的信息,分别指向不同的区块实体。
区块
PE文件至少要有两个区块,代码块.text 数据块.data。(代码段,数据段)
主体块
相关与内存概念
文件偏移地址(File Offset Address) :文件相对于文件开头的偏移,当PE文件储存在某个磁盘当中的时候,某个数据的位置相对于文件头的偏移量。
装载基址(Image Base) :PE装入内存时的基地址,EXE在内存中的基地址是0x00400000,DLL的基地址是0x10000000,这些位置可以通过修改编译选项更改
虚拟内存地址 (Virtual Address, VA) :PE文件中的指令被装入内存后的地址
相对虚拟地址(Relative Virtual Address,RVA) :相对虚拟地址是内存地址相对于映射基地址偏移量
虚拟内存地址、装载基址、相对虚拟地址之间的关系
VA= Image base+ RVA
PE文件地址与 虚拟地址VA(virtualAddress)之间的转换
PE映射到内存中
节偏移
节偏移 :PE文件中的数据按照磁盘数据标准存放,以0x200字节为基本单位进行组织,当PE文件装载到内存时,将按照内存数据标准存放,以0x1000字节为基本单位,所以文件偏移地址和相对虚拟内存会有细微的差别,这种差别称为节偏移
SectionAlignment : 内存当中的块对齐数,一般为0x1000。
FileAlignment :磁盘当中块对齐数,一般为0x200。
文件偏移地址、虚拟内存地址、装载基址、相对虚拟地址和节偏移之间的关系
文件偏移地址 = 虚拟内存地址(VA)- 装载基址(ImageBase)- 节偏移
= RVA –节偏移
入口点(OEP)
入口点(Original Entry Point) : 首先明确一个概念就是OEP是一个RVA,然后使用OEP +Imagebase ==入口点的VA,通常情况下,OEP指向的不是main函数。