标题:PE虚拟地址与文件地址转换


在安全面试中,有一类问题比较典型,就是将PE在内存中的虚拟地址转化为在磁盘上的文件地址。首先来依次理解一下与PE有关的地址概念:

PE首先加载到一个基地址:ImageBase:0x400000

 

VA:虚拟地址

RVA:相对虚拟地址。RVA=VA-ImageBase

 

VOffset:VirtualAddress节起始地址对于ImageBase的偏移量

 

ROffset: PointerToRawData

节起始地址对于文件起始位置的偏移量

 

上面几个数据(ImageBase,VOffset,ROffset,VA)都应该是已经知道的,在计算中会告诉你的。

现在让你求某个虚拟地址VA,对应的文件偏移地址:fRVA

 

fRVA-ROffset=VA-ImageBase-VOffset 移项之后:

 

fRVA=VA-ImageBase-VOffset+ROffset=RVA-VOffset+ROffset

 

上述等式的原理就是:虚拟地址和文件地址对于节起始的偏移是固定的。


比如一个实际例题:
名称Name  VOffset    VSize    ROffset    RSize    标志
.text    0000540    00069f9b  00000540  00069fc0  68000020

虚拟地址VA = 00049586,ImageBase = 00040000

求虚拟地址对应的文件地址。

由题意可知:va=00049586, imgagebase=00040000, voffset=000540,roffset=0000540,那么带入上面的方程:
fRva=00049586-00040000-0000540+0000540=9586


练习题:

已知ImageBase=0x00400000,代码段.text起始地址 RVA(即VOFFSET)为0x00001000,ROFFSET为0x0400 虚拟地址为0x00404141处的一条指令,如何换算出这条指令在文件中的偏移量?

答案:0x3541


看文字不过瘾?点击我,进入周哥教IT视频教学
麦洛科菲长期致力于IT安全技术的推广与普及,我们更专业!我们的学员已经广泛就职于BAT360等各大IT互联网公司。详情请参考我们的 业界反馈 《周哥教IT.C语言深学活用》视频

我们的微信公众号,敬请关注