0day笔记(1)PE文件格式与虚拟文件内存的映射

PE文件格式

  • PE 文件格式把可执行文件分成若干个数据节(section),不同的资源被存放在不同的节中。 一个典型的 PE 文件中包含的节如下:
    • .text 存放着二进制的机器代码
    • .data 初始化的数据块,如宏定义、全局变量、静态变量等。
    • .idata 可执行文件所使用的动态链接库等外来函数与文件的信息。
    • .rsrc 存放程序的资源,如图标、菜单等。
  • 除此以外,还可能出现的节包括“.reloc”、“.edata”、“.tls”、“.rdata”等。
  • 某些加壳处理会影响节信息

PE 文件与虚拟内存之间的映射

书中摘取

  • 文件偏移地址: 文件中的数据,二进制代码等相对于文件头部的偏移地址
  • 装载基址:文件加载进内存时的文件头部的地址
    • 默认情况下,EXE 文件在内存中的基地址是 0x00400000,DLL 文件是 0x10000000。这些位置可以通过修改编译选项更改
  • 虚拟内存地址: PE中的指令数据等加载进内存后的地址
  • 相对虚拟地址: 相对虚拟地址是内存地址相对于映射基址的偏移量。
    • 虚拟内存地址 != 装载基址+文件偏移地址
    • 相对虚拟地址 = 虚拟内存地址 - 装载基址
    • 造成相对相对虚拟地址与文件偏移地址的差异的原因:
      • PE 文件中的数据按照磁盘数据标准存放,以 0x200 字节为基本单位进行组织。
      • 当代码装入内存后,将按照内存数据标准存放,并以 0x1000 字节为基本单位进行组织
      • 不够一个基本单位填充 0x00 ,永远是基本单位的整数倍
        在这里插入图片描述
        使用lord PE可查看修改内存关系
  • 文件偏移地址 = 虚拟内存地址(VA)- 装载基址(Image Base)- 节偏移
  • 节偏移 = 文件偏移地址- 虚拟内存地址
原文地址:https://www.cnblogs.com/l0nmar/p/12553848.html