二进制入门学习笔记-7.重定位表)

重定位表

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表示这个块的大小。