当前位置: 首页 > java >正文

Windows逆向工程提升之IMAGE_BASE_RELOCATION

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> ​​​链接点击跳转博客主页

目录

重定位的概念与作用

什么是重定位?

为什么需要重定位?

IMAGE_RELOCATION 结构详解

结构定义

字段解析

重定位类型(Relocation Type)​

重定位表的工作流程

加载器处理步骤

示例计算

图解示例

重定位表结构解析

绝对地址数据引用


重定位的概念与作用

什么是重定位?

  • ​定义:当 PE 文件(如 DLL 或 EXE)无法加载到预设的基地址(ImageBase)时,需调整代码和数据中的绝对地址,确保程序正确运行。
  • 核心机制:通过 ​重定位表(Relocation Table)​ 记录需要修正的地址偏移。
  • 应用场景:
    • ASLR(地址空间布局随机化)​:现代操作系统随机化基址以增强安全性。
    • DLL 冲突:多个模块可能竞争同一基地址。
    • 动态加载:通过 LoadLibrary 加载到非默认地址。

为什么需要重定位?

  • 基址冲突:若两个 DLL 的 ImageBase 相同,后加载的需调整地址。
  • 内存灵活性:允许程序在任意内存位置运行。
  • ​安全需求:ASLR 依赖重定位表实现基址随机化。

IMAGE_RELOCATION 结构详解

结构定义

重定位表由多个 ​重定位块(Block)​ 组成,每个块对应一个内存页(4KB),结构定义为 IMAGE_BASE_RELOCATION:

typedef struct _IMAGE_BASE_RELOCATION {DWORD   VirtualAddress;    // 块的起始 RVA(内存页基址)DWORD   SizeOfBlock;       // 块总大小(包括本结构和后续条目)// 后续为 WORD 类型的条目(TypeOffset)
} IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION;

字段解析

字段名描述
​VirtualAddress当前块的起始 RVA,所有条目偏移均相对于此地址。
​SizeOfBlock块总大小(字节),包含结构头和后续条目。
​TypeOffset每个条目为 2 字节(WORD): - ​高 4 位:重定位类型(如 IMAGE_REL_BASED_HIGHLOW) - ​低 12 位:相对于 VirtualAddress 的偏移值。

重定位类型(Relocation Type)​

类型值宏定义说明
0IMAGE_REL_BASED_ABSOLUTE无操作,用于填充对齐。
3IMAGE_REL_BASED_HIGHLOW修正 32 位地址(低地址 + 高地址调整)。
9IMAGE_REL_BASED_DIR64修正 64 位地址(用于 64 位 PE 文件)。

重定位表的工作流程

加载器处理步骤

  • 尝试加载到 ImageBase:若成功,无需重定位。
  • 计算 Delta 值:
    • Delta = ActualBase - ImageBase。
  • 遍历重定位块:
    • 对每个条目中的偏移地址加上 Delta。
  • 修正地址:
    • 修改代码或数据中的绝对地址。

示例计算

  • 原始地址:0x00401000(基于 ImageBase=0x00400000)。
  • 实际基址:0x00500000(Delta=0x00100000)。
  • 修正后地址:0x00401000 + 0x00100000 = 0x00501000。

图解示例

重定位表结构解析

绝对地址数据引用

http://www.xdnf.cn/news/8650.html

相关文章:

  • 使用Python操作Mysql数据库
  • 【VBA 字典的引用和调用方法】
  • 【笔记】如何解决GitHub报错403
  • [创业之路-377]:企业战略管理案例分析-战略制定/设计-市场洞察“五看”:看宏观之社会发展趋势:数字化、智能化、个性化的趋势对初创公司的战略机会
  • 品鉴JS的魅力之防抖与节流【JS】
  • 英语写作中“随着……的出现”with the advent of 的用法
  • 03-工具篇-SSH远程登录ubuntu系统
  • 同为科技 智能PDU产品选型介绍 EN10/I801CI
  • Elasticsearch实操案例
  • Linux Shell编程(九)
  • 贪心介绍 LeetCode 455.分发饼干 LeetCode 376. 摆动序列 LeetCode 53. 最大子序和
  • C# 异步方法中缺少 `await` 运算符的隐患与解决方案
  • Vue框架1(vue搭建方式1,vue指令,vue实例生命周期)
  • 卷积神经网络优化与应用实践:参数设置、泛化能力提升及多领域应用解析
  • Vue 3 路由传参使用指南
  • 视频监控联网系统GB28181协议中设备状态信息报送流程详解以及查询失败常见原因
  • uni-app学习笔记十--vu3 计算属性computed
  • 鸿蒙UI开发——上拉抽屉的更新与事件回调
  • Android Studio 连接夜神模拟器 自动断开的问题
  • 基于AI生成测试用例的处理过程
  • 海外IP代理在跨境电商选品、运营、风控的实战应用解析
  • ARM笔记-ARM伪指令及编程基础
  • Python:从脚本语言到工业级应用的传奇进化
  • 生成图片验证码
  • Ubuntu安装1Panel可视化管理服务器及青龙面板及其依赖安装教程
  • 再论自然数全加和-3
  • 进程信号(下)【Linux操作系统】
  • 心有灵犀数
  • PHP学习笔记(九)
  • 从零开始构建一个区块链应用:技术解析与实践指南