流水账笔记:PE文件格式(RVA & FOA)

来源:互联网 发布:linux 翻到最后一页 编辑:程序博客网 时间:2024/05/16 10:52

讲解 PE 文件时经常出现 映像(Image) 这一术语,希望各位牢记。PE 文件加载到内存时,文件不会原封不动地加载,而要根据节区头中定义的节区起始地址、节区大小等加载。因此,磁盘文件中的 PE 与内存中的 PE 具有不同的形态。将装载到内存中的形态成为映像 以示区别,使用这一术语能够很好地区分二者。 —— 《逆向工程核心原理》

假设文件与内存的映射关系如下表:

内存中的地址 文件中的地址 0x00400000 ~ 0x00401000 0x000 ~ 0x400 0x00401000 ~ 0x00402000 0x400 ~ 0x600 0x00402000 ~ 0x00403000 0x600 ~ 0x800

注:ImageBase = 0x00400000


如:内存中的地址 0x0040100C

此时 RVA1 = 0x0040100C - ImageBase = 100C。

计算 FOA 时,先判断 0x0040100C 落在哪个节中,从图中可以知道落在了第二个节 0x00401000 ~ 0x00402000 范围内。
于是 FOA = 0x0040100C - ImageBase + 0x400 = 0x40C

根据 IMAGE_SECTION_HEADER 结构体,换算公式如下:
FOA - PointerToRawData = RVA - VirtualAddress —— 《逆向工程核心原理》
注:
PointerToRawData: 节区在文件中的基地址
VirtualAddress : 节区在内存中的基地址

~ ~ 以后有空再补充…


  1. 相对模块的偏移地址
    FOA: 文件中的位置 ↩
阅读全文
0 0
原创粉丝点击