重定位表

一、程序加载过程

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时,说明重定位表到此结束

posted @ 2021-12-09 11:37  lnterpreter  阅读(249)  评论(0编辑  收藏  举报