数据目录的IMAGE_DIRECTORY_ENTRY_BASERELOC项指向此结构,由于在Windows系统中DLL(动态链接库)文件并不是每次都能加载到预设的基址(ImageBase)上,因此基址重定位主要应用于DLL文件中。
一般情况下重定位表位于一个名为.reloc的区块内,PE文件中的重定位结构是由多个IMAGE_BASE_RELOCATION子结构组成的,每个子结构只负责描述一个4KB大小的分页内重定位信息,也就是PE文件中需要重定位的部分每隔0x1000字节大小的区域就要有一个。
基址重定位表的结构:
typedef struct _IMAGE_BASE_RELOCATION{
DWORD VirtualAddress; //需重定位数据的其实RAV
DWORD SizeOfBloce; //本结构与TypeOffset总大小
}IMAGE_BASE_RELOCATION;
typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;
VirtualAddress:指向PE文件中需要重定位数据的RAV,由于每个重定位结构体只负责描述0x1000字节大小区域的重定位信息,因此这个字段的值总是0x1000的倍数。
SizeOfBlock:描述IMAGE_BASE_RELOCATION结构体与重定位数组TypeOffset的体积总大小(IMAGE_SIZEOF_BASE_RELOCATION+2*n)。
数据目录表之调试:
数据目录的IMAGE_DIRECTORY_ENTRY_DEBUG指向此结构,往往保证在一个名为.debug的区段里,主要负责协助第三方程序调试本程序,并为其提供调试数据块的位置与大小。调试目录使用一个名为IMAGE_DEBUG_DIRECTORY的结构作为索引,用数据