重定位表
1.重定位表作用:
dll的地址空间可能会和别的dll冲突,并且编译器在编译的时候会将如全局变量等值以内存中绝对地址的方式存储,因此如果因为地址冲突产生了重定位,那么将无法找到真正存储的值。因此就引入了重定位表,告诉别的程序哪些地址是写死的可能需要重定位的。一般exe程序不提供重定位表是因为exe程序率先占领内存空间,基本不存在冲突。
2.重定位表定位:
1.首先找到重定位表的地址,在可选PE头的_IMAGE_DATA_DIRECTORY DataDirectory[16]
结构中的第六个结构就是重定位表,其具体结构如下:
typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress;//重定位表的RVA DWORD Size;//大小 } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
2.根据重定位表的RVA转为FOA找到真正的重定位表,其结构如下:
typedef struct _IMAGE_BASE_RELOCATION { DWORD VirtualAddress; //表示一个基址 DWORD SizeOfBlock;//该块的大小 } IMAGE_BASE_RELOCATION; typedef IMAGE_BASE_RELOCATION ,* PIMAGE_BASE_RELOCATION;
3.上面这个结构体其实是重定位表的开头
重定位表当中有很多块,均用来表示所需要修改的地址,其中VirtualAddress
相当于一个基址
,每一个具体条目的后12位
加上这个VirtualAddress
才是真正需要修改的地址,条目的高四位是用来表示是否需要修改的,值为3
表示需要修改。SizeofBlock
表示这个块的大小。