如何使用RVA获取OffSet
问个简单的问题, 现用CreateFile()函数打开一个PE文件, 已经获得了IMAGE_IMPORT_DESCRIPTOR 结构, 得到了Name1字段的RVA值, 现想用ReadFile()函数读取文件名, 也就是要获取文件偏移地址, 下面是我写的, 但是不知道为什么数据会读不出来...
代码:
DWORD GetReadStart(DWORD * VirtualAddress)
{
int readnum = 0;
int lasterror = 0;
int OffSize = 0;
OffSize = HeadersSize - fileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER); //HeaderSize是整个文件头的大小
SetFilePointer(hFile, OffSize, NULL, FILE_BEGIN);//将文件指针设置到第一个节表处
for (int i = 1; i <= fileHeader.NumberOfSections; i ++)
{
if (ReadFile(hFile, m_psecHeader, sizeof(IMAGE_SECTION_HEADER), (LPDWORD)&readnum, NULL))
{
if ((*VirtualAddress) >= m_psecHeader->VirtualAddress &&
(*VirtualAddress) < (m_psecHeader->VirtualAddress + m_psecHeader->SizeOfRawData))
return m_psecHeader->PointerToRawData + (*VirtualAddress) - m_psecHeader->VirtualAddress;
}
else
{
MessageBox(GetActiveWindow(), TEXT("Can't read section header"), NULL, MB_OK);
return FALSE;
}
}
MessageBox(GetActiveWindow(), TEXT("Can't find section"), NULL, MB_OK);
return 0;
}
下面是调用该函数
//ImportDescriptor是一个IMAGE_IMPORT_DESCRIPTOR结构.
ReadStart = GetReadStart(&ImportDescriptor.Name);
SetFilePointer(hFile, ReadStart, NULL, FILE_BEGIN);
//len = strlen(szTemp);
if (!ReadFile(hFile, &szTemp[strlen(szTemp)], 20, (LPDWORD)&readnum, NULL))
现ReadFile()函数的返回值为1, 想不明白是咋回事啊
还望哪位大虾赐教下..
------解决方案--------------------
ReadFile()函数的返回值为1表明执行成功了呀 这里有什么奇怪的吗?readnum才是真正读取到的字节数!
另外GetReadStart()的返回值类型为DWORD ,在其获取偏移失败时你分别返回了FALSE和0,这种写法不规范哦。在调用GetReadStart()函数后,你没有对返回值ReadStart进行判断,就直接调用SetFilePointer()...了,这会导致错误扩散哦,最后ReadFile可能读取到错误的信息。
------解决方案--------------------RVA转换OFFSET貌似用不到IMAGE_IMPORT_DESCRIPTOR吧?跟导入表有关系?