PE文件解析(2):RVA与FOA转换和区段表

2023-10-12 02:40
文章标签 转换 解析 pe foa rva 区段

本文主要是介绍PE文件解析(2):RVA与FOA转换和区段表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • RVA与FOA
  • 区段表
  • RVA到FOA的转换

RVA与FOA

VA: 虚拟内存地址(Virtual Address)PE 文件被操作系统加载进内存后的地址。

RVA: 程序在内存中的偏移地址(Relative Virual Address)
PE文件的相对虚拟地址是PE文件中的数据、模块等运行在内存中的实际地址相对PE文件装载到内存的基址之间的距离。举例说明,如果PE文件装入虚拟地址(VA)空间的400000h处,且进程从虚址401000h开始执行,我们可以说进程执行起始地址在RVA 1000h。

FOA:程序在文件,硬盘中的偏移地址(File Offset Address)
文件偏移地址,和内存无关,它是指某个位置距离文件头的偏移。


一个程序的各段在内存和文件中的对齐方式是不一样的。

FOA:文件对齐值是0x200。
RVA:内存对齐是0x1000
在这里插入图片描述

区段表

我们在上节已经解析了Dos头和Nt头部分,下面我们来解析下一个部分:区段表部分:
一个程序有很多的区段组成:
.text
.data
.rdata
.idata
.edata
…等等
这些区段都有着各自的信息,每一个块都是一个结构体:

typedef struct _IMAGE_SECTION_HEADER {BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];union {DWORD   PhysicalAddress;DWORD   VirtualSize;//区段在内存中的真实大小} Misc;DWORD   VirtualAddress;//RVA :区段在内存中的偏移地址DWORD   SizeOfRawData;	//区段在文件中对齐后大小 DWORD   PointerToRawData;//RVA: 区段在文件中的偏移位置	DWORD   PointerToRelocations;DWORD   PointerToLinenumbers;WORD    NumberOfRelocations;WORD    NumberOfLinenumbers;DWORD   Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

010editor解析:
在这里插入图片描述

代码解析:

BOOL PE::GetSelctionInfo()
{PIMAGE_SECTION_HEADER pSelctionHeader = IMAGE_FIRST_SECTION(pNtHeader);for (UINT i = 0; i < pFileHeader->NumberOfSections; i++){printf("区段名:%s\n", pSelctionHeader->Name);pSelctionHeader++;}return 0;
}
  1. pFileHeader结构体成员存储着区段的数量:NumberOfSections。
  2. 得到区段表的方法:
  • 利用偏移:NT部分的标准NT头大小是不变的,而可选NT头部分是可变的,但是标准NT头部分有一个成员存储着可选NT头的大小,我们利用 区段表地址 = NT头起始地址 + NT标识区大小(4) + 标准NT头大小 + 可选NT头大小,就可以得到区段表的地址:
PIMAGE_SECTION_HEADER pSelctionHeader =(PIMAGE_SECTION_HEADER)((DWORD)pNtHeader + FIELD_OFFSET(IMAGE_NT_HEADERS, OptionalHeader) +//FIELD_OFFSET可以直接计算出可选NT头到NT首地址的大小。pFileHeader->SizeOfOptionalHeader);
  • 一个宏:
//IMAGE_FIRST_SECTION可以直接得到区段表地址,只需传递NT头的起始位置。
PIMAGE_SECTION_HEADER pSelctionHeader = IMAGE_FIRST_SECTION(pNtHeader);

程序运行如下:
在这里插入图片描述

RVA到FOA的转换

通常情况下,我们需要将RVA转换为FOA:

在这里插入图片描述

  • 数据的RVA - 区段的RVA = 数据 在内存中距离区段头的距离 s1
  • 数据的FOA - 区段的FOA = 数据 在文件中距离区段头的距离 s2
  • s1 = s2
  • 数据的RVA - 区段的RVA =数据的FOA - 区段的FOA
  • 数据的FOA = 数据的RVA(传参) - 区段的RVA + 区段的FOA

DWORD cPE::RvaToFoa(DWORD rva)
{//获得区段表/*Nt头的起始位置 + 可选头到Nt头的距离 + 可选头的大小*/PIMAGE_SECTION_HEADER pSelctionHeader = (PIMAGE_SECTION_HEADER)((ULONG_PTR)pNtHeader + FIELD_OFFSET(IMAGE_NT_HEADERS, OptionalHeader) + pFileHeader->SizeOfOptionalHeader);// 遍历每一个区段,看看 RVA(某个东西在内存中的偏移地址)是否落在某个区段上for (UINT i = 0; i < pFileHeader->NumberOfSections; i++){/*数据的RVA - 区段的RVA = 数据 在内存中距离区段头的距离 s1数据的FOA - 区段的FOA = 数据 在文件中距离区段头的距离 s2s1=s2 数据的FOA - 区段的FOA = 数据的RVA - 区段的RVA所以:已知数据的RVA求数据的FOA: 数据的FOA = 数据的RVA - 区段的RVA + 区段的FOA*/if (rva >= pSelctionHeader->VirtualAddress && rva < pSelctionHeader->VirtualAddress + pSelctionHeader->Misc.VirtualSize){//rva必须在某一个区段的里面, 大于区段头部偏移,小于区段头加大小return rva - pSelctionHeader->VirtualAddress + pSelctionHeader->PointerToRawData;}pSelctionHeader++;}return 0;
}

这篇关于PE文件解析(2):RVA与FOA转换和区段表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/192665

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

OWASP十大安全漏洞解析

OWASP(开放式Web应用程序安全项目)发布的“十大安全漏洞”列表是Web应用程序安全领域的权威指南,它总结了Web应用程序中最常见、最危险的安全隐患。以下是对OWASP十大安全漏洞的详细解析: 1. 注入漏洞(Injection) 描述:攻击者通过在应用程序的输入数据中插入恶意代码,从而控制应用程序的行为。常见的注入类型包括SQL注入、OS命令注入、LDAP注入等。 影响:可能导致数据泄

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

Unity3D自带Mouse Look鼠标视角代码解析。

Unity3D自带Mouse Look鼠标视角代码解析。 代码块 代码块语法遵循标准markdown代码,例如: using UnityEngine;using System.Collections;/// MouseLook rotates the transform based on the mouse delta./// Minimum and Maximum values can