内存对齐与文件对齐
pe文件将对齐,无论其是否存储在磁盘和内存中,但对齐值不同。
PE文件头中的文件定义磁盘区块的对齐值。 每个块都从对齐值倍数的偏移位置开始存储。 另一方面,块的实际代码和数据的大小不一定这么多,所以一般用00h填充剩下的地方。 这就是方块之间的间隙。
PE文件头中的SectionAligment定义内存中块的对齐值。 当PE文件映射到内存时,块始终从至少一个页面边界开始。
rva与fov的相互转换
RVA与FOV的相互转换
为什么要转换:可以从内存的位置找到.文件中这个数据的位置.或者相反.找到后可以修改.
relativevirtualaddress (RVA )是内存中数据相对于文件开头位置的偏移。
举个例子:
在尝试访问某个数据时,如果Windows加载程序将PE文件加载到00400000h的内存中,某个块的某个数据被加载到0040…xh中,则该数据的RVA为(0040…xh - 00400000h ) (RVA=虚拟地址-ImageBase (基于模块.程序的第一个地址.)
FOV与RVA大致相同,FOV是指文件位于硬盘上时要访问的数据位置相对于文件头位置的偏移。
所以我们可以看到他们的关系。 如果rva的位置位于文件报头中,则此时rva与fov值相等,因为rva还没有受到解压缩的影响。
如果不在文件头中,则只需计算数据位置与包含该数据的节之间的差值。 然后,因为该差分值与硬盘内的数据位置和某一节的差分值相同,所以首先求出差分值=rva-节virtualadress (存储器对齐值)。 然后,fov=差异部分pointertorawData (文件对齐值)。