PE文件中RVA和Offset的转换

    技术2022-05-11  81

    在个人操作PE文件中,时常会用到RVA到Offset的转换。没有更好的算法了,这里是最笨的方法,不过也只能这样了。

    主要思想是:判断一个RVA值在那个节中,然后用这个节的虚拟地址减去物理地址,得到偏移。然后用输入的RVA减去这个偏移就可以了,同理我们也可以使用相同的方法到物理偏移。

    函数实现:RVA2OffsetPIMAGE_SECTION_HEADER ImageRVA2Section(PIMAGE_NT_HEADERS pimage_nt_headers,DWORD dwRVA){ int i; PIMAGE_SECTION_HEADER pimage_section_header=(PIMAGE_SECTION_HEADER)((PCHAR(pimage_nt_headers)) + sizeof(IMAGE_NT_HEADERS)); for(i=0;i<pimage_nt_headers->FileHeader.NumberOfSections;i++) {  if((pimage_section_header->VirtualAddress) && (dwRVA<=(pimage_section_header->VirtualAddress+pimage_section_header->SizeOfRawData)))  {   return ((PIMAGE_SECTION_HEADER)pimage_section_header);  }  pimage_section_header++; } return(NULL);}DWORD RVA2Offset(PCHAR pImageBase,DWORD dwRVA){ DWORD _offset; PIMAGE_SECTION_HEADER section; PIMAGE_DOS_HEADER pimage_dos_header; PIMAGE_NT_HEADERS pimage_nt_headers; pimage_dos_header = PIMAGE_DOS_HEADER(pImageBase); pimage_nt_headers = (PIMAGE_NT_HEADERS)(pImageBase+pimage_dos_header->e_lfanew); section=ImageRVA2Section(pimage_nt_headers,dwRVA); if(section==NULL) {  return(0); } _offset=dwRVA+section->PointerToRawData-section->VirtualAddress; return(_offset);}

     


    最新回复(0)