逆向工程 - 第1部分(基本编程概念)
字数 1411 2025-08-18 11:36:57
逆向工程基础编程概念教学文档
1. 变量初始化
在逆向工程中,理解变量初始化是基础。以下是常见变量类型及其汇编表示:
变量类型
- 字符串(string):非原始类型但很重要
- 整型(int):基本整数类型
- 布尔型(Boolean):真/假值
- 字符型(char):单个字符
- 双精度(double):双精度浮点数
- 单精度(float):单精度浮点数
- 字符数组(char array):字符序列
汇编表示
- 空间分配:在初始化前先为变量分配空间
- 值移动:将值移动到分配的空间中
- 字符串特殊处理:需要调用内置函数进行初始化
2. 基本输出
使用printf而非cout进行输出的汇编分析:
字符串文字输出
- 字符串文字被压入堆栈
- 作为
printf函数的参数被调用
变量输出
- 变量(如
intvar)移入EAX寄存器 - 与格式字符串(如
"%i")一起压入堆栈 - 作为
printf参数被调用
3. 数学运算
常见数学运算及其汇编指令:
| 运算类型 | 汇编指令 | 示例说明 |
|---|---|---|
| 加法 | add |
直接相加 |
| 减法 | sub |
直接相减 |
| 乘法 | imul |
整数乘法 |
| 除法 | idiv |
配合cdq扩展EAX |
| 按位与 | AND |
位与操作 |
| 按位或 | OR |
位或操作 |
| 按位异或 | XOR |
位异或操作 |
| 按位非 | NOT |
位非操作 |
| 右移 | sar |
算术右移 |
| 左移 | shl |
逻辑左移 |
4. 函数调用
三种函数类型及其汇编表现:
1. 基本空函数
- 输出字符串后返回
- 使用
retn返回调用位置
2. 返回整数的函数
- 为变量分配空间
- 调用
rand(),返回值存入EAX - 将EAX移入变量空间
- 最后将变量移回EAX作为返回值
3. 带参数的函数
- 参数放入寄存器
- 寄存器压入堆栈
- 调用函数
- 函数内部分配变量空间
- 变量作为
printf参数压栈
5. 循环结构
For循环
- 结构:比较变量与最大值
- 分支:
- 未达最大值:执行循环体,变量递增,返回循环开始
- 达到最大值:退出循环
While循环
- 初始化变量
- 比较条件(如与0xA比较)
- 不满足条件:生成新随机数,继续循环
- 满足条件:退出循环,输出信息
6. 条件语句
If语句
- 结构:类似"If X Then Y Else Z"
- 实现:
- 比较变量与阈值(如0xF表示15)
- 满足条件:输出对应信息并返回
- 不满足:继续下一级比较
Switch语句
- 特点:不遵循"If-Else"结构
- 实现:
- 设置临时变量等于条件变量
- 检查是否匹配任何case
- 匹配:跳转到对应case执行
- 默认:直接返回
7. 用户输入
使用cin的汇编分析:
- 初始化字符串变量
- 调用
cin函数- 将变量内容移入EAX
- EAX压栈作为
cin参数
- 调用
cin,输出移动到ECX - ECX压栈用于
printf
总结
本教学文档涵盖了逆向工程中的基础编程概念,包括变量初始化、基本输出、数学运算、函数调用、循环结构和条件语句等核心内容。通过分析C++代码与汇编代码的对应关系,帮助逆向工程初学者建立基本概念框架。下一部分将探讨高级编程概念。