博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[PE结构分析] 7.相对虚拟地址(RVA)和文件偏移间的转换
阅读量:7296 次
发布时间:2019-06-30

本文共 919 字,大约阅读时间需要 3 分钟。

RVA是相对虚拟地址(Relative Virtual Address)的缩写。RVA是当PE 文件被装载到内存中后,某个数据位置相对于文件头的偏移量。

例如:导入表的位置和大小可以从PE文件头中IMAGE_OPTIONAL_HEADER32结构的数据目录字段中获取,对应的项目是DataDirectory字段的第2个IMAGE_DATA_DIRECTORY结构。从IMAGE_DATA_DIRECTORY结构的VirtualAddress字段得到的是导入表的RVA值,如果在内存中查找导入表,那么将RVA值加上PE文件装入的基址就是实际的地址;如果在PE文件中查找导入表,需要将RVA转换成File Offset(也就是数据在文件中的位置)。

RVA转换到文件偏移地址的方法如下:

步骤一:循环扫描区块表得出每个区块在内存中的起始 RVA(根据IMAGE_SECTION_HEADER 中的VirtualAddress 字段),并根据区块的大小(根据IMAGE_SECTION_HEADER 中的SizeOfRawData 字段)算出区块的结束 RVA(两者相加即可),最后判断目标 RVA 是否落在该区块内。

步骤二:通过步骤一定位了目标 RVA 处于具体的某个区块中后,那么用目标 RVA 减去该区块的起始 RVA ,这样就能得到目标 RVA 相对于起始地址的偏移量 RVA2.
步骤三:在区块表中获取该区块在文件中所处的偏移地址(根据IMAGE_SECTION_HEADER 中的PointerToRawData 字段), 将这个偏移值加上步骤二得到的 RVA2 值,就得到了真正的文件偏移地址。

既,已知某虚拟地址(如va)和某区块的虚拟地址(text_va),虚拟地址在区块中,同时还知道此区块在文件中的位置(text_file_offset),解出此虚拟地址在文件中的具体位置。解:根据他们的偏移量相同(都是text_va - va)可知,答案为 text_file_offset + (text_va - va)。 

转载于:https://www.cnblogs.com/ruingking/p/10867782.html

你可能感兴趣的文章
jQuery操作json
查看>>
网络编程和线程
查看>>
mybaitis 通过Mapping 实现多表查询
查看>>
c++学习总结:extern声明全局变量
查看>>
译:Spring Data Repository 不区分大小写查询
查看>>
给定数组的子集 Subsets
查看>>
在矩阵中查找字符串 Word Search
查看>>
安装openproject
查看>>
开源工作流程引擎ccflow多人待办处理模式的详解
查看>>
HTACCESS 伪静态书写规则
查看>>
快速学习Android开发知识点总结(磨砺营马剑威Android)
查看>>
Dubbo 线上调服务方法空指针问题
查看>>
Java并发,并行,同步,互斥
查看>>
try redis
查看>>
C++中const用法总结
查看>>
angular2 安装
查看>>
ubuntu安装openssl命令
查看>>
去掉文本中重复的行
查看>>
某厂商APT防御思路
查看>>
Hibernate, 想说爱你不容易
查看>>