Windows逆向工程入门之 ADDRESS(virtual logical effective linear physical)

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> ​​​链接点击跳转博客主页

地址概念总览

  1. 虚拟地址(Virtual Address)
    • 用户态程序在运行期间使用的地址,是应用程序的视角下的地址。
    • 通过分页机制映射到物理地址。
  2. 逻辑地址(Logical Address)
    • 由CPU生成的地址,通常表示为段选择器:段内偏移(Segment:Offset)。
    • 需要通过段寄存器(如CS、DS等)与段表的基地址换算成线性地址。
  3. 有效地址(Effective Address)
    • 逻辑地址与基础操作数地址计算中的偏移值。
    • 比如[EBX + offset]指向的地址。
  4. 线性地址(Linear Address)
    • 逻辑地址经Segmentation模块(分段机制)处理后得到的地址。
    • 在启用分页(Paging, CR0.PG=1)后再经页表机制翻译为物理地址。
  5. 物理地址(Physical Address)
    • CPU最终访问的内存地址,用于访问RAM或硬件设备。
    • 是经过虚拟地址/线性地址由分页机制最终映射得到的。

代码解析

C++代码段
#include   

int g_var = 1;  

int main()  
{  
    // mov dword ptr ds:[0498000h], 2   
    // segment:offset  
    // CR0.PG  CR0.PE  
    // CR3   
    g_var = 2;  

    return 0;  
}

这段代码主要展示变量g_var的赋值操作,目标是在理解全局变量如何映射到内存层次(从虚拟地址到物理地址)。重点涉及了以下过程:

  1. 全局变量的初始化:

    int g_var = 1;

    • 这是一个全局变量,存储在程序的**数据段(.data Segment)中。
    • 编译和链接期间,g_var被分配了一个全局唯一的虚拟地址。
  2. 全局变量的修改:

    g_var = 2;

    • 反汇编后的汇编指令可能为:

      mov dword ptr ds:[0498000h], 2

      • ds:[0498000h]: 表示以段寄存器DS为基础访问线性地址。
      • 0498000h: 是g_var在数据段中的虚拟地址。

运行时关键机制

  1. 段机制(Segmentation, CR0.PE):

    • 此机制将逻辑地址段选择器:段内偏移(如DS:0498000h)转换为线性地址。
    • 在现代x86/x64模式下,段机制已经简化,例如代码段、数据段通常采用同一个基址(Flat模式)。
  2. 分页机制(Paging, CR0.PG):

    • 在启用分页功能时,CPU通过页表将线性地址转换为物理地址。分页涉及以下主要过程:
      • CR3:保存页表基址(Page Directory Base Register)。
      • 页表遍历:通过多级页表(如四级页表)解析线性地址为物理地址。
      • 页表标志:包括是否存在(Present Bit),读/写权限(Read/Write)。
  3. 段寄存器与分页的结合:

    • 在x86 Protected模式下,分页和分段结合使用:
      • 如果CR0.PE=1(启用分段保护模式),则逻辑地址需先通过段机制生成线性地址。
      • 如果同时CR0.PG=1(启用分页),线性地址再通过分页机制映射为物理地址。

内存分布及页面映射

在代码运行时,可以结合以下结构化内存映射分析g_var变量的物理地址及访问流程:

  1. 假设虚拟地址为0x0498000,对应如下分解:

    虚拟地址(VA) -> 线性地址(LA) -> 物理地址(PA)

  2. 分页转换过程中,检查页表:

    • 假设CR3寄存器基址为0x3fff81c0
    • 检查多级页表映射过程(例如通过WinDbg模拟!dq命令):

      页目录指针表(PDPT): CR3 -> 页目录 -> 页表 -> 页内偏移

  3. 内存分布概念示意:

    • .text段:存储程序代码。
    • .data段:存储已初始化的全局变量(如g_var = 1)。
    • 堆栈段:动态变量和函数调用栈。

知识点扩展

  1. PE文件的内存布局:

    • Windows可执行文件(PE, Portable Executable)加载后,段信息会被映射到虚拟内存。

      .text 段:可执行指令(代码)。 .data 段:已初始化的全局变量。 .bss 段:未初始化的全局变量。

  2. 逆向工具的使用:

    • 反汇编工具如IDA Pro、Ghidra能够解析汇编指令并重建控制流。
    • 调试工具如WinDbg!process!dt命令,用于分析全局变量和结构体。
  3. 段与分页的关系:

    • 分段偏平化的现代设计(x86/x64)大大简化了地址转换:
      • 段基址一般固定(Flat memory)。
      • 大部分地址翻译工作由分页机制完成。
  4. 物理内存保护:

    • 使用分页的NX位(No eXecute)保护内存,使非代码页不可执行,提高系统安全性。

你可能感兴趣的:(windows,汇编,c语言,安全,逆向,Windows,内核)