系统相关
首页 > 系统相关> > 理解文件偏移&相对内存偏移&节偏移

理解文件偏移&相对内存偏移&节偏移

作者:互联网

996.icu LICENSE


阅读之前注意:

本文阅读建议用时:5min
本文阅读结构如下表:

项目下属项目测试用例数量
问题背景0
解决方法0
总结0

问题背景

拜读《0day安全:软件漏洞分析技术》(第2版)时,看到了文件偏移的计算方法:

相对内存偏移(RVA) = 内存地址 - 加载基址
节偏移 = Voffset(该节在内存中的偏移量) - Roffset(该节在文件中的偏移量)
文件偏移 = 相对内存偏移(RVA) - 节偏移

看到这里,尽管作者有解释文件偏移和相对内存偏移不同的原因:即文件在磁盘中的存放结构,和文件载入内存中的存放结构不同,但这里并不直观。相信很多人会和我一样不太能懂为什么会有上面的计算方法。

解决方法

一番搜索,在看雪上找到了答案。
在这里插入图片描述
如上图,以.text节为例,左边400h - 0h = 400h是Roffset(.text节在文件中的偏移量),右边401000h - 400000h = 1000h是Voffset(.text节在内存中的偏移量)。
现在,对于上图应用程序,给定一个内存地址401125h,求对应的文件偏移地址。
根据上图知,该内存地址在.text节,则根据文件偏移的计算方法有:
相对内存偏移(RVA) = 401125h - 400000h = 1125h
.text节偏移 = 1000h - 400h = c00h
文件偏移 = 1125h - c00h = 525h

更直观一点,就好比2个人比赛跑步,跑了一样的距离125h,但起跑线不同(一个从左边400h开始跑,另一个从右边1000h开始跑)。节偏移就是起跑线的差距
另外,这里没用看雪答案中的401325h:因为401325h - 401000h = 325h,而.text这一节总大小只有200h,所以401325h没有对应的文件偏移,该内存地址是在内存中的以0填充的区块间隙。

总结

之所以有文件偏移和相对内存偏移的不同,是因为文件的节在磁盘中的存放结构,和载入内存中的存放结构不同。这就产生了节偏移。

在这里插入图片描述

参考资料

  1. 请问如何将偏移量转换为地址?
  2. 理解PE文件相对虚拟地址(RVA)到文件偏移的转换

文章目录

标签:文件,RVA,text,偏移量,偏移,内存
来源: https://blog.csdn.net/LQMIKU/article/details/114073174