这一部分把汇编从“单条指令”放回“程序框架”里看。逆向时不只要知道 add 是加法,还要知道代码段、数据段、入口点、调用 API 和程序退出之间的关系。

1、内容范围

小节 内容 复盘点
04.5 C 语言控制台程序 高级语言程序的入口、调用和退出
04.6 汇编程序框架 数据段、代码段、入口点、调用 API
04.7 程序指令集 指令、操作数、寄存器和内存
04.8 工作模式 实模式、保护模式、用户态理解
04.9 动态调用与函数声明 API 声明、导入与调用
05.0 - 05.3 段定义与入口周期 数据段、代码段、入口点
05.4 - 06.5 算术与位运算 ADD、SUB、MUL、DIV、AND、OR、XOR、NOT
06.6 - 06.8 操作数与调试 操作数类型、课程路线和 VS 调试

2、C 控制台程序与汇编框架

C 程序通常从 main 开始,但真正的进程入口还包括运行库初始化。入门阶段可以先把它简化成:

1
程序入口 -> 初始化运行环境 -> 调用 main -> 返回退出码 -> 进程退出

汇编程序也有类似结构:

部分 作用
数据段 保存字符串、变量和常量
代码段 保存指令
入口点 程序开始执行的位置
API 调用 使用系统或库函数
退出 返回操作系统

3、段定义与数据样式

在汇编里,数据定义通常要写清大小。

伪指令 含义
db 定义字节
dw 定义字,2 字节
dd 定义双字,4 字节
dq 定义四字,8 字节

复盘时把“字段大小”和“内存解释方式”绑在一起看。

4、加减法指令

指令 含义 影响
add 加法 影响 CF、ZF、SF、OF 等
adc 带进位加法 适合多精度加法
inc 自增 常用于循环计数
sub 减法 影响比较和条件跳转
sbb 带借位减法 适合多精度减法
dec 自减 常用于循环计数
neg 求补码相反数 观察符号和溢出

5、乘除法指令

乘除法常牵涉隐式寄存器。

指令 类型 复盘点
mul 无符号乘法 结果可能占用 EDX:EAX
imul 有符号乘法 注意符号扩展
div 无符号除法 被除数和余数位置固定
idiv 有符号除法 除法前常见符号扩展

除零和除法溢出会触发异常,调试时可以观察异常事件。

6、位运算指令

指令 含义 常见用途
and 按位与 清位、掩码
or 按位或 置位
xor 按位异或 清零、翻转、简单混淆
not 按位取反 位反转

xor eax, eax 常用于快速把 eax 清零。

7、操作数类型

指令操作数可以来自寄存器、立即数或内存。

1
2
3
mov eax, 1        ; 立即数
mov ebx, eax ; 寄存器
mov eax, [ebp-4] ; 内存

逆向时要看清“值”和“地址”的区别:eax 是值,[eax] 是把 eax 当地址再取内存。

8、Visual Studio 调试建议

操作 目的
断点 停在关键语句
单步进入 进入函数内部
单步跳过 执行函数但不进入
反汇编窗口 看源码对应指令
寄存器窗口 看指令执行前后寄存器变化
内存窗口 看数据真实字节

9、学习检查清单

检查项 状态
能说明数据段、代码段和入口点的作用 待复盘
能解释 add/sub/cmp 如何影响标志位 待复盘
能区分有符号和无符号乘除法 待复盘
能看懂 and/or/xor/not 的基本用途 待复盘
能区分立即数、寄存器操作数和内存操作数 待复盘