欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

基址重定位的简单学习

基址重定位的简单学习

文章标题:基址重定位的简单学习。
文章
作者邮箱: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)

下面是基址重定位时的一段汇编代码,其重定位过程就是遵从上面的公式进行重定位的。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功