首页
社区
课程
招聘
通过RVA计算数据的文件偏移的疑问
发表于: 2011-10-12 11:14 4413

通过RVA计算数据的文件偏移的疑问

2011-10-12 11:14
4413
本人在学习window32汇编pe部分的时候, 对通过数据的RVA计算数据在文件中的偏移有点不明白, 书上说:

当处理PE文件时,任何的RVA必须经过到文件偏移的换算,才能用来定位并访问文件中的数据,但换算却无法用一个简单的公式来完成,事实上,惟一可用的方法就是最土最笨的方法:

(1)循环扫描节表并得到每个节在内存中的起始RVA(根据VirtualAddress字段),[I]并根据节的大小(SizeOfRawData字段)算出节的结束RVA,[/I]最后比较判断目标RVA是否落在某个节之内。

(2)如果目标RVA处于某个节之内,那么用目标RVA减去节的起始RVA,这样就得到了目标RVA相对于节起始地址的偏移量RVA'。

(3)在节表中获取节在文件中所处的偏移(PointerToRawData字段),将这个偏移值加上上一步得到的RVA'值,这才是数据在文件中的真正偏移位置。

[I]我感觉SizeOfRawDAta是节在文件中的尺寸, 而不是在内存中的尺寸, 那么用节在内存中的起始RVA+节在文件中的尺寸 如何能得到节在内存中的结束RVA???节在内存中是会膨胀的啊, 不是和文件中的大小相对应啊.[/I]

还请大家多多帮助, 不胜感激.

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 31
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
2
楼主可以用lordpe载入一个pe文件算下,个人觉得,这个是印刷错误吧。应该是起始节RVA+VirtualSize 然后判断目标RVA是否在这个节内。

PhysicalAddress
File address.
VirtualSize
Total size of the section when loaded into memory, in bytes. If this value is greater than the SizeOfRawData member, the section is filled with zeroes.
VirtualAddress
Address of the first byte of the section when loaded into memory, relative to the image base.
SizeOfRawData
Size of the initialized data on disk, in bytes. This value must be a multiple of the FileAlignment member of the IMAGE_OPTIONAL_HEADER structure. If this value is less than the VirtualSize member, the remainder of the section is filled with zeroes. If the section contains only uninitialized data, the member is zero.
2011-10-12 15:31
0
雪    币: 75
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
首先楼主的理解:SizeOfRawDAta是节在文件中的尺寸, 而不是在内存中的尺寸, 那么用节在内存中的起始RVA+节在文件中的尺不一定得到节在内存中的结束RVA ,正如楼主所说,节加载到内存中,以内存页(一般为1000h)
对齐,存在某一节加载到内存中要膨胀,多余空间一般填0。
其次,上述的方法计算方法是为了将某一虚拟地址计算出它的文件偏移地址,从而能通过读磁盘的PE文件获取文件的数据,故1)判断目标RVA所落的的节的方法是对的 ,只是描述 内存中节开始rva+SizeOfRawData 不一定等于内存中节的结束RVA
  刚开始学PE 结构分析时 和楼主有同样的疑惑,后来看了加密与解密这本书 关于PE文件格式讲解才完全明白,楼主可参考 书的277页 (第10章PE文件格式),就会全明白了
2011-10-12 15:32
0
雪    币: 534
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢大家帮助, 我差不多搞懂了, 还是但是需要缕一下. 谢谢
2011-10-17 08:19
0
游客
登录 | 注册 方可回帖
返回
//