0xAA55 发表于 2014-4-24 18:46:38

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

前几天做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;//不在所有的段内,则返回原数值。
}代码非常简单。就是简单的范围判断。
页: [1]
查看完整版本: 【PE】RVA与文件内偏移的转化关系