虚拟内存与程序调试

虚拟内存

  • Windows的内存可以被分为两个层面:物理内存和虚拟内存。其中物理内存非常复杂,需要静茹Windows内核级别ring0才能看到。通常,在用户模式下,用调试器看到的内存地址都是虚拟内存。
  • 程序进行虚地址(逻辑地址)到实地址(物理地址)转换的过程称为程序的再定位。

几个重要概念:

  • 文件偏移地址(File Offset):数据在PE文件中的地址,相对于文件开头的偏移地址。
  • 装载基址(Image Base): PE装入内存时的基地址
    • 默认情况下,exe文件在内存中的基地址是0x00400000,dll文件是0x10000000。可以通过修改编译选项修改。
  • 虚拟内存地址(Virtual Address):PE文件中的指令被装入内存后的地址
  • 相对虚拟地址(Relative Virtual Address,RVA):内存地址相对于装载基址的偏移量

PE文件和内存中的差异

  • PE文件中的数据按照磁盘数据标准存放,以0x200字节为基本单位进行组织。
  • 内存是0x1000字节

工具

  • lordPE
  • OllyDbg,适合动态调试
  • IDA(Interactive Disassembler)适合静态调试