RVA与FOA的转换
1.PE程序加载入内存后头的地址与文件中一致,但对齐方式(偏移)不同
2.结构体:
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD PhysicalAddress;
DWORD VirtualSize; //节区的尺寸
} Misc;
DWORD VirtualAddress; //节区的RVA地址
DWORD SizeOfRawData; //在文件中对齐后的尺寸
DWORD PointerToRawData; //在文件中的偏移
DWORD PointerToRelocations;
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics; //节的属性
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
3.RVA到FOA的转换:
<1>得到RVA的值:内存地址-ImageBase
<2>判断RVA是否位于PE头中,如果是:FOA == RVA
<3>判断RVA属于哪个节:
RVA >= 节.VirtualAddress
RVA <= 节.VirtualAddress
差值= RVA - 节.VirtualAddress
<4>FOA = 节.PointerToRawData + 差值