理解文件偏移&相对内存偏移&节偏移
作者:互联网
- 问题背景
- 解决方法
- 总结
阅读之前注意:
本文阅读建议用时: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填充的区块间隙。
总结
之所以有文件偏移和相对内存偏移的不同,是因为文件的节在磁盘中的存放结构,和载入内存中的存放结构不同。这就产生了节偏移。
参考资料
文章目录
标签:文件,RVA,text,偏移量,偏移,内存 来源: https://blog.csdn.net/LQMIKU/article/details/114073174