1、写错了或者印错了
2、Raw size是对齐后的大小。
Virtual size还没有对齐,所以一般看起来都比Raw size小,对齐之后就是0x8000
3、RVA和FOA转换的关键问题就是找到地址在节中的偏移。
一个RVA地址radd,去节表中找radd属于哪个节中记作X,找到之后再用radd减去X节的内存地址(VirtualAddress),结果就是偏移,最后加上PointerToRawData就是最终结果。
一个FOA地址fadd,去节表中找fadd属于哪个节中记作X,找到之后再用radd减去X节的文件地址(PointerToRawData),结果就是偏移,最后加上VirtualAddress就是最终结果。
代码:(注意:RVAToFOA和FOAToRVA有点区别)
[C] 纯文本查看 复制代码 DWORD RVAToFOA(const char *fileBuff, DWORD addr) {
PIMAGE_NT_HEADERS32 nt = copyNTHead(fileBuff);
PIMAGE_SECTION_HEADER sec =
copySecHead(fileBuff) + nt->FileHeader.NumberOfSections;
for (size_t i = nt->FileHeader.NumberOfSections; i > 0; i--) {
sec--;
if (addr >= sec->VirtualAddress)
return addr - sec->VirtualAddress + sec->PointerToRawData;
}
return addr;
}
DWORD FOAToRVA(const char *fileBuff, DWORD addr) {
PIMAGE_NT_HEADERS32 nt = copyNTHead(fileBuff);
PIMAGE_SECTION_HEADER sec = copySecHead(fileBuff);
DWORD rra = 0, rva = 0;
for (size_t i = 0; i < nt->FileHeader.NumberOfSections; i++) {
if (addr < sec->PointerToRawData) {
if (i == 0) return addr;
return addr - rra + rva;
}
rra = sec->PointerToRawData;
rva = sec->VirtualAddress;
sec++;
}
return addr;
}
|