PE文件里RVA比文件中的实际地址大0x10000,参考下图,这时用UE查看一个PE的内容.idata段的RVA(0x19000)比直接的指针(0x9000)大了0x10000,.idata段实际在0x9000的位置上,能告诉我为什么吗
解决方案 »
- 在2000下 vc卸载后,不能安装
- 哪位有guidgen工具?
- 工程中的文件与classwizard中的类不一样多
- 也谈Windows自动关机程序
- 一个在遍历注册表时出现的问题,帮我,谢谢。
- MFC初学者用哪本书比较好?
- 我是个初学者,请问什么叫掩码,有什么用
- 怎样用VC++6.0建立一个简单的有DllMain的.c(不要.cpp)的Dll?
- How to change the background color in CView
- QListWidget中鼠标划过item时没有收到 itemEntered(QListWidgetItem*) 信号, 已经设置mouseTracking;
- listview翻页
- 这个错误奇怪!!!!!!
另外,看不到图。
图片在这里
http://lh4.ggpht.com/_GWhYFn-Ueds/SVjT9PYrB6I/AAAAAAAABEA/ImQ0BUfl8sg/Address.JPG
下面是具体代码演示
首先, 在分析Coff Header的时候, 保存Section Header
到std::vector<PIMAGE_SECTION_HEADER> m_vSectionHeaders;
// read the section headers
m_vSectionHeaders.clear();
for( int i = 0; i < m_pCoffHeader->NumberOfSections; i++)
{
PIMAGE_SECTION_HEADER pSectionHeader = (PIMAGE_SECTION_HEADER)m_pDotNetPEFile->GetCurrentMemoryPointer();
m_pDotNetPEFile->MoveCursorForward(sizeof(IMAGE_SECTION_HEADER));
m_vSectionHeaders.push_back(pSectionHeader);
}
RVA只是相对虚拟地址, 是程序加载后的映射地址,
然后,根据RVA就能获取到Offset
DWORD CPEFileHeader::GetOffsetFromRVA(DWORD dwRva)
{
std::vector<PIMAGE_SECTION_HEADER>::iterator iter;
for( iter = m_vSectionHeaders.begin(); iter != m_vSectionHeaders.end(); iter++)
{
if((*iter)->VirtualAddress <= dwRva &&
((*iter)->VirtualAddress + (*iter)->SizeOfRawData) > dwRva )
{
return (*iter)->PointerToRawData + (dwRva - (*iter)->VirtualAddress);
}
}
CDotNetPEFileException::Throw(_T("Can not find the offset via GetOffsetFromRVA()."));
return 0UL;
}
后一个是文件中块偏移因为PE并不是完全按照文件中块的offset来映射的,块在内存中的offset跟文件中的offset是不一样的但是,文件中的高地址块一定是映射到内存中的高地址处
http://msdn.microsoft.com/en-us/magazine/cc301805.aspx