0213、Windows 逆向入门:MASM 汇编基础
这一部分用 MASM 把汇编从“反汇编阅读”推进到“能写最小实验”。写汇编不是为了替代 C/C++,而是为了更准确理解数据定义、调用约定、结构体布局和伪指令。
1、内容范围
| 小节 | 内容 | 复盘点 |
|---|---|---|
| 19.7 - 19.9 | MASM 基础 | 保留字、标识符、伪指令、操作数格式 |
| 20.0 - 20.9 | 数据定义 | DB/DW/DD、EQU、地址计数器、OFFSET、ALIGN |
| 21.0 - 21.8 | 过程与参数 | TYPE/LENGTHOF/SIZE、PROTO、INVOKE、ADDR、USES、LOCAL |
| 21.9 - 22.7 | 条件和循环 | .IF、.WHILE、.REPEAT、JCC |
| 22.8 - 23.3 | STRUCT/UNION/MACRO/API | 结构体、联合体、宏和 Win32 API 调用 |
2、标识符与伪指令
MASM 里伪指令不是 CPU 执行的机器指令,而是给汇编器看的说明。
| 类型 | 例子 | 作用 |
|---|---|---|
| 标识符 | main, buffer |
给地址或数据起名 |
| 助记符 | mov, add |
CPU 指令 |
| 伪指令 | .data, .code |
指导汇编器组织程序 |
| 宏 | MACRO |
文本/代码展开 |
3、数据定义
1 | .data |
| 伪指令 | 大小 |
|---|---|
db |
1 字节 |
dw |
2 字节 |
dd |
4 字节 |
dq |
8 字节 |
4、EQU 与等号
EQU 和等号都可以定义常量或替换符号。复盘重点是:它们不是运行时变量,不会在内存里自动分配可修改空间。
5、当前地址计数器与长度
$ 常用于表示当前位置,可以配合标签计算数据长度。
1 | buffer db 1,2,3,4 |
6、OFFSET、TYPE、LENGTHOF、SIZEOF
| 操作 | 含义 |
|---|---|
OFFSET name |
获取标签偏移地址 |
TYPE arr |
单个元素大小 |
LENGTHOF arr |
元素个数 |
SIZEOF arr |
总大小 |
7、过程、PROTO 与 INVOKE
PROTO 声明函数原型,INVOKE 帮助按约定传参调用。
1 | ExitProcess PROTO, dwExitCode:DWORD |
复盘时关注调用约定和参数顺序。
8、LOCAL 与 USES
| 语法 | 作用 |
|---|---|
LOCAL |
定义过程局部变量 |
USES |
自动保存/恢复指定寄存器 |
这能让汇编过程更接近高级语言函数结构。
9、条件和循环结构
MASM 提供高级伪指令:
1 | .IF eax == 0 |
它最终仍会展开成比较和跳转。学习时可以同时看源汇编和生成反汇编。
10、STRUCT、UNION、MACRO
结构体用于按字段组织数据,联合体用于多个字段共享同一段内存,宏用于复用代码模板。
| 机制 | 复盘重点 |
|---|---|
| STRUCT | 字段偏移和对齐 |
| UNION | 多种解释共享同一内存 |
| MACRO | 展开后体积和副作用 |
11、学习检查清单
| 检查项 | 状态 |
|---|---|
| 能区分 CPU 指令和 MASM 伪指令 | 待复盘 |
| 能用 DB/DW/DD 定义数据 | 待复盘 |
| 能使用 OFFSET、LENGTHOF、SIZEOF 理解数据地址和大小 | 待复盘 |
| 能理解 PROTO/INVOKE 与调用约定的关系 | 待复盘 |
| 能用 STRUCT 复盘结构体字段偏移 | 待复盘 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ruiqy~!









