基址重定位表&.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,删除该节区后文件照常运行,且文件大小将缩减。
基址重定位表&.reloc节区的更多相关文章
- Reverse Core 第二部分 - 16&17章 - 基址重定位表&.reloc节区
第16-17章 - 基址重定位表&.reloc节区 @date: 2016/11/31 @author: dlive 0x00 前言 这几天忙着挖邮箱漏洞,吃火锅,马上要被关禁闭,看书进度比较 ...
- PE结构之重定位表
什么是重定位: 重定位就是你本来这个程序理论上要占据这个地址,但是由于某种原因,这个地址现在不能让你占用,你必须转移到别的地址,这就需要基址重定位.你可能会问,不是说过每个进程都有自己独立的虚拟地址空 ...
- 小甲鱼PE详解之基址重定位详解(PE详解10)
今天有一个朋友发短消息问我说“老师,为什么PE的格式要讲的这么这么细,这可不是一般的系哦”.其实之所以将PE结构放在解密系列继基础篇之后讲并且尽可能细致的讲,不是因为小甲鱼没事找事做,主要原因是因为P ...
- PE知识复习之PE的重定位表
PE知识复习之PE的重定位表 一丶何为重定位 重定位的意思就是修正偏移的意思. 如一个地址位 0x401234 ,Imagebase = 0x400000 . 那么RVA就是 1234. 如果Im ...
- PE文件 03 重定位表
0x01 重定位表结构 重定位表是由数据目录表中的第六个成员指出的: typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress; D ...
- 【旧文章搬运】PE重定位表学习手记
原文发表于百度空间,2008-11-02========================================================================== 先定义一下 ...
- 逆向-PE重定位表
重定位表 当链接器生成一个PE文件时,会假设这个文件在执行时被装载到默认的基地址处(基地址+RVA就是VA).并把code和data的相关地址写入PE文件.如果像EXE一样首先加载就是它image ...
- Windows PE第6章 栈与重定位表
第六章 栈与重定位表 本章主要介绍栈和代码重定位.站和重定位表两者并没有必然的联系,但都和代码有关.栈描述的是代码运行过程中,操作系统为调度程序之间相互调用关系,或临时存放操作数而设置的一种数据结构. ...
- PE格式第七讲,重定位表
PE格式第七讲,重定位表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶何为重定位(注意,不是重定位表格) 首先, ...
随机推荐
- 三、MySQL PHP 语法
MySQL PHP 语法 MySQL 可应用于多种语言,包括 PERL, C, C++, JAVA 和 PHP. 在这些语言中,Mysql在PHP的web开发中是应用最广泛. 在本教程中我们大部分实例 ...
- ecshop里提出来的js常用函数
目录 Utils.js jquery.listTable.js 使用例子: ecshop里提出来的js常用函数 Utils.js /* $Id : utils.js 5052 2007-02-03 1 ...
- C语言的位运算的优势 !
位运算加速技巧1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300% x = x * 2; x = x * 64; //改为: x = x << 1; / ...
- 用python给图片添加半透明水印
# coding:utf-8 from PIL import Image, ImageDraw, ImageFont def add_text_to_image(image, text): font ...
- HDU - 1054 Strategic Game (二分图匹配模板题)
二分图匹配模板题 #include <bits/stdc++.h> #define FOPI freopen("in.txt", "r", stdi ...
- 库函数的使用:sscanf的使用方法
先贴代码,可以看懂代码的直接看代码: /***************************************************** ** Name : sscanf.c ** Auth ...
- hdu 1257最少拦截系统
最少拦截系统 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的 ...
- 刷表法动态规划:HOJ11391_Word Clouds Revisited
题目大意,给若干方块,让把方块拍成若干行,使得最终高度最小.其中,每行有宽度限制,高度为每行中最高的箱子的高度. 于是,很直观的认为,这个题可能也许大概应该是个动态规划的题. 于是,设DP[K]为K及 ...
- Js中的undefined和not defined
1.undefined 已经声明,但未赋值 2.not defined 未声明,报错
- 巧用Windows Server 2008的NPS策略
单位员工大部分是移动办公一族,由于病毒库更新不及时.系统补丁没有安装,使移动办公设备处于危险状态,访问内部网络时很可能威胁整个网络.该如何防守网络访问这扇门呢? 笔者所在的单位是一家传媒公司,有数百人 ...