重定位表
记录一下对重定位表的理解。
在结构数组DataDirectory中第二个元素就与重定位表有关,可以通过其中的VirtualAddress找到重定位表,重定位表有时并不为一个。
上图所示的就是重定位表的结构,下面来解释一下一些东西
1.SizeOfBlock,存的是重定位表以及后面的块区的大小,可以通过第一个重定位表的地址加上SizeOfBlock来定位下一个重定位表
2.VirtualAddress中存的值与块区中的两个字节大小的值相加可以确定要修改的数据的地址
3.块区中每个单元都是两个字节,共16位。我们把一个重定位表能搜素的范围称之为一页,一页就是1000h,转换成10进制就是4096,也就是2的12次方,因此,表达页中的一个地址只需要12位就可以了,所以我们把16位拆成了高4位和低12位,其中高四位来表示地址所存的只要不要修改,0000即不要修改,0011即要修改,而后16位就表示偏移地址,块区的大小可以通过(SizeOfBlock-0x8)/2得到。
4.重定位表有很多,当重定位的VirtualAddress和SizeOfBlock都为0时,那么这张重定位表就标志这结尾
5.重定位表的作用:当文件往内存中加载时,有时候ImageBase所代表的地址究竟被占用,所以模块需要向后位移,没有按照ImageBase加载。因为模块的有些指令存贮的时绝对地址,是固定的,不会随ImageBase修改而修改,因此会造成错误。所以重定位表就是记录了这些要修改的数据的地址。

浙公网安备 33010602011771号