PE文件是windows 下的一种可移植执行体,其设计目的使用来解决跨平台问题(但实际上只是在windows下使用)。通常在windows下使用的.exe .dll .sys等文件都是PE文件,符合PE文件格式规范,有其自身的格式。不熟悉的朋友也可以网上查找相关资料。
PE文件的.reloc 节 即是使用了PE重定位技术。PE加载到进程虚拟地址时,会加载到PE中的IMAGE_OPTIONAL_HEADER结构体中ImageBase(DWORD)字段所指示的位置,一般.exe文件为4000000H,而.dll 文件为1000000H。但是一个PE依赖的DLL多数情况下不止一个!写一个简单的C程序,可能调用了kernel32.dll和User.dll等系统组件。而若先将kernel32.dll加载到1000000H的位置,User.dll 再加载到这个位置就会覆盖,所以加载器作了DLL重定位,将User.dll加载到其他位置,防止发生冲突。
win7与vista之前没有引入ASLR安全机制,所以.exe文件在加载后位置都是固定在ImageBase处。
windowsPE重定位操作基本步骤:
1、查找PE代码中硬编码的位置;
2、做相关运算,若地址值为x,ImageBase - x 进行Virtual Address 到 Relative Virtual Address 的运算,最后再加上实际加载的地址。
因为一般的.exe程序中reloc节几乎对运行无影响,可以直接删除(但dll和系统驱动好像都是必须的)。下面记录删除过程:
工具:任意一中PE查看器和十六进制编辑器(本文使用HexEdit和PETool&#