重定位就是把程序的逻辑地址空间变换成内存中的实际物理地址空间的过程,也就是说在装入时对目标程序中指令和数据的修改过程。
为什么需要重定位?
程序员在编写程序时,在使用某些常量、全局变量时,编译器把这些数据的地址编译成一个绝对地址(比如:call 0x400100),是以ImageBase(0x400000)为基准。当程序加载到ImageBase时,程序正常运行,可是当程序加载地址为0x500000时,访问的绝对地址是一个错误地址,实际应该为call 0x500100,这时就用到了重定位技术。重定位就是修改编译时某些绝对地址的过程。
怎样实现重定位?
1、汇编实现
dwVar dw ? ;全局变量需要重定位
push ebx
call Flg
Flg:
pop ebx
sub ebx, offset Flg
mov dwVar, ebx;dwVar 保存了自身的运行地址 - 编译地址
pop ebx
2、高