Reverse Core 第二部分 - 16&17章 - 基址重定位表&.reloc节区
第16-17章 - 基址重定位表&.reloc节区
@date: 2016/11/31
@author: dlive
0x01 PE重定位
若加载的是DLL、SYS文件,且在ImageBase位置处已经加载了其他DLL/SYS文件,那么PE装载器就会将其加载到其他未被占用的空间。这就涉及了PE文件重定位问题,PE重定位是指PE文件无法加载到ImageBase位置,而被加载到其他地址时发生的一系列处理行为。
| 开发工具 | PE | 地址 |
|---|---|---|
| SDK/Visual C++ | EXE | 00400000 |
| SDK/Visual C++ | DLL | 10000000 |
| DDK(Driver Development) | SYS | 00010000 |
以Win 7的notepad.exe为例,Win7的ASLR机制使得exe每次启动时加载到的地址不尽相同。
notepad.exe进程中存在一些内存地址以硬编码的形式存在,如IAT的地址,.data节区全局变量的地址。这些地址值随着exe加载地址的不同而改变。像这样,使硬编码在程序中的内存地址随当前加载地址的变化而变化的处理过程就是PE重定位。
0x02 基址重定位表
Windows PE装载器在进行PE重定位处理时,基本的操作原理很简单
1. 在应用程序中查找硬编码地址的位置(位置记录在基址重定位表里)
2. 读取值后,减去ImageBase
3. 加上实际加载的地址
其中关键的是查找硬编码地址的位置,查找过程中会用到PE文件内部的RelocationTable(重定位表),它是记录硬编码地址偏移的列表(重定位表是在PE文件构建过程(编译/链接)中提供的)。通过重定位表查找,其实就是根据PE头的基址重定位表进行查找。
基址重定位表位于PE头的IMAGE_NT_HEADERS/IMAGE_OPTION_HEADER/IMAGE_DATA_DIRECTORY[5]

(WinXP上notepad.exe是看不到基址重定位表的,我的理解是因为XP没有ASLR机制, exe加载到虚拟内存中的基址都是确定的,无需考虑重定位问题)
基址重定位表中罗列了硬编码地址的位置(偏移)。读取这张表就能获得准确的硬编码地址偏移。基址重定位表示IMAGE_BASE_RELOCATION结构体数组
#IMAGE_DATA_DIRECTORY[5]中存放的只是基址重定位表的指针,基址重定位表的数据存放在.reloc节区
#IMAGE_BASE_RELOCATION
DWORD VirtualAddress; //基准地址(Base Address)
DWORD SizeOfBlock; //重定位块大小(一个IMAGE_BASE_RELOCATION结构的大小)
//WORD TypeOffset[1]; //不是结构体成员,而是以注释形式存在,表示该结构体之下会出现WORD类型数组
//并且该数据元素的值就是硬编码在程序中的地址偏移
Win7 notepad.exe的BaseRelocationTable

