找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3511|回复: 0

【PE】RVA与文件内偏移的转化关系

[复制链接]

1110

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24225 个
贡献
46222 次
宅之契约
0 份
在线时间
2296 小时
注册时间
2014-1-26
发表于 2014-4-24 18:46:38 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
前几天做PrintPE遇到问题,当我想要找到输入输出表(也就是DLL导出、引用DLL的表)的时候发现找到的数据不对。嗯,kernel32.dll貌似是对的,但是GDI32.dll和user32.dll就会出错。
后面意识到这个是RVA与文件内偏移的转化问题。上网下了一些源码看,发现它们使用了ImageRvaToVa这个函数。然后发现ImageRvaToVa这个函数是微软提供的API(MSDN上有资料)。这让我感受到了深深的蛋疼。
最后通过逆向这个API我弄清楚了ImageRvaToVa的原理。它其实是判断这个RVA落在哪个段。然后进行一些转换。
我的目标是获取RVA与文件内偏移的转化关系,因此我实现了RvaToFileOffset这个函数。这里给出源码。
  1. DWORD RvaToFileOffset(DWORD dwRVA,IMAGE_SECTION_HEADER*pSecHeaders,DWORD dwNbSections)
  2. {
  3.     while(dwNbSections--)//遍历所有段
  4.     {
  5.         if(dwRVA>=pSecHeaders->VirtualAddress &&
  6.             dwRVA<=pSecHeaders->VirtualAddress+pSecHeaders->SizeOfRawData)//在段内
  7.             return dwRVA+pSecHeaders->PointerToRawData-pSecHeaders->VirtualAddress;//取得文件内偏移
  8.         pSecHeaders++;//找下一个段
  9.     }
  10.     return dwRVA;//不在所有的段内,则返回原数值。
  11. }
复制代码
代码非常简单。就是简单的范围判断。
回复

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-19 12:12 , Processed in 0.034096 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表