PE文件
Ⅰ PE文件的结构
1.概论
- DOS系统中的COM文件:仅仅包含可执行代码,没有附加数据来指定文件入口,因此第一行执行指令必须在文件头部。没有重定位信息,因此代码中不能有跨段操作数据的指令。
- EXE文件:在代码前加了一个文件头,包含各种说明数据,操作系统根据文件头中的信息将代码部分装入内存,根据重定位表修正代码,从文件头中指定的入口开始执行。
- PE文件:代码、已初始化的数据、资源和重定位信息按照属性分类到不同的节中,每个节的属性和位置信息用一个IMAGE_SECTION_HEADER结构来描述,所有的ISH组成一个节表。
2.DOS文件头和DOS块
-
DOS_HEADER的部分比较重要的是signature为MZ表示其为PE文件
-
还有就是最后的e_lfanew字段,指出了真正的PE文件头在文件中的位置
- DOS部分执行代码只是一个提示“this program cannot be run…”
3.PE文件头
IMAGE_FILE_HEADER
- Machine:指定文件的运行平台
- NumberofSections:节的数量
- TimeDateStamp:编译器创建此文件的时间
- SizeofOptionalHeader:00e0h
- Characteristics:属性标志字段
IMAGE_OPTIONAL_HEADER32
可以与上一个结构不加以区别
-
AddressOfEntryPoint:文件被执行时的入口地址
-
ImageBase:文件的优先装入地址,只有指定的地址被其他模块使用时才会被装入到其他地址。exe文件使用独立的虚拟地址空间,总是能够按这个地址装入。dll文件不能保证优先装入地址没有被其他的dll使用,因此必须包含重定位信息。exe默认:0040000h,dll默认:10000000h
-
SectionAlignment和FileAlignment:节被装入内存后的对齐单位和节存储在磁盘文件中的对齐单位
-
Subsystem:指定使用的界面子系统
-
DataDirectory:定义不同用途的数据块,存储着RVA和长度
4.节表和节
节表
也即IMAGE_SECTION_HEADER,其总数与NumberofSections相同
-
name:只是字符串
-
VirtualSize:节的大小,节的数据在没有进行对齐处理前的实际大小
-
VirtualAddress:节被装载到内存中后的偏移地址,是一个RVA,按照内存页对齐
-
PointerToRawData:节在磁盘文件中所处的位置,文件头开始算起的偏移量
-
SizeOfRawData:节在磁盘文件中所占的空间大小,等于VirtualSize按FileAlignment对齐后的大小
依靠上面四个字段的值,装载器就可以从PE文件中找出某个节的数据并将其映射到内存中(映射到模块基地址开始偏移VirtualSize的地方,并占用以VirtualSize的值按照页的尺寸对齐后的空间大小)
-
Characteristics:属性标志字段
欢迎指正