基址重定位表&.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/版权所有,欢迎保留原文链接进行转载:) 一丶何为重定位(注意,不是重定位表格) 首先, ...
随机推荐
- Linux时区修改
Linux修改时区的正确方法 CentOS和Ubuntu的时区文件是/etc/localtime,但是在CentOS7以后localtime以及变成了一个链接文件 [root@centos7 ~]# ...
- Nginx认证
Nginx 的 ngx_http_auth_basic_module模块允许通过使用“HTTP基本认证”协议验证用户名和密码来限制对资源的访问. 配置举例: location / { auth_bas ...
- js测试密码的强度
测试密码的强度.js //网站也会根据输入密码的字符特点给出相应的提示,如密码过短.强度差.强度中等.强度强等. //这又是怎么实现的呢?看下面代码: <input type="pas ...
- Nodejs NPM CNPM优雅安装install
由于npm和cnpm都能安装组件,安装的组件有的保存在c盘用户目录的Appdata隐藏目录下,有的保存在安装node的目录下,而且安装在c盘的话,重装系统又得重新部署,甚是麻烦,所以这里提供优雅安装的 ...
- Kubernetes添加带Quota限额的CephFS StorageClass
1. 在Ceph上为Kubernetes创建一个文件系统 # ceph osd pool create cephfs_data # ceph osd pool create cephfs_metada ...
- WampServer配置说明
注意:所有的修改操作都要重启WampServer服务器,部分需要重启WampServer软件 1.修改默认端口 1)打开文件:C:\wamp\bin\apache\apache2.4.9\conf\h ...
- IOS开发---菜鸟学习之路--(二十三)-直接利用键值对的方式来处理数据的感想
首先声明,本文纯粹只是做为本人个人新手的理解.文中的想法我知道肯定有很多地方是错的. 但是这就是我作为一个新人的使用方法,对于大牛非常欢迎指导,对于喷子请绕道而行. 由于这是早上跟我学长讨论数据处理时 ...
- 【Plus One】cpp
题目: Given a non-negative number represented as an array of digits, plus one to the number. The digit ...
- leetcode 【 Unique Paths 】python 实现
题目: A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). ...
- 使用 Pinup,PinupManager 在 XNA 中创建贴图(十七)
平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...