0x0 基础知识
00 RVA & FOA 转换;
- 当一个 PE 文件被加载到内存中以后,我们称之为 ” 映象 “(image)。一般来说,PE文件在硬盘上和在内存里是不完全一样的,被加载到内存以后其占用的虚拟地址空间要比在硬盘上占用的空间大一些,这是因为各个节在硬盘上是连续的,而在内存中是按页对齐的,所以加载到内存以后节之间会出现一些“空洞” 。
- 因为存在这种对齐,所以在 PE 结构内部,表示某个位置的地址采用了两种方式,即RVA和FOA
- RVA:英文全称 Relatively Virtual Address 。
相对虚拟地址 ,内存地址相对于映射基地址的偏移地址。 - FOA:英文全称 FileOffset 。
文件偏移地址 ,和内存无关,它是指磁盘某个位置距离文件头的偏移。
VA ==> ROA ==> FOA
1. RVA = VA – ImageBase
2. 循环扫描区块表得每个区块在内存中的起始RVA(根据MAGE_SECTION_HEADER中的VirtualAddress字段),并根据区块大小 (根据IMAGE_SECTION_HEADER中的SizeOfRawData段)算出区块的结束RVA(两者相加即可),最后判段目标RVA是否落在该区块内。
3. 通过步骤一定位了目标RVA处于具体的某个区块中后,那么用目标RVA减去该区块的起始RVA,这样就能得到目标RVA相对于起始地址的偏移量newRVA。
4. 在区块表中获取该区块在文件中所处的偏移地址 (根据IMAGE_SECTION_HEADER中的PointerToRawData字段),将这个偏移值加上步骤二得到的newRVA值,就得到了真正的文件偏移地址
2. 循环扫描区块表得每个区块在内存中的起始RVA(根据MAGE_SECTION_HEADER中的VirtualAddress字段),并根据区块大小 (根据IMAGE_SECTION_HEADER中的SizeOfRawData段)算出区块的结束RVA(两者相加即可),最后判段目标RVA是否落在该区块内。
3. 通过步骤一定位了目标RVA处于具体的某个区块中后,那么用目标RVA减去该区块的起始RVA,这样就能得到目标RVA相对于起始地址的偏移量newRVA。
4. 在区块表中获取该区块
01 文件对齐与内存对齐
- 区块的大小是要对齐的,有两种对齐值,一种用于磁盘文件内,另一种用于内存中。PE文件头中指出了这两个个值,他们可以不同。
- 在PE文件头中,
FileAignment 定义了磁盘 区块的对齐值,每一个区块从对齐值的倍数的偏移位置开始。- 一个典型对齐值是200H,每一个区块从200H的倍数的文件偏移位置开始。
- 假设区块的第1个节在400H处,长度为90H,那么400H~490H为这个区块的数据,而文件对齐值为200H,为了使这一节的长度为FileAignment 的整数倍,490H~600H会被0填充,这段空间称为区块间隙,下一个区块的开始位置为600H。
- 在PE文件头中,
SectionAignment 定义了内存 区块的对齐值,每一个区块从对齐值的倍数的偏移位置开始。- 在x86系统中,PE文件区块的内存对齐值一般为
1000H (4KB),每个区块从1000H的倍数的内存偏移开始; - 在x64系统中,PE文件区块的内存对齐值一般为
2000H (8KB),每个区块从2000H的倍数的内存偏移开始;
- 在x86系统中,PE文件区块的内存对齐值一般为
0x1 实现代码
© 版权声明
THE END
暂无评论内容