重定位表
一、程序加载过程
1、每个程序都有一个独立的4G内存空间,当你双击一个程序时,操作系统就为你开辟一个虚拟的4g内存空间,然后就开始贴图,将各个PE文件贴到内存空间,当贴完之后,eip指向程序入口点就开始跑了
2、一般情况下,EXE都是可以按照ImageBase的地址进行加载的.因为Exe拥有自己独立的4GB 的虚拟内存空间,但DLL不是 ,DLL是有EXE使用它,才加载到相关EXE的进程空间的.
3、为了提高搜索的速度,模块间地址也是要对齐的 模块地址对齐为10000H 也就是64K
二、定位重定位表
可选PE头的最后一个成员属性IMAGE_DATA_DIRECTORY DataDirectory,成员属性有16个,第六个存储就是导出表的位置
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
三、重定位表的结构
typedef struct _IMAGE_BASE_RELOCATION {
DWORD VirtualAddress;
DWORD SizeOfBlock;
} IMAGE_BASE_RELOCATION;
typedef IMAGE_BASE_RELOCATION ,* PIMAGE_BASE_RELOCATION;
1、物理内存上,每个内存大小为4kb
2、4kb为一个物理页
3、一个物理页创建一张重定位表
4、内存中的页大小是1000H,也就是说2的12次方,可以表示所有可能,但是内存对齐比,不可能分12位,所以分了16位(2字节)
5、高四位代表类型:值为3代表的是需要修改的数据,值为0代表的是用于数据对齐的数据,可以不用修改.也就是说我们只关注高4位的值为3的就可以了
四、重定位表解析
重定位表是由一堆表组成的,如图,每个格子代表1个字节,VirtualAddress和SizeOfBlock各占4字节,SizeOfBlock中存储着当前这张表有多大,
比如要修改800123,800124,为了存储这些地址方便,用VirtualAddress存储800000,123或者124用当前这张表剩余的地址存
当查到8个字节都为0时,说明重定位表到此结束