最近在学习关于PE文件的相关知识,在这里进行简单的关于PE文件格式基本结构的梳理。本人菜鸟,如有错误,敬请指教!
PE文件是Windows操作系统下使用的可执行文件格式,主要有PE头和PE体两部分组成。其中,PE头DOS头、DOS存根、NT头、节区头几部分,余下的节区合称为PE体。
一、DOS头
为了兼容DOS文件,PE头的最前面为IMAGE_DOS_HEADER结构体,大小有64字节。其中重要的两个成员:
e_magic:DOS签名signature,4D5A=>"MZ";
e_lfanew:指示NT头的偏移。
二、DOS存根
可选项,大小不固定。
三、NT头
IMAGE_NT_HEADERS结构体,该结构体由三个成员组成,第一个为签名结构体,其值为50450000h("PE00");另外两个分别为文件头和可选头。
3.1文件头
文件头是表现文件大致属性的IMAGE_FILE_HEADER结构体。重要成员有4个:
Machine:CPU唯一的Machine码;
NumberOfSection:节区数量;
SizeOfOptionalHeader:可选头结构体的大小;
Characteristics:标识文件的属性,文件是否是可运行状态、是否为DLL文件等信息,以bit OR形式组合。
TimeDateStamp:编译器创建此文件的时间,有的编译器未提供。
3.2可选头
IMAGE_OPTIONAL_HEADER32是PE头结构体重最大的。
Magic:10B-->IMAGE_OPTIONAL_HEADER32;20B-->IMAGE_OPTIONAL_HEADER64;
AddressOfEntryPoint:EP入口点的RVA值,该值为程序最先执行的代码起始地址;
ImageBase:指出文件的优先装入地址;
SectionAlignment,FileAlignment:分别表示节区在内存和磁盘文件中的最小单位;
SizeOfImage:加载PE到内存时,PE image在虚拟内存中所占大小;
SizeOfHeaders:PE头大小;
Subsystem:区分系统驱动文件、普通可执行文件。
四、节区头
PE文件中的code(代码)、data(数据)、resource(资源)等按照属性分类存储在不同节区,并不仅仅局限于这三种节区类型,这三种是最常见的,《加密与解密》中列举了十多种节区属性。
IMAGE_SECTION_HEADER结构体,每一个结构体对应一个节区。
VirtualSize:内存中节区所占大小;
VirtualAddress:内存中节区的起始位置;
SizeOfRawData:磁盘文件中节区所占大小;
PointerToRawData磁盘文件中节区起始位置;
Characteristics:节区属性。
利用PEview软件查看EXE文件的代码,可以清晰的看到上述结构体,需要进一步对其进行理解与分析。
理解到这儿,记下来我就蒙蔽了。。。
不写了,继续去看节区的内容了!