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