- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
一、引言
二、OFFSET 伪指令的技术本质
1. 编译时静态地址计算
2. 与 LEA 指令的对比
3. 典型应用场景
三、逆向工程核心知识点
1. 内存布局与 PE 文件结构
3. 硬编码地址的威胁与防护
一、引言
在 Windows 逆向工程与底层开发中,理解内存寻址机制是核心技能之一。MASM(Microsoft Macro Assembler)的 OFFSET
伪指令作为静态地址计算工具,直接影响代码生成与内存操作模式。
二、OFFSET
伪指令的技术本质
1. 编译时静态地址计算
- 功能定义:
OFFSET
在编译阶段直接解析变量或标签的 相对虚拟地址(RVA),生成硬编码的立即数。 - 语法形式:
MOV reg, OFFSET symbol
,其中symbol
可为变量名、数组名或代码标签。 - 机器码表现:直接替换为符号的偏移值(如
B8 00304000
对应MOV EAX, OFFSET var
,假设var
地址为0x403000
)。
2. 与 LEA
指令的对比
特性 | OFFSET * | LEA |
---|---|---|
计算阶段 | 编译时 | 运行时 |
地址生成方式 | 硬编码立即数 | 通过寻址模式动态计算 |
性能影响 | 无运行时开销 | 需占用 ALU 周期 |
灵活性 | 仅支持固定符号 | 支持复杂表达式(基址+变址) |
3. 典型应用场景
- 全局变量初始化:
MOV ESI, OFFSET globalBuffer
用于初始化指针。 - 函数跳转表构建:
JMP [OFFSET jumpTable + EAX*4]
。 - 结构体成员访问:
MOV EDX, OFFSET structInstance.member
。
三、逆向工程核心知识点
1. 内存布局与 PE 文件结构
- 数据段映射:
.data
段中的变量通过OFFSET
获取的地址为 ImageBase + RVA。; 假设 ImageBase=0x400000,var 的 RVA=0x3000 MOV EAX, OFFSET var ; EAX = 0x403000
- 重定位表影响:若程序启用 ASLR,需通过重定位表动态修正硬编码地址。
2. 数组与数据结构的逆向分析
-
数组访问模式识别:
MOV EAX, [arr + ECX*4 + 8] ; 等价于 arr[ECX+2]
逆向时需推断元素类型(
*4
表明 DWORD 类型)和索引逻辑。 -
结构体逆向技巧:
; 假设 struct { int a; char b[4]; } MOV EBX, [EDX + 0] ; 访问 a 成员 MOV CL, [EDX + 4] ; 访问 b[0]
3. 硬编码地址的威胁与防护
- 漏洞利用:攻击者可通过
OFFSET
地址定位敏感数据(如函数指针)。 - 防护策略:
- ASLR:随机化模块基址,使硬编码地址失效。
场景 | MASM 语法 | 逆向特征 |
---|---|---|
全局变量地址加载 | MOV EAX, OFFSET var | 硬编码立即数(如 0x403000 ) |
数组首地址获取 | LEA EBX, arr | EBX = arr (动态计算) |
结构体成员偏移 | OFFSET struct.field | 固定偏移值(如 +0x8 ) |
函数指针调用 | CALL [OFFSET funcTable] | 间接调用(IAT 或 VTABLE 访问) |