首页
社区
课程
招聘
[原创]基址重定位的简单学习
发表于: 2012-7-2 12:51 12120

[原创]基址重定位的简单学习

2012-7-2 12:51
12120

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


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


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (5)
雪    币: 62
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
nice~~~~~~
2012-7-2 13:05
0
雪    币: 1254
活跃值: (720)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
good ~~~~~~
2012-7-2 13:48
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
写的不错 复习了一遍
2012-7-9 14:00
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
beautiful ~~~~~~
2012-7-9 14:18
0
雪    币: 350
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
yamiedie
2012-7-9 14:28
0
游客
登录 | 注册 方可回帖
返回
//