[安全实战]逆向工程核心名词详解
逆向工程核心名词详解
一、调试与执行类
1. 断点(Breakpoint)
- 定义:在代码中设置标记,使程序执行到此处时暂停
- 类型:
- 普通断点:通过
INT3
指令实现 - 条件断点:满足特定条件时触发
- 内存断点:监控指定内存区域的读写操作
- 硬件断点:利用CPU调试寄存器(DR0-DR3)
- 普通断点:通过
2. 步进(Step Over/Into)
-
Step Over
- 逐行执行代码,跳过函数内部逻辑
- 示例:调试
printf()
时不进入C标准库源码
-
Step Into
- 进入被调用函数的内部实现
- 示例:分析自定义函数
CalculateDamage()
的算法
3. 调用栈(Call Stack)
- 定义:记录函数调用关系的动态数据结构
- 特征:
- 后进先出(LIFO)结构
- 每个栈帧包含参数、返回地址、局部变量
- 通过
EBP
寄存器访问当前栈帧
二、内存操作类
4. 游戏基址(Game Base Address)
- 核心概念:程序模块加载到内存的起始地址
- 技术难点:
- ASLR(地址空间随机化)导致基址动态变化
- 静态基址特征:
// Unity引擎常见基址 GameAssembly.dll + 0x00123456
5. 偏移(Offset)
-
定义:相对于基址的地址位移量
-
层级结构:
最终地址 = [[基址 + 偏移1] + 偏移2] + 偏移3
-
寻址类比:
类似GPS导航:从市中心(基址)出发,向东走500米(偏移1),再向北300米(偏移2)
6. 指针(Pointer)
- 本质:存储内存地址的特殊变量
- 多级指针:
int** ppValue = &pValue; // 二级指针
- 内存模型:
指针变量 → 地址A → 地址B → 目标数据
三、数据结构类
7. 栈(Stack)
- 操作特性:
PUSH
:压入数据,ESP减4(32位系统)POP
:弹出数据,ESP加4
- 函数调用原理:
; 典型调用过程 push 参数3 push 参数2 push 参数1 call 函数地址
8. 堆(Heap)
- 对比栈:
特性 栈 堆 管理方式 编译器自动分配释放 程序员手动管理 分配速度 快 慢 内存碎片 无 可能产生 典型应用 局部变量 动态内存分配
四、汇编核心类
9. 寄存器(Register)
-
通用寄存器:
寄存器 特殊用途 示例指令 EAX 函数返回值存储 mov eax, [ebp+8]
ECX 循环计数器 loop 标签
EDX I/O端口操作 out dx, eax
ESP 始终指向栈顶 push/pop
-
标志寄存器(EFLAGS):
标志位 触发条件 应用场景 ZF 运算结果为0 jz/jnz
跳转CF 无符号运算溢出 进位判断 OF 有符号运算溢出 溢出异常处理
10. 常见汇编指令
指令 | 功能说明 | 典型应用场景 |
---|---|---|
MOV | 数据传送 | mov eax, ebx |
LEA | 加载有效地址 | lea eax, [ebx+4] |
CMP | 比较操作数 | cmp eax, 10 |
JMP | 无条件跳转 | jmp 0x401000 |
CALL | 调用子程序 | call printf |
RET | 函数返回 | ret 4 |
五、逆向工具类
11. CheatEngine关键功能
-
地址扫描三阶段:
- 首次扫描:精确数值匹配
- 变化筛选:数值增加/减少过滤
- 指针扫描:建立地址关联链
-
内存修改技巧:
# 典型修改流程 if 找到目标地址:冻结数值 → 防止游戏重置锁定数值 → 持续保持特定值
12. 反汇编(Disassembly)
- 核心价值:将机器码转换为可读汇编代码
- 工具对比:
工具 特点 IDA Pro 支持多架构,交互式分析 Ghidra 开源逆向框架,NSA开发 OllyDbg 动态调试利器,适合Windows程序
六、扩展概念
13. Hook技术
- 定义:劫持程序执行流程的技术
- 类型:
- Inline Hook:修改函数入口指令
- IAT Hook:修改导入地址表
- SSDT Hook:内核级系统服务表劫持
14. 内存分页(Memory Paging)
- 关键机制:
- 4KB分页单位(x86架构)
- CR3寄存器控制页表基址
- 逆向意义:
// 虚拟地址转物理地址 物理地址 = 页目录[DIR]→页表[TABLE]→页内偏移[OFFSET]
附:逆向工程学习路径图
如果本教程帮助您解决了问题,请点赞❤️收藏⭐关注支持!欢迎在评论区留言交流技术细节!欲了解更深密码学知识,请订阅《密码学实战》专栏 → 密码学实战