代码重定位
- 代码重定位是吧可执行代码从内存的一个地方移动到另一个地方去,保证该部分代码还能正常执行的一项技术
- 代码重定位的关键解决方法是使用相对地址来代替绝对地址,用寄存器访问代替全局变量的访问
PE文件头中的重定位表
PE重定位是为了便于PE加载程序时修正代码中使用的绝对地址,保证程序在不同地址空间上运行的兼容性
- 当装载时
IMAGE_OPTIONAL_HEADER32.ImageBAse
(程序装载基地址)位置已经被占用时,操作系统会重新选择另一个基地址,这是就需要根据PE中的重定位表对所有的重定位信息进行修正 - 重定位表位于数据目录的第6个目录项
重定位表项IMAGE_BASE_RELOCATION

20191021093308
- 如果PE文件中有n个重定位项,重定位表的大小为2*n+4+4
- VirtualAddress是重定位块RVA
- SizeOfBlock是该页面中重定位表的项数
- 重定位表的组织方式为页面1的IMAGE_BASE_RELOCATION后是页面1的重定位表现然后是页面2的IMAGE_BASE_RELOCATION
- 每个重定位表项大小为1个字节,每个字高4位说明此重定位项的类型,一般值只为0和3,0 代表无意义只作对齐用,3代表着双字32位都需要修正

20191021094428
- 所有的重定位块最终以一个VirtualAddress字段为0的IMAGE_BASE_RELOCATION结果作为结束