RVA 转 RAW

2024-03-03 21:48
文章标签 raw rva

本文主要是介绍RVA 转 RAW,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

直接上源码:

#include<stdio.h>
#include<Windows.h>
int main()
{LPCSTR lpFileName="D:\\PyCharm Community Edition 2019.2.4\\bin\\IdeaWin32.dll";HANDLE hFile;hFile=CreateFileA(lpFileName,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);if(hFile==INVALID_HANDLE_VALUE){MessageBoxA(0,"文件打开失败",0,MB_OK);return 0;}DWORD FileSize=GetFileSize(hFile,0);BYTE* lpBuffer=new BYTE[FileSize];ReadFile(hFile,lpBuffer,FileSize,0,0);/*定义DOS头*/PIMAGE_DOS_HEADER pDosHeader=(PIMAGE_DOS_HEADER)lpBuffer;/*定义NT头*/PIMAGE_NT_HEADERS pNtHeader=(PIMAGE_NT_HEADERS)(pDosHeader->e_lfanew+lpBuffer);/*定义可选头*/PIMAGE_OPTIONAL_HEADER pOptionalHeader=&(pNtHeader->OptionalHeader);/*定义文件头*/PIMAGE_FILE_HEADER pFileHeader=&(pNtHeader->FileHeader);/*获取节表的数量*/DWORD SectionNumber=pFileHeader->NumberOfSections;/*获取节的位置,方法,从NT头加上整个NT头的大小*/PIMAGE_SECTION_HEADER SectionHeader=(PIMAGE_SECTION_HEADER)(pNtHeader+0x18+pFileHeader->SizeOfOptionalHeader);/*定位到数据目录表(通过这种方式获取到的是数据目录表的第一个元素也就是导出表),但是通过IMAGE_EXPORT_DIRECTORY* Export=(IMAGE_EXPORT_DIRECTORY*)((BYTE *)pNtHeader+0x78)这种方式得到的是导出表的结构*/PIMAGE_DATA_DIRECTORY pDirectory=(PIMAGE_DATA_DIRECTORY)(pOptionalHeader->DataDirectory);/*获取导出表的虚拟地址*/DWORD ExportRVA=pDirectory->VirtualAddress;//注意这个地址是一个RVA,是数据块的起始RVA/*开始进行转换,RVA->RAW 过程中用到的两个参数:第一个(导出表虚拟地址:ExportRVA)第二个(基址:pDosHeader)*//*转换的思路:1、获取节区表的开始的虚拟地址2、获取节区表的结束地址3、判断要转换的RVA所在节区4、利用公式进行计算转换  RAW=RVA-VA+PointToRAW*/for(int i=0;i<SectionNumber;i++){/*计算当前节区的开始地址*/DWORD SectionBegin=SectionHeader[i].VirtualAddress;//区块的RVA地址/*计算当前节区的结束地址*/DWORD SectionEnd=SectionHeader[i].VirtualAddress+SectionHeader[i].SizeOfRawData;//(这里的大小在实际使用中是区块的起始RVA+区块的大小,但是在实际使用中要考虑到文件的对齐)/*判断要求的RVA是否在当前的节区内*/if(ExportRVA>SectionBegin&&ExportRVA<SectionEnd){/*如果在当前的节区内*/DWORD ExportRAW=ExportRVA-SectionBegin+SectionHeader[i].PointerToRawData;printf("转换结果:%x",ExportRAW);}}
}

关于地址转换的题外话:
用CreateFile获取到文件的句柄,之后用ReadFile将文件读取到缓冲区里边,这时候缓冲区里边存储的文件是源文件在磁盘上的格式,并没有按照相应的对齐粒度展开,在遍历导出表的时候,获取的是导出表的RVA和VA(这两个地址都是文件在内存中的地址,也就是按照内存中的对齐粒度对齐之后的地址),如果想要根据获取到的导出表的RVA和VA获取导出表的函数,要将地址进行转换,转换为RAW,也就是文件偏移,之后再到缓冲区里边根据地址进行遍历(因为用ReadFile将文件读取到内存中的时候,文件保持再磁盘上的对齐状态)
在这里插入图片描述

这篇关于RVA 转 RAW的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

论文精读-Supervised Raw Video Denoising with a Benchmark Dataset on Dynamic Scenes

