题目说明

将内存偏移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. 滴水课后作业(1-5)

    滴水2015-01-12 1.2+3=1 成立吗?说明理由. 解题:上面式子由 3个符号组成,那么起码得用3进制以上的进制表示 三进制:2(0),3(1),1(2) 0+1=2不成立 四进制: X(0 ...

  2. 滴水课后作业(6-10)

    滴水2015-01-19 本节练习: 1.熟练记住CF/PF/AF/ZF/SF/OF的位置 略过 2.写汇编指令只影响CF位的值(不能影响其他标志位) MOV AX,0FF00 ADD AX,101 ...

  3. 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)...

    0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...

  4. 由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)...

    0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...

  5. 理解PE文件相对虚拟地址(RVA)到文件偏移的转换

    关于PE文件格式的详细描述在网络上可以找到一大堆,最近有空,我也来研究一把.读了很多参考资料,应该说都讲得非常清晰,尤其是看雪学院的iamgufeng翻译的那篇文章,读来受益非浅. 根据我这个菜鸟的阅 ...

  6. 理解文件偏移相对内存偏移节偏移

    问题背景 解决方法 总结 阅读之前注意: 本文阅读建议用时:5min 本文阅读结构如下表: 项目 下属项目 测试用例数量 问题背景 无 0 解决方法 无 0 总结 无 0 问题背景 拜读<0da ...

  7. 相对虚拟地址,虚拟地址,文件偏移地址

    相对虚拟地址(RVA,Relative Virtual Address):RVA只是内存中的一个简单相对于PE文件装入地址的偏移位置,它是一个"相对地址",或称"偏移量& ...

  8. 实现虚拟内存地址到文件偏移地址的转换

    写在前面:这是一次实践作业,用c来写似乎好写一点,但我比较熟悉python,也找到了python相关的库,就用python来实现下,用一晚上把前天写的代码变成了图形化界面,自学过程中,学到了许多东西, ...

  9. OpenCV中将RGB数组在内存中压缩成JPEG文件

    环境 jpeg库: jpegsr9a  下载地址:http://www.ijg.org/ 编译环境: vs2015 Opencv 3.4.2 一.RGB数组来自BMP文件,直接输出在文件系统上 1.1 ...

最新文章

  1. OVS DPDK--virtqueue(十七)
  2. redis分布式锁-基本概念与实现方式对比
  3. NFC能否成为“标配”?
  4. POJ - 2065 SETI(高斯消元解方程(取模))
  5. 2014.8.20日结
  6. 1 Hello World,JavaFX Style
  7. 26.Yii 模块(2)
  8. 【家具CRM客户关系管理系统案例】数夫助力左右家私CRM客户关系管理系统正式上线
  9. 给程序进行简单的加壳
  10. LeetCode算法之蓄水池算法
  11. JavaScript中的数据类型判断
  12. 2022大三计算机 | 保研机试 | 学习路线
  13. Dubbo重启一年,尚能饭否?
  14. http://ajava.org/readbook/java/javaemail/11239.html Mime 邮件详解
  15. 【驱动之四】Nt和Zw
  16. xv6 - lab0 - 操作系统组织
  17. 驾校管理系统linux界面分析,驾校管理系统-20210327024111.docx-原创力文档
  18. PHP数据类型、PHP声明和PHP变量
  19. Tableau 巴西世界杯(一)国家地图分布
  20. DM数据库大小写敏感

热门文章

  1. Python之 sklearn:sklearn中的train_test_split函数的简介及使用方法之详细攻略
  2. ML之xgboost:基于xgboost(5f-CrVa)算法对HiggsBoson数据集(Kaggle竞赛)训练实现二分类预测(基于训练好的模型进行新数据预测)
  3. 《疯狂JAVA讲义》3
  4. 机器学习-过拟合和欠拟合以及正则化处理
  5. POJ_2104 K-th Number 【主席树】
  6. Dubbo实现原理之基于SPI思想实现Dubbo内核
  7. 3、构建bass服务及model
  8. 状态压缩 HDU 1565
  9. 电子病历开发经验共享 —— 2009年一时兴起写在某个论坛上的,转抄留恋。
  10. C#3.0 为我们带来什么(2) —— 自动属性