PE学习(6) RVA与FOA互转

在之前五篇文章中,无意中已经涉及到RVAFOA的互相转化

RVA与节表的VirtualAddress有关

FOA与节表的PointerToRawData有关

继续展示老图(似乎五篇文章都有这个图)

 

RVA TO FOA

使用和前文相同的代码,解析头部的一些数据

如果输入的RVA不在节中,位于头部,直接返回

遍历节表,如果输入的RVA位于图中绿色的保留区,返回0

只有RVA位于对齐前节内(Misc.VirtualSize)中,认为可以转换。使用VirtualAddress偏移加当前Misc.VirtualSize得到的是当前节对齐前有效内存偏移

RVA减去当前VirtualAddress得到先对于当前节的起始位置的偏移,从PointerToRawData偏移相同的大小即可得到RVAFileBuffer中的偏移,也就是我们需要的FOA

 

整体代码

 

FOA TO RVA

FOARVA的代码类似

当输入FOA位于头部时直接返回

遍历节表,如果FOA小于当前节文件起始偏移PointerToRawData(位于绿色中)返回0

FOA大于PointerToRawData且小于对齐前最大偏移,认为这是有效的FOA

使用FOA减去PointerToRawData得到相对当前节起始位置的偏移,这个偏移同时也是相对于VirtualAddress的偏移,相加后得到我们需要的RVA值:输入的FOA地址对应的内存ImageBuffer地址

 

整体代码