基址重定位表(Base Relocation Table),记录PE重定位时需要修改的硬编码地址的位置。
一般地,向进程的虚拟内存加载PE文件(EXE、DLL、SYS)时,文件会被加载到PE头的ImageBase所指的地址处。若加载的文件为DLL或SYS,且ImageBase位置加载了其他DLL或SYS文件时,则会进行PE重定位。
PE重定位是指PE文件无法加载到ImageBase所指位置时,而加载到其他地址所发生的一系列的处理行为。
因为在进程创建好之后,EXE文件会首先加载到内存中,因而EXE无须考虑重定位的问题。Windows Vista之后的版本引入ASLR机制,每次运行PE文件都会被加载到随机地址。
系统的DLL实际不会发生重定位,因为同一系统的kernel32.dll、user32.dll等会被加载到自身固有的ImageBase。
下面以Win7的notepad.exe程序为例,先使用PEView打开该程序查看ImageBase的值为01000000,再使用Ollydbg打开该程序查看。
可以看到,在EP代码中,方框中的地址是以硬编码的形式存在的。其中地址5810FC和581100是.text节区的IAT区域,地址58C0A4为.data节区的全局变量。每当在Ollydbg中重启notepad.exe程序,地址值就会随加载地址