TypeOffset中的内容1Byte表示类型(Type) 3Byte表示偏移(Offset),如上图Block[0]中0x3420
3表示类型IMAGE_REL_BASED_HIGTLOW
PE文件中常见的值是3(IMAGE_REL_BASED_HIGTLOW),PE+文件中常见值为A(IMAGE_REL_BASED_DIR64)
在恶意代码中正常修改文件代码后,有时候要修改指向相应区域的重定位表(为了略去PE装载器的重定位过程,常常把Type修改为0(IMAGE_REL_BASED_ABSOLUTE))
420表示偏移,该偏移基于IMAGE_BASE_RELOCATION.VirtualAddress
所以程序中硬编码地址的偏移使用下面的的等式换算:
VirtualAddress(0x1000) + offset(0x420) = 0x1420(RVA)
TypeOffset中指向位移的低3Byte可表示的最大地址为0x1000,为了表示更大的地址,要添加一个与其对应的块,由于这些块以数组形式罗列,故称为重定位表
若TypeOffset为0,则表明一个IMAGE_BASE_RELOCATION结构体结束
重定位表以NULL结构体结束,即IMAGE_BASE_RELOCATION结构体成员的值全部为NULL
0x03 .reloc节区
EXE形式的PE文件中,基址重定位表对运行没什么影响。将其删除后程序仍然正常运行(基址重定位表对DLL/SYS形式的文件来说几乎是必须的0)
VC++中生成的PE文件的重定位节区名为.reloc,删除该节区后文件照常运行,且文件大小将缩减。
Reverse Core 第二部分 - 16&17章 - 基址重定位表&.reloc节区的更多相关文章
- 基址重定位表&.reloc节区
第16-17章 - 基址重定位表&.reloc节区 @date: 2016/11/31 @author: dlive 0x01 PE重定位 若加载的是DLL.SYS文件,且在ImageBase ...
- Reverse Core 第二部分 - 14&15章 - 运行时压缩&调试UPX压缩的notepad
@date: 2016/11/29 @author: dlive 0x00 前言 周六周日两天在打HCTF2016线上赛,没时间看书,打完比赛接着看~~ 0x01 运行时压缩 对比upx压缩前后的no ...
- Windows PE第6章 栈与重定位表
第六章 栈与重定位表 本章主要介绍栈和代码重定位.站和重定位表两者并没有必然的联系,但都和代码有关.栈描述的是代码运行过程中,操作系统为调度程序之间相互调用关系,或临时存放操作数而设置的一种数据结构. ...
- 小甲鱼PE详解之基址重定位详解(PE详解10)
今天有一个朋友发短消息问我说“老师,为什么PE的格式要讲的这么这么细,这可不是一般的系哦”.其实之所以将PE结构放在解密系列继基础篇之后讲并且尽可能细致的讲,不是因为小甲鱼没事找事做,主要原因是因为P ...
- [PE结构分析] 10.基址重定位
源代码如下: typedef struct _IMAGE_BASE_RELOCATION { DWORD VirtualAddress; DWORD SizeOfBlock; // WORD Type ...
- 《windows核心编程系列》二十一谈谈基址重定位和模块绑定
每个DLL和可执行文件都有一个首选基地址.它表示该模块被映射到进程地址空间时最佳的内存地址.在构建可执行文件时,默认情况下链接器会将它的首选基地址设为0x400000.对于DLL来说,链接器会将它的首 ...
- Reverse Core 第二部分 - 13章 - PE文件格式
@date: 2016/11/24 @author: dlive PE (portable executable) ,它是微软在Unix平台的COFF(Common Object File For ...
- 《深入理解计算机系统》第7章:重定位PC相对引用的理解
在第七章<链接>中的静态链接有对符号进行重定位PC相对引用的处理,书上对应的还有公式,但不是很好理解.现做实验对公式进行理解(公式内容如有兴趣可以参考原文)
- 《linux就该这么学》第十六节课:第16,17章,Squid服务和iscsi网络存储
第十六章 squid总结: 正向代理:yum 安装后清空防火墙即可正常使用,客户端设置浏览器 透明正向代理:vim /etc/squid/squid.conf 59行:http_port 312 ...
随机推荐
- 链表反转leetcode206
最近准备结束自己的科研生涯,准备要开始找工作了,准备在LEETCODE刷刷题...刷的前40题全部用python刷的,各种调包速度奇快,后被师哥告知这样没意义,于是准备开始回归C++,Python用的 ...
- Python 【第五章】:线程、进程和协程
Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...
- css使absolute相对于父容器进行定位而不是以body(为什么绝对定位(absolute)的父级元素必须是相对定位(relative))
借知乎的回答如下解释: 首先,我想告诉你的是,如果父级元素是绝对定位(absolute)或者没有设置,里面的绝对定位(absolute)自动以body定位.这句话是错的.正确的是:只要父级元素设了po ...
- Java防止SQL注入2(通过filter过滤器功能进行拦截)
首先说明一点,这个过滤器拦截其实是不靠谱的,比如说我的一篇文章是介绍sql注入的,或者评论的内容是有关sql的,那会过滤掉:且如果每个页面都经过这个过滤器,那么效率也是非常低的. 如果是要SQL注入拦 ...
- UEFI模式安装Win10和Linux双系统
最近心血来潮,想装一个Linux.Windows双系统,吸取上次安装的经验,这次一定都要使用UEFI模式启动,需要注意的是必须是支持此种启动模式的系统(一般解压之后都有efi文件夹不需要刻录),这次遇 ...
- theano broadcasting
当我们使用函数对两个数组进行计算时,函数会对这两个数组的对应元素进行计算,因此它要求这两个数组有相同的大小(shape相同).如果两个数组的shape不同的话,会进行如下的广播(broadcastin ...
- History lives on in this distinguished Polish city 2017/1/4
原文 History lives on in this distinguished Polish city Though it may be ancient. KraKow, Poland, is a ...
- centos6.5 更新yum源
在使用centos过程中,自带的yum源包,不能满足的情况下,这个时候就可以考虑升级yum源了.国内用的比较多的是163镜像地址为http://mirrors.163.com/.help/centos ...
- 【整理】Linux下中文检索引擎coreseek4安装,以及PHP使用sphinx的三种方式(sphinxapi,sphinx的php扩展,SphinxSe作为mysql存储引擎)
一,软件准备 coreseek4.1 (包含coreseek测试版和mmseg最新版本,以及测试数据包[内置中文分词与搜索.单字切分.mysql数据源.python数据源.RT实时索引等测 ...
- HTTP压力测试工具
HttpTest4Net是一款基于C#实现的和HTTP压力测试工具,通过工具可以简单地对HTTP服务进行一个压力测试.虽然VS.NET也集成了压力测试项目,但由于VS自身占用的资源导致了在配置不高的P ...