逆向工程 - 第1部分(基本编程概念)
字数 1411 2025-08-18 11:36:57

逆向工程基础编程概念教学文档

1. 变量初始化

在逆向工程中,理解变量初始化是基础。以下是常见变量类型及其汇编表示:

变量类型

  • 字符串(string):非原始类型但很重要
  • 整型(int):基本整数类型
  • 布尔型(Boolean):真/假值
  • 字符型(char):单个字符
  • 双精度(double):双精度浮点数
  • 单精度(float):单精度浮点数
  • 字符数组(char array):字符序列

汇编表示

  1. 空间分配:在初始化前先为变量分配空间
  2. 值移动:将值移动到分配的空间中
  3. 字符串特殊处理:需要调用内置函数进行初始化

2. 基本输出

使用printf而非cout进行输出的汇编分析:

字符串文字输出

  • 字符串文字被压入堆栈
  • 作为printf函数的参数被调用

变量输出

  1. 变量(如intvar)移入EAX寄存器
  2. 与格式字符串(如"%i")一起压入堆栈
  3. 作为printf参数被调用

3. 数学运算

常见数学运算及其汇编指令:

运算类型 汇编指令 示例说明
加法 add 直接相加
减法 sub 直接相减
乘法 imul 整数乘法
除法 idiv 配合cdq扩展EAX
按位与 AND 位与操作
按位或 OR 位或操作
按位异或 XOR 位异或操作
按位非 NOT 位非操作
右移 sar 算术右移
左移 shl 逻辑左移

4. 函数调用

三种函数类型及其汇编表现:

1. 基本空函数

  • 输出字符串后返回
  • 使用retn返回调用位置

2. 返回整数的函数

  1. 为变量分配空间
  2. 调用rand(),返回值存入EAX
  3. 将EAX移入变量空间
  4. 最后将变量移回EAX作为返回值

3. 带参数的函数

  1. 参数放入寄存器
  2. 寄存器压入堆栈
  3. 调用函数
  4. 函数内部分配变量空间
  5. 变量作为printf参数压栈

5. 循环结构

For循环

  • 结构:比较变量与最大值
  • 分支
    • 未达最大值:执行循环体,变量递增,返回循环开始
    • 达到最大值:退出循环

While循环

  1. 初始化变量
  2. 比较条件(如与0xA比较)
  3. 不满足条件:生成新随机数,继续循环
  4. 满足条件:退出循环,输出信息

6. 条件语句

If语句

  • 结构:类似"If X Then Y Else Z"
  • 实现
    1. 比较变量与阈值(如0xF表示15)
    2. 满足条件:输出对应信息并返回
    3. 不满足:继续下一级比较

Switch语句

  • 特点:不遵循"If-Else"结构
  • 实现
    1. 设置临时变量等于条件变量
    2. 检查是否匹配任何case
    3. 匹配:跳转到对应case执行
    4. 默认:直接返回

7. 用户输入

使用cin的汇编分析:

  1. 初始化字符串变量
  2. 调用cin函数
    • 将变量内容移入EAX
    • EAX压栈作为cin参数
  3. 调用cin,输出移动到ECX
  4. ECX压栈用于printf

总结

本教学文档涵盖了逆向工程中的基础编程概念,包括变量初始化、基本输出、数学运算、函数调用、循环结构和条件语句等核心内容。通过分析C++代码与汇编代码的对应关系,帮助逆向工程初学者建立基本概念框架。下一部分将探讨高级编程概念。

逆向工程基础编程概念教学文档 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++代码与汇编代码的对应关系,帮助逆向工程初学者建立基本概念框架。下一部分将探讨高级编程概念。