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

相关文章

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三