12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
三国霸业 战车-珍宝-觉醒-攻城掠地SF-全新玩法 免费玩新区 攻城掠地私服 进入游戏
手游私服盒子 各类免费游戏 0.1折送海量资源 各类手游私服 进入游戏
皇家MU2 《奇迹 2:传奇》韩国网禅公司《奇迹》正统续作。 3D锁视角Mmrpg 暗黑3+传奇+流放之路+奇迹 进入游戏
查看: 323|回复: 0

PE文件格式详细解析(六)-- 基址重定位表(Base Relocation Table)

[复制链接]

60

主题

60

帖子

130

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
130
发表于 2020-7-22 10:23:13 | 显示全部楼层 |阅读模式
PE文件格式具体解析(六)-- 基址重定位表(Base Relocation Table)

一、PE重定位

向历程的虚拟内存加载PE文件时,文件会被加载到PE头的ImageBase所指的地址处。如果是加载的DLL(SYS)文件,且在ImageBase位置处已经加载了DLL(SYS)文件,那么PE装载器就会将其加载到其他未被占用的空间。此时就会发生基址重定位。
利用SDK或VC++创建PE文件,EXE默认的ImageBase为00400000,DLL默认的ImageBase为10000000,利用DDK创建的SYS文件默认的ImageBase为10000。
创建好历程后,因为EXE文件会首先加载进内存,所以EXE文件中无需考虑基址重定位题目。但是需要考虑ASLR(地址随机化)。对于各OS的主要系统DLL,微软会根据不同版天职别赋予不同的ImageBase地址,例如同一系统的kernel32.dll和user32.dll等会被加载到自身固有的ImageBase,所以系统的DLL实际上也不会发生重定位题目。
二、PE重定位时发生了什么

以下以书上程序为例(书上是以exe文件举例,纯粹是举例,实际环境中基址重定位多发生在DLL文件中)。

  • 基本信息:
    如下图所示,其ImageBase为01000000

  • 利用OD运行,观察内存:
    下图是程序的EP代码部门,因为ASLR的缘故原由,程序被加载到00270000处。

    从图中可以看出,红框内历程的内存地址是以硬编码的方式存在的,地址2710fc、271100是.text节区的IAT地区,地址27c0a4是.data节区的全局变量。因为ASLR的存在,每次在OD中重启程序,地址值就会随加载地址的不同而发生变革,这种使硬编码在程序中的内存地址随当前加载地址变革而改变的处理惩罚过程就是PE重定位。
    将以上两个图进行对比整理,数据如下表所示:
    文件(ImageBase:01000000)历程内存(加载地址:00270000)0100010fc002710fc01001100002711000100c0a40028c0a4即:因为程序无法预测会被加载到哪个地址,所以纪录硬编码地址时以ImageBase为准;在程序运行书简,颠末PE重定位,这些地址全部以加载地址为基准进行变换,从而包管程序的正常运行。
三、PE重定位操纵原理

1. 基本操纵原理


  • 在应用程序中查找硬编码的地址位置
  • 读取数值后,减去ImageBase(VA->RVA)
  • 加上实际加载地址(RVA->VA)
上面三个步骤即可完成PE重定位,其中最关键的是查找硬编码地址的位置,查找过程中会利用到PE文件内部的Relocation Tables(重定位表),它纪录了硬编码地址便宜,是在PE文件构建中的编译/链接阶段提供的。通过重定位表查找,本质上就是根据PE头的“基址重定位表”项进行的查找。

如上图所示,红框内的硬编码的地址都需要颠末重定位再加载到内存中。
2. 基址重定位表

位于PE头的DataDirectory数组的第六个元素,索引为5.如下图所示:

上图中的基址重定位表的RVA为2f000,查看该地址处内容:


3. IMAGE_BASE_RELOCATION结构体

上图中具体摆列了硬编码地址的偏移,读取该表就可以获得正确的硬编码地址偏移。基址重定位表是IMAGE_BASE_RELOCATION结构体数组。
其界说如下:
typedefine struct _IMAGE_BASE_RELOCATION{                DWORD                VirtualAddress;        //RVA值                DOWRD                SizeOfBlock;                //重定位块的大小                //WORD TypeOffset[1];                //以表明情势存在,非结构体成员,表现在该结构体下会出现WORD范例的数组,并且该数组元素的值就是硬编码在程序中的地址偏移。}IMAGE_BASE_RELOCATION;tydefine IMAGE_BASE_RELOCATION UNALIGEND * PIMAGE_BASE_RELOCATION;4. 基地址重定位表的分析方法

下表列出上图中基址重定位表的部门内容:
RVA数据表明2f00000001000VirtualAddress2f00400000150SizeOfBlock2f0083420TypeOffset2f00a342dTypeOffset2f00c3436TypeOffset以VirtualAddress=00001000,SizeOfBlock=00000150,TypeOffset=3420为例。
TypeOffset值为2个字节,由4位的Type与12位的Offset合成:
范例(4位)偏移(12位)3420高4位指定Type,PE文件中常见的值为3(IMAGE_REL_BASED_HIGHLOW),64位的PE文件中常见值为A(IMAGE_REL_BASED_DIR64)。低12位位真正位移(最大地址为1000),改位移是基于VirtualAddress的位移,所以程序中硬编码地址的偏移利用以下公式进行计算:
VirtualAddress(1000) + Offset(420) = 1420(RVA)
下面我们在OD中看一下RVA 1420处是否实际存在要执行PE重定位操纵的硬编码地址:

程序加载的基地址为270000,所以在271420处可以看到IAT的地址(VA,2710c4)。
5. 总结流程


  • 查找程序中硬编码地址的位置(通过基址重定位表查找)

    可以看到,RVA 1420处存在着程序的硬编码地址010010c4
  • 读取数值后,减去ImageBase值:
    010010c4 - 01000000 = 000010c4
  • 加上实际加载地址
    000010c4 + 00270000=002710c4
对于程序内硬编码的地址,PE装载器都做如上的处理惩罚,根据实际加载的内存地址修正后,将得到的值覆盖到同一位置上。对一个IMAGE_BASE_RELOCATION结构体的所有TypeOffset都做如上处理惩罚,且对RVA 1000~2000地址地区对应的所有硬编码地址都要进行PE重定位处理惩罚。如果TypeOffset值为0,阐明一个IMAGE_BASE_RELOCATION结构体竣事。至此,完成重定位流程。
四、参考

《逆向工程焦点原理》

来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-11-25 09:46 , Processed in 0.093750 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表