之前的笔记搬运
0x1 重定位表结构
重定位表位于PE文件中的数据目录数组下标为5的位置
1 | struct _IMAGE_BASE_RELOCATION { |
TypeOffset: 是一个数组,数组每项大小为两个字节(16位),它由高 4位和低
12位组成,高 4位代表重定位类型,低
12位是重定位地址。和VirtualAddress这个值相加就是需要修正的数据地方的指针
重定位表一般的情况下是会在单独的一个节里, 节名称为: .reloc
0x2 什么是重定位表
重定位就是你本来这个程序理论上要占据这个地址,但是由于某种原因,这个地址现在不能让你霸占,你必须转移到别的地址,这就需要基址重定位。而这个重定位表就是记录哪些地址需要移动到别的地方
0x3 为什么需要重定位表
如: 全局变量的地址, 这样的地址都写死文件二进制里
0040100E push 0040200
这样一句代码在文件中的二进制是: 68 00 20 40 00
如果程序可以正确加载在00400000的位置, 这句代码是没有问题的,但是如果程序没有在00400000站住脚, 加载在00800000时, 那么执行此句代码时,依旧是访问00402000这个地址, 此时如果有重定位表就可以把push 00402000修正为 push 00802000