论文精读-Supervised Raw Video Denoising with a Benchmark Dataset on Dynamic Scenes 优势 1、构建了一个用于监督原始视频去噪的基准数据集。为了多次捕捉瞬间,我们手动为对象s创建运动。在高ISO模式下捕获每一时刻的噪声帧,并通过对多个噪声帧进行平均得到相应的干净帧。 2、有效的原始视频去噪网络(RViDeNet),通过探

Android raw,assets目录源使文件格式使用

播放raw目录下的mp3文件: MediaPlayer mediaPlayer1;mediaPlayer1 = MediaPlayer.create(this, R.raw.boot); //文件路径 /raw/boot.mp3mediaPlayer1.start();mediaPlayer1.stop(); 读取assets目录下图片资源文件: <Im

ZYNQ LWIP (RAW API) UDP函数学习

1 RAW API接口 RAW API是基于回调函数实现的API接口,它是很底层的API接口,这需要开发者对LwIP有较深的了解才能很好使用它,RAW API的核心就是对控制块的处理,因为对于报文数据的处理、注册回调函数等都是需要开发者自己去实现,都是比较麻烦的,但是有一个优点,那就是处理数据效率高。 2 RAW API的UDP函数说明 udp_new()–新建控制块 在使用UDP协议进行通

微信接口$GLOBALS['HTTP_RAW_POST_DATA']接收不到值

$xml = $GLOBALS['HTTP_RAW_POST_DATA']; 打印$xml出来,结果是null 使用的是php7,原因是php7已移除这个全局变量,改成 $xml = file_get_contents("php://input"); 即可

RAW格式转化为BMP

首先先介绍C++中图像数据分配内存方法。   在计算机中图像是一个二维的数字点阵。 比较容易想到的是申请一个二维矩阵来存储图像 如: BYTE image[512][512]; 可以存储一幅512*512个像素的图像,每个像素用一个字节表示,一个字节能表示0-255共256个不同取值。所以这一二维数组比较合适存储灰度图像。   对于二维彩色图像,如果每个像素分别有R,G,B 3个颜色分量,则可以

raw数据类型

raw数据类型 Oracle中用于保存位串的数据类型是RAW,LONG RAW(推荐使用BLOB)。 RAW,类似于CHAR,声明方式RAW(L),L为长度,以字节为单位,作为数据库列最大2000,作为变量最大32767字节。 LONG RAW,类似于LONG,作为数据库列最大存储2G字节的数据,作为变量最大32760字节 RAW类型的好处就是:在网络中的计算机之间传输 RAW 数据时

基于Raw格式图像的自动白平衡方法

http://kns.cnki.net/KCMS/detail/detail.aspx?dbcode=CJFQ&dbname=CJFD2011&filename=JSJC201117070&v=MzE1MDI3QmJiRzRIOUROcUk5Q1pJUjhlWDFMdXhZUzdEaDFUM3FUcldNMUZyQ1VSTEtlWmVkdEZ5M2dVTDNLTHo=

ISP为何先处理RAW、再处理RGB、再处理YUV

文章目录 1. 先处理RAW数据原因:处理步骤: 2. 处理RGB数据原因:处理步骤: 3. 处理YUV数据原因:处理步骤: 总结 先处理RAW数据,再处理RGB数据,最后处理YUV数据是图像信号处理器(ISP)中的标准流程。这种处理顺序的原因涉及图像质量的优化、色彩准确性的确保以及适应不同应用需求的必要性。以下是详细的解释: 1. 先处理RAW数据 原因: 最大化数据保

Python学习笔记 -- input()和raw_input()的区别

Python学习笔记 – input()和raw_input()的区别 Python中我们使用input函数和raw_input函数获取用户输入 下面通过input和raw_input的help信息(python 2.7.9)分析两者的不同,在python 3.x系列中,没有raw_input,只有input。 >>> help(input)Help on built-in funct

将iso格式的镜像文件转化成云平台能安装的镜像格式(raw/vhd/QCOW2/VMDK )亲测--图文详解

1.首先,你将你的iso的文件按照正常的流程和需求安装到你的虚拟机中,我这里使用的是vmware,安装完成之后,关机。再次点开你安装好的那台虚拟机的窗口,如下图 选中要导出的镜像,镜像需要关机 2.点击工具栏的文件------选择 导出 整个工程到 ovf 格式—这里你可以选择你要导出你的这台虚拟机的文件到哪一个文件夹下,  导出的文件 3.下载一个软件 virtualbox D