PE相关
PE文件格式
PE文件是windows下的32位可执行文件格式,64位称为PE+或PE32+
文件中使用偏移(offset)内存中使用VA(Virtual Address)来表示位置,VA指的是进程虚拟内存中的绝对地址,RVA(Relative Virtual Address)指从某个基准位置(ImageBase)开始的相对地址,RVA+ImageBase=VA
PE头
在PE头的最前面有IMAGE_DOS_HEADER结构体,即DOS头,大小为64字节,比较重要的成员是e_magic(DOS签名,4D5A=>ASCII值"MZ",位于结构体的第一个),e_lfanew (指示NT头的偏移【根据不同文件拥有可变值】),使用winhex打开windows自带的notepad文件,结构体情况如下(用notepad.exe文件演示)
文件开始的2个字节为4D5A,e_lfanew值为0000000E(Intel系列的CPU以逆序存储数据,称为小端序标识法)
DOS存根在DOS头下方,目的是让程序可以在DOS环境中运行
NT头
NT头IMAGE_NT_HEADERS由三个成员组成,大小为F8
第一个成员:签名(Signature)结构体
Signature从0xE0开始
第二个成员:文件头(File Header)
File Header为表现文件大致属性的文件头,IMAGE_FILE_HEADER结构体,重要成员:
1、Machine:标识兼容的CPU,本程序中值为0x014C,兼容Intel386
2、NumberOfSection:用于指出文件中存在的节区数量,该值一定要大于0,且当定于的节区数量与实际节区不同时,将发生运行错误,本程序中值为0x0003
3、SizeOfOptionalHeader:用于指出最后一个NT头成员的大小,本程序中值为0x00E0
4、Characteristics:用于标识文件的属性,文件是否是可运行的形态,是否为DLL文件等信息,本程序中值为0x010F
第三个成员:可选头(Optional Header)
Optional Header为IMAGE_OPTIONAL_HEADER32结构体,重要成员:
1、Magic:Magic码为0x10B时,为IMAGE_OPTIONAL_HEADER32结构体,Magic码为0x20B时,为IMAGE_OPTIONAL_HEADER64结构体
2、AddressOfEntryPoint:持有EP的RVA值,指出程序最先执行的代码起始地址
3、ImageBase:指出文件的优先装入地址,一般情况下EXE文件的ImageBase值为0x00400000,DLL文件为0x10000000,执行PE文件时,PE装载器先创建进程,再将文件载入内存,然后把EIP寄存器的值设置为ImageBase+AddressOfEntryPoint
4、SectionAlignment, FileAlignment:FileAlignment指定了节区在磁盘文件中的最小单位&