PE文件格式
VA是进程虚拟内存的绝对地址,RVA+ImageBase=VA
PE头
DOS头 _IMAGE_DOS_HEADER
e_magic :DOS 签名(4D5A)
e_lfanew: 指示NT头的偏移(NT头为_IMAGE_NT_HEADERS)
NT头
Signature:签名为00
File Header:文件头
Optional Header:可选头
文件头 _IMAGE_FILE_HEADER
machine很重要
NumberOfSections 用来指出文件中的存在的节区数量,该值一定要大于0
SizeOfOptionalHeader 用来指出IMAGE_OPTIONAL_HEADER32结构体的长度,PE装载器需要看这个数据来识别出结构体大小
Characteristics 用来表示文件的属性,文件是否可以运行等形态,是否为DLL文件等属性。
可选头 _IMAGE_OPTIONAL_HEADER32
Magic: 区分是 _IMAGE_OPTIONAL_HEADER32还是 _IMAGE_OPTIONAL_HEADER644
AddressOfEntryPoint: 持有EP的RVA值,指出程序最先执行的代码起始位置。
ImageBase:指出文件的优先装入地址,PE装载器先创建进程,再将文件载入内存里,然后把EIP寄存器的值设置为ImageBase+AddressOfEntryPoint
SectionAlignment,FileAlignment 后者指定了节区在磁盘文件中的最小单位,前者则指定了节区在内存里的最小单位
SizeOfImage:加载PE文件到内存后,SizeOfImage指定了PE Image在虚拟内存所占空间的大小。
SizeOfHeader: 指出了整个PE头的大小,第一节区所在的位置和SizeOfHeader距文件开始偏移的量相同。
NumberOfRvaAndSizes:用来指DataDirectory(IMAGE_OPTIONAL_HEADER32最后一个成员)数组的个数
DataDirectory: 是由IMAGE_DATA_DIRECTORY结构体组成的数组
节区头 IMAGE_SECTION_HEADER
Characteristics:这个属性规定了可写(读)等属性。
RVA to RAW
IAT
IMAGE_IMPORT_DESCRIPTOR
OriginalFirstThunk: INT的地址(RVA)
Name:库名称字符串的地址
FirstThunk: IAT的地址(RVA)
INT中各元素的值为IMAGE_IMPORT_BY_NAME结构体指针
INT(IMAGE_IMPORT_BY_NAME)