文章标题:基址重定位的简单学习。 文章作者:xunbu7 作者邮箱:xunbu7@163.com 使用工具:HxD.exe, Windows画图工具,OD。 目标文件:加密与解密_课件\chap13\13.5 DLL文件脱壳\加壳的\ EdrLib.dll 参考资料:加密与解密(第三版), Windows.环境下32位汇编语言程序设计(第2版) 我们知道,在32位代码中,涉及到直接寻址的指令都是需要重定位的。 对操作系统来说,其任务就是在对可执行程序透明的情况下完成重定位操作。 在现实中,重定位信息是在编译的时候由编译器生成并保留在可执行文件中的,在程序被执行前由操作系统根据重定位表信息修正代码,这样在开发程序的时候就不用考虑重定位问题了。 重定位信息在PE文件中被存放在重定位表中。在PE文件没有被加载到预期的imagebase位置时,PE加载器根据下面的重定位表来确定哪些指令数据是需要修改的。 那么我们现在的重点就是重定位表的结构和使用方法了。1.基址重定位表的结构 基址重定位表是由连续的页描述块组成的。由于每一个页面的需要重定位信息(指令数目)不同,所以描述块的长度也是不同的,这一点很好理解的。 重定位表本来应该的样子: 实际的样子(为了节省空间): 下面我们来分析一下实际的重定位表的结构:2.基址重定位表的使用方法:指令(数据)的指针 = (数据项低12位+VirtualAddress)+ PE文件实际被映射的基址 重定位结果 = 需要重定位数据+( PE文件实际被映射的基址-ImageBase) 下面是基址重定位时的一段汇编代码,其重定位过程就是遵从上面的公式进行重定位的。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!