0206、Windows 逆向入门:汇编框架与基础指令
这一部分把汇编从“单条指令”放回“程序框架”里看。逆向时不只要知道 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 | mov eax, 1 ; 立即数 |
逆向时要看清“值”和“地址”的区别:eax 是值,[eax] 是把 eax 当地址再取内存。
8、Visual Studio 调试建议
| 操作 | 目的 |
|---|---|
| 断点 | 停在关键语句 |
| 单步进入 | 进入函数内部 |
| 单步跳过 | 执行函数但不进入 |
| 反汇编窗口 | 看源码对应指令 |
| 寄存器窗口 | 看指令执行前后寄存器变化 |
| 内存窗口 | 看数据真实字节 |
9、学习检查清单
| 检查项 | 状态 |
|---|---|
| 能说明数据段、代码段和入口点的作用 | 待复盘 |
能解释 add/sub/cmp 如何影响标志位 |
待复盘 |
| 能区分有符号和无符号乘除法 | 待复盘 |
能看懂 and/or/xor/not 的基本用途 |
待复盘 |
| 能区分立即数、寄存器操作数和内存操作数 | 待复盘 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ruiqy~!









