第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节区的更多相关文章

  1. 基址重定位表&.reloc节区

    第16-17章 - 基址重定位表&.reloc节区 @date: 2016/11/31 @author: dlive 0x01 PE重定位 若加载的是DLL.SYS文件,且在ImageBase ...

  2. Reverse Core 第二部分 - 14&15章 - 运行时压缩&调试UPX压缩的notepad

    @date: 2016/11/29 @author: dlive 0x00 前言 周六周日两天在打HCTF2016线上赛,没时间看书,打完比赛接着看~~ 0x01 运行时压缩 对比upx压缩前后的no ...

  3. Windows PE第6章 栈与重定位表

    第六章 栈与重定位表 本章主要介绍栈和代码重定位.站和重定位表两者并没有必然的联系,但都和代码有关.栈描述的是代码运行过程中,操作系统为调度程序之间相互调用关系,或临时存放操作数而设置的一种数据结构. ...

  4. 小甲鱼PE详解之基址重定位详解(PE详解10)

    今天有一个朋友发短消息问我说“老师,为什么PE的格式要讲的这么这么细,这可不是一般的系哦”.其实之所以将PE结构放在解密系列继基础篇之后讲并且尽可能细致的讲,不是因为小甲鱼没事找事做,主要原因是因为P ...

  5. [PE结构分析] 10.基址重定位

    源代码如下: typedef struct _IMAGE_BASE_RELOCATION { DWORD VirtualAddress; DWORD SizeOfBlock; // WORD Type ...

  6. 《windows核心编程系列》二十一谈谈基址重定位和模块绑定

    每个DLL和可执行文件都有一个首选基地址.它表示该模块被映射到进程地址空间时最佳的内存地址.在构建可执行文件时,默认情况下链接器会将它的首选基地址设为0x400000.对于DLL来说,链接器会将它的首 ...

  7. Reverse Core 第二部分 - 13章 - PE文件格式

    @date: 2016/11/24 @author: dlive ​ PE (portable executable) ,它是微软在Unix平台的COFF(Common Object File For ...

  8. 《深入理解计算机系统》第7章:重定位PC相对引用的理解

    在第七章<链接>中的静态链接有对符号进行重定位PC相对引用的处理,书上对应的还有公式,但不是很好理解.现做实验对公式进行理解(公式内容如有兴趣可以参考原文)

  9. 《linux就该这么学》第十六节课:第16,17章,Squid服务和iscsi网络存储

    第十六章 squid总结: 正向代理:yum  安装后清空防火墙即可正常使用,客户端设置浏览器 透明正向代理:vim  /etc/squid/squid.conf 59行:http_port  312 ...

随机推荐

  1. MS SQL SERVER导出表结构到Excel

    通过sql语句导出表结构 SELECT 表名 Then D.name Else '' End, 表说明 Then isnull(F.value,'') Else '' End, 字段序号 = A.co ...

  2. UVA227

    步骤:1.把输入的数字和空格保存.(这里用到gets函数读取整行)2.定位空格.3.输入指令. #include<stdio.h> #include<string.h> ][] ...

  3. MVC 总结

    以下内容摘自 PHP for Absolute Beginners, Thomas Blom Hansen & Jason Lengstorf The model-view-controlle ...

  4. vector - vector product

    the inner product Givens two vectors \(x,y\in \mathbb{R}^n\), the quantity \(x^\top y\), sometimes c ...

  5. 1014: [JSOI2008]火星人prefix

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MB Description 火星人最近研究了一种操作:求一个字串两个后缀 ...

  6. 16 Promise

    Promise 特点 对象的状态不受外界影响.Promise对象代表一个异步操作,有三种状态:Pending(进行中).Resolved(已完成,又称Fulfilled)和Rejected(已失败). ...

  7. Php compiler for .NET framework

    https://phalanger.codeplex.com http://tomasp.net/blog/ducktyping-in-phalaner.aspx/ https://visualstu ...

  8. IIS7错误“Web服务器被配置为不列出此目录的内容”的解决办法

    *打开 Internet 信息服务(IIS)管理器 - 目录浏览 选择启用即可.

  9. Cheat sheets

  10. document.compatMode属性

    document.compatMode用来判断当前浏览器采用的渲染方式. 官方解释: BackCompat:标准兼容模式关闭.CSS1Compat:标准兼容模式开启. 当document.compat ...