内存对齐与文件对齐

一个pe文件无论在磁盘和内存中存放都会进行对齐,但他们的对齐值会不相同。
PE 文件头里边的FileAligment 定义了磁盘区块的对齐值。每一个区块从对齐值的倍数的偏移位置开始存放。而区块的实际代码或数据的大小不一定刚好是这么多,所以在多余的地方一般以00h 来填充,这就是区块间的间隙。
PE 文件头里边的SectionAligment 定义了内存中区块的对齐值。PE 文件被映射到内存中时,区块总是至少从一个页边界开始。
rva与fov的相互转换

RVA与FOV的相互转换

为什么要转换:可以通过内存位置.找到文件中这个数据的位置. 或者反之. 如果找到就可以进行修改了。
RVA(Relative Virtual Address)指的是内存中的一个数据相对于文件头位置的偏移量。
举个例子:
当我们想要访问一个数据时,如果 Windows 装载器将一个PE 文件装入到 00400000h 处的内存中,而某个区块中的某个数据被装入 0040…xh 处,那么这个数据的 RVA 就是(0040…xh - 00400000h )= …xh。(RVA = 虚拟地址-ImageBase(模块基址.程序一开始的地址.))
FOV与RVA大致相同,FOV指的是文件在硬盘中时访问的数据的的位置相对于文件头位置的偏移量。
所以由此我们可以看到他们之间的关系。当rva的位置在文件头中时,由于rva还没有收到拉伸的影响,所以此时rva等于fov的值。
当不在文件头中时,我们只需要计算出数据的位置,与该数据所在的节的差值,然后该差值是与硬盘中的数据所在位置与所在节的差值相同,所以我们先求出差值=rva-节virtualadress(内存对齐值)。然后fov=差值+节pointertorawData(文件对齐值)。