RvaToFileOffset 内存偏移转成文件偏移(滴水课后作业)
题目说明
将内存偏移RVA转成文件偏移FOA的函数;
思路是遍历节表,比较节内存偏移VirtualAddress和RVA,确定RVA所在的节之后,计算RVA距离所在节首地址的偏移offset,然后返回offset+PointerToRawData.
以xp的notepad.exe为例
.text节的文件偏移是400h,内存偏移是1000h,调用函数结果如下:
printf("%x\n", RvaToFileOffset(pFileBuffer, 0x1000));
函数源码
// RVA 转 FOA
DWORD RvaToFoa(LPVOID pFileBuffer, DWORD dwRva)
{PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;PIMAGE_FILE_HEADER pPEHeader = (PIMAGE_FILE_HEADER)(pDosHeader->e_lfanew + (DWORD)pFileBuffer + 4);PIMAGE_OPTIONAL_HEADER32 pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader + sizeof(IMAGE_FILE_HEADER));PIMAGE_SECTION_HEADER pSectionHeader = \(PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader + pPEHeader->SizeOfOptionalHeader);// RVA在文件头中或者文件对齐==内存对齐时,RVA==FOA 错!第一句是对的,第二句是错的if (dwRva < pOptionHeader->SizeOfHeaders){return dwRva;}// 遍历节表,确定偏移属于哪一个节 for (int i = 0; i < pPEHeader->NumberOfSections; i++){if (dwRva >= pSectionHeader[i].VirtualAddress && \dwRva < pSectionHeader[i].VirtualAddress + pSectionHeader[i].Misc.VirtualSize){int offset = dwRva - pSectionHeader[i].VirtualAddress;return pSectionHeader[i].PointerToRawData + offset;}}printf("找不到RVA %x 对应的 FOA,转换失败\n", dwRva);return 0;
}
RvaToFileOffset 内存偏移转成文件偏移(滴水课后作业)相关推荐
- 滴水课后作业(1-5)
滴水2015-01-12 1.2+3=1 成立吗?说明理由. 解题:上面式子由 3个符号组成,那么起码得用3进制以上的进制表示 三进制:2(0),3(1),1(2) 0+1=2不成立 四进制: X(0 ...
- 滴水课后作业(6-10)
滴水2015-01-19 本节练习: 1.熟练记住CF/PF/AF/ZF/SF/OF的位置 略过 2.写汇编指令只影响CF位的值(不能影响其他标志位) MOV AX,0FF00 ADD AX,101 ...
- 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)...
0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...
- 由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)...
0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...
- 理解PE文件相对虚拟地址(RVA)到文件偏移的转换
关于PE文件格式的详细描述在网络上可以找到一大堆,最近有空,我也来研究一把.读了很多参考资料,应该说都讲得非常清晰,尤其是看雪学院的iamgufeng翻译的那篇文章,读来受益非浅. 根据我这个菜鸟的阅 ...
- 理解文件偏移相对内存偏移节偏移
问题背景 解决方法 总结 阅读之前注意: 本文阅读建议用时:5min 本文阅读结构如下表: 项目 下属项目 测试用例数量 问题背景 无 0 解决方法 无 0 总结 无 0 问题背景 拜读<0da ...
- 相对虚拟地址,虚拟地址,文件偏移地址
相对虚拟地址(RVA,Relative Virtual Address):RVA只是内存中的一个简单相对于PE文件装入地址的偏移位置,它是一个"相对地址",或称"偏移量& ...
- 实现虚拟内存地址到文件偏移地址的转换
写在前面:这是一次实践作业,用c来写似乎好写一点,但我比较熟悉python,也找到了python相关的库,就用python来实现下,用一晚上把前天写的代码变成了图形化界面,自学过程中,学到了许多东西, ...
- OpenCV中将RGB数组在内存中压缩成JPEG文件
环境 jpeg库: jpegsr9a 下载地址:http://www.ijg.org/ 编译环境: vs2015 Opencv 3.4.2 一.RGB数组来自BMP文件,直接输出在文件系统上 1.1 ...
最新文章
- OVS DPDK--virtqueue(十七)
- redis分布式锁-基本概念与实现方式对比
- NFC能否成为“标配”?
- POJ - 2065 SETI(高斯消元解方程(取模))
- 2014.8.20日结
- 1 Hello World,JavaFX Style
- 26.Yii 模块(2)
- 【家具CRM客户关系管理系统案例】数夫助力左右家私CRM客户关系管理系统正式上线
- 给程序进行简单的加壳
- LeetCode算法之蓄水池算法
- JavaScript中的数据类型判断
- 2022大三计算机 | 保研机试 | 学习路线
- Dubbo重启一年,尚能饭否?
- http://ajava.org/readbook/java/javaemail/11239.html Mime 邮件详解
- 【驱动之四】Nt和Zw
- xv6 - lab0 - 操作系统组织
- 驾校管理系统linux界面分析,驾校管理系统-20210327024111.docx-原创力文档
- PHP数据类型、PHP声明和PHP变量
- Tableau 巴西世界杯(一)国家地图分布
- DM数据库大小写敏感
热门文章
- Python之 sklearn:sklearn中的train_test_split函数的简介及使用方法之详细攻略
- ML之xgboost:基于xgboost(5f-CrVa)算法对HiggsBoson数据集(Kaggle竞赛)训练实现二分类预测(基于训练好的模型进行新数据预测)
- 《疯狂JAVA讲义》3
- 机器学习-过拟合和欠拟合以及正则化处理
- POJ_2104 K-th Number 【主席树】
- Dubbo实现原理之基于SPI思想实现Dubbo内核
- 3、构建bass服务及model
- 状态压缩 HDU 1565
- 电子病历开发经验共享 —— 2009年一时兴起写在某个论坛上的,转抄留恋。
- C#3.0 为我们带来什么(2) —— 自动属性