这一部分开始真正进入 CPU 状态:寄存器保存当前执行环境,标志位保存运算结果特征,内存保存代码和数据。逆向时看懂这三类信息,就能知道程序“现在执行到哪里、刚才算出了什么、接下来会跳到哪里”。

1、内容范围

小节 内容 复盘点
02.5 寄存器 通用寄存器、段寄存器、指令指针寄存器
02.6 通用寄存器对应关系 EAX/AX/AH/ALRAX/EAX/AX/AL 的包含关系
02.7 寄存器包含关系测试 修改低位寄存器对高位的影响
02.8 段寄存器特性 CS/DS/SS/ES/FS/GS 的基本用途
02.9 指令指针寄存器 EIP/RIP 保存下一条指令地址
03.0 - 03.8 标志寄存器 CF、PF、AF、ZF、SF、DF、OF 与 EFLAGS
03.9 - 04.4 内存基础 内存特性、内存管理、端序、读写和寻址

2、通用寄存器

寄存器是 CPU 内部速度最快的小容量存储区域。入门阶段先掌握常见用途,不必一开始背完整架构手册。

x86 常见用途 x64 对应
EAX 运算结果、返回值 RAX
EBX 通用保存 RBX
ECX 计数、循环、参数 RCX
EDX 扩展运算、参数 RDX
ESI 源地址、字符串操作 RSI
EDI 目的地址、字符串操作 RDI
ESP 栈顶指针 RSP
EBP 栈帧基址 RBP

调试时最常看的是 EIP/RIPESP/RSPEBP/RBP 和返回值寄存器。

3、寄存器包含关系

同一个寄存器可以按不同宽度访问。

1
2
3
4
5
RAX
└── EAX
└── AX
├── AH
└── AL

复盘时要注意:修改 AL 只影响最低 8 位;修改 EAX 在 x64 下通常会把 RAX 高 32 位清零。这类细节会影响反汇编理解。

4、段寄存器

段寄存器在现代 Windows 用户态里不需要天天手算,但 FS/GS 很重要,因为它们常用于访问线程环境块或进程环境相关数据。

寄存器 入门理解
CS 代码段
SS 栈段
DS/ES 数据段
FS/GS 线程/系统相关结构常见入口

后面看 PEB、TEB、反调试和 x64 系统结构时,会再次遇到 FS/GS

5、指令指针寄存器

EIP/RIP 指向下一条要执行的指令。普通代码不能直接像修改普通变量那样写 EIP,但跳转、调用、返回、异常处理都会改变它。

行为 对 EIP/RIP 的影响
顺序执行 指向下一条指令
jmp 跳到目标地址
call 保存返回地址后跳到函数
ret 从栈中取返回地址
异常 进入异常处理流程

6、EFLAGS 与常见标志位

标志位是 CPU 对上一次运算结果的记录,条件跳转经常依赖它。

标志 名称 常见含义
CF Carry Flag 无符号进位/借位
PF Parity Flag 低 8 位 1 的个数是否为偶数
AF Auxiliary Carry BCD 或低半字节进位相关
ZF Zero Flag 运算结果是否为 0
SF Sign Flag 结果最高位是否为 1
DF Direction Flag 字符串指令方向
OF Overflow Flag 有符号溢出

条件跳转的本质:先比较或测试,再根据标志位决定跳不跳。

7、内存特性

内存要同时看地址、内容、权限和所属区域。

维度 复盘问题
地址 当前访问的是哪里
内容 这一段字节代表数据还是指令
权限 可读、可写、可执行吗
区域 栈、堆、模块、映射还是私有内存
生命周期 这块内存什么时候有效

8、端序与内存读写

Windows x86/x64 常见小端序:低位字节存低地址。

1
2
数值:0x12345678
内存:78 56 34 12

逆向时看到字节序列,必须先确认它是按什么宽度、什么端序解释。

9、内存寻址

常见寻址形式:

1
2
3
mov eax, [ebp-4]
mov eax, [esi+ecx*4]
mov eax, [base+index*scale+disp]
部分 含义
base 基址寄存器
index 索引寄存器
scale 1、2、4、8 等比例
disp 固定偏移

数组、结构体、对象成员、本地变量都会落到这些寻址形式里。

10、学习检查清单

检查项 状态
能说出 EAX/ESP/EBP/EIP 的常见用途 待复盘
能解释 ZF/CF/SF/OF 对条件跳转的影响 待复盘
能看懂小端序整数在内存中的排列 待复盘
能根据 [base+index*scale+disp] 推测数组或结构体访问 待复盘
能在调试器里同时观察寄存器、标志位和内存窗口 待复盘