理解文件偏移相对内存偏移节偏移
- 问题背景
- 解决方法
- 总结
阅读之前注意:
本文阅读建议用时: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 - 节偏移 = 1125h - (1000h - 400h) = 400h + (1125h - 1000h) = 525h
即 文件偏移 = Roffset + (RVA - Voffset)
总结
之所以有文件偏移和相对内存偏移的不同,是因为文件的节在磁盘中的存放结构,和载入内存中的存放结构不同。这就产生了节偏移。
参考资料
- 请问如何将偏移量转换为地址?
- 理解PE文件相对虚拟地址(RVA)到文件偏移的转换
文章目录
- 阅读之前注意:
- 问题背景
- 解决方法
- 总结
- 参考资料
理解文件偏移相对内存偏移节偏移相关推荐
- echart x轴标签偏移_坐标轴名称位置偏移的问题
坐标轴名称位置偏移只能设置横向偏移 xAxis.nameGap ,不能纵向偏移,希望增加此设置项. ` 我修改了源码 var gap = axisModel.get('nameGap') || 0; ...
- html左边移动属性,css左边偏移属性left、右边偏移属性right
[实例介绍] css左边偏移属性left.右边偏移属性right 通过left属性来设置左边偏移属性,通过right属性来设置右边偏移属性. [基本语法] position:static | ab ...
- linux 文件IO与内存映射:内存映射
前言 前面几篇我们学习了用户空间的IO缓冲区,以及IO缓冲区的分散聚合IO技术. 为了减少系统调用的次数,提升系统性能,操作系统开发者门提出了这么多的缓存技术. 但是到这里这些技术同样有不足的地方:不 ...
- 深入理解Java虚拟机-Java内存区域透彻分析
Java虚拟机深入理解系列全部文章更新中- 深入理解Java虚拟机-Java内存区域透彻分析 深入理解Java虚拟机-常用vm参数分析 深入理解Java虚拟机-JVM内存分配与回收策略原理,从此告别J ...
- Unity 全面理解加载和内存管理
最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBundle,其实两者本质上我理解没有什么区别.Resources ...
- 循序渐进:带你理解什么是Java内存模型
近期笔者在阅读<深入理解Java虚拟机:JVM高级特性与最佳实现(第3版)>,书中提到关于Java内存模型的知识点,但是看完之后还是感觉有些模糊,便查阅一些其他相关资料.本文是笔者经过对知 ...
- python生成epub文件_python在内存中生成Zip文件!
import zipfile import StringIO class MemoryZipFile(object): def __init__(self): #创建内存文件 self._memory ...
- 深入理解Java中的内存泄漏
理解Java中的内存泄漏,我们首先要清楚Java中的内存区域分配问题和内存回收的问题本文将分为三大部分介绍这些内容. Java中的内存分配 Java中的内存区域主要分为线程共享的和线程私有的两大区域: ...
- 关于java中多态的理解,涉及到内存空间
其实理解了程序在内存里如何搞,如何玩,是很爽的. 首先简要说明下程序运行时,内存的结构.堆区栈区,常量区,静态方法区和非静态方法区. 1.栈:存放基本类型的变量数据和对象的引用(也就是在new对象时左 ...
最新文章
- linux 关闭redis 命令_redis----------linux和mac如何安装redis和启动,关闭
- excel vba 调用webbrowser_VBA 公式与函数
- 刚刚接触视频剪辑,怎么快速剪视频?
- EXCEL图表技巧:选择合适图表最全指南,建议收藏
- 私有云的优缺点_概述实施私有云的优点和缺点
- 请正视抑郁症(附Zung氏抑郁自评量表(SDS))
- #12304;#9733;#28404;#28404;#37329;#34701;#23458;#26381;#30005;#35805;#9733;#12305;
- 安霸Ambarella三款CV系列芯片对比--CV2S、CV22S、CV25S
- HI3861学习笔记(12)——GPIO输入接口使用
- NavicatPremium从excel文件导入表数据
- 论文《Contrastive Learning for Sequential Recommendation》
- 关于CLASS , SEL, IMP的说明
- 【JSD2209-DAY05】for、while、数组(上)
- golang直接调用ffmpeg预编译类库(windows)
- python中如何将一个数字分解成一个列表
- 推荐几款画韦恩图的在线工具
- redis连接超时,本地连接不上服务器上的redis
- OpenFOAM-v2006重叠网格挖洞问题研究以及overset代码解析(二)PATCH是什么类型的patch?
- 视频教程-深度学习30天系统实训-深度学习
- H3C 不同版本登录认证配置