日期:2014-05-17  浏览次数:20835 次

如何使用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吧?跟导入表有关系?