虚拟内存
- 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)适合静态调试