1.5.1 核心概念术语 #
| 术语 | 英文 | 定义 |
| 二进制 | Binary | 编译后的可执行文件,包含机器码 |
| 反汇编 | Disassembly | 将机器码转换为汇编指令 |
| 控制流图 | Control Flow Graph (CFG) | 表示程序执行路径的有向图 |
| 基本块 | Basic Block | 顺序执行的指令序列,只有一个入口和一个出口 |
| 调用图 | Call Graph | 函数调用关系的有向图 |
| 中间表示 | Intermediate Representation (IR) | 抽象的代码表示形式 |
| 符号执行 | Symbolic Execution | 使用符号值进行程序分析 |
1.5.2 分析技术术语 #
| 术语 | 定义 |
| 函数匹配 | 在两个二进制中识别对应函数的过程 |
| CFG同构 | 两个控制流图结构相同 |
| 语义等价 | 两个代码段功能相同,即使指令不同 |
| 代码相似度 | 衡量两段代码相似程度的数值 |
| 函数指纹 | 用于唯一标识函数的特征 |
| 哈希碰撞 | 不同内容产生相同哈希值 |
1.5.3 工具相关术语 #
| 术语 | 定义 |
| IDA Pro | 业界标准的反汇编工具 |
| Ghidra | NSA开源的逆向工程框架 |
| BinDiff | Zynamics开发的二进制diff工具 |
| Diaphora | 开源的IDA数据库比较工具 |
| Binary Ninja | 现代化的二进制分析平台 |
1.5.4 二进制Diff与源代码Diff的对比分析 #
信息层面对比 #
源代码信息 二进制信息
┌────────────────────────┐ ┌─────────────────────┐
│ /** │ │ 55 │
│ * 计算两个数的和 │ │ 89 E5 │
│ * @param a 第一个数 │ │ 8B 45 0C │
│ * @param b 第二个数 │ │ 03 45 08 │
│ * @return 和 │ │ 5D │
│ */ │ │ C3 │
│ int add(int a, int b) {│ │ │
│ return a + b; │ │ 完全丢失: │
│ } │ │ - 注释 │
└────────────────────────┘ │ - 变量名 │
│ - 类型信息 │
│ - 函数名 │
└─────────────────────┘
技术层面对比 #
| 维度 | 源代码Diff | 二进制Diff |
| 粒度 | 字符、行、语句、函数 | 字节、指令、基本块、函数 |
| 结构 | AST、CFG | CFG、调用图、数据流图 |
| 语义 | 类型系统、变量作用域 | 寄存器、内存访问模式 |
| 噪声 | 格式化、空白字符 | 编译器、优化级别、混淆 |
| 工具 | diff, git diff, merge工具 | BinDiff, Diaphora等 |
| 自动化程度 | 高(语法差异明显) | 低(需语义理解) |
应用场景对比 #
| 场景 | 源代码Diff | 二进制Diff |
| 开发协作 | ✅ 主要工具 | ❌ 不适用 |
| 代码审查 | ✅ 标准流程 | ❌ 不适用 |
| 补丁分析 | ⚠️ 需源码 | ✅ 主要方法 |
| 恶意软件分析 | ❌ 无源码 | ✅ 核心技术 |
| 漏洞挖掘 | ⚠️ 部分适用 | ✅ 主要方法 |
| 供应链安全 | ⚠️ 需源码 | ✅ 适用广泛 |
挑战对比 #
源代码Diff的挑战:
- 大规模代码库效率
- 语法等价但格式不同的代码
- 重命名重构
二进制Diff的挑战:
- 信息丢失严重
- 编译器差异巨大
- 代码混淆干扰
- 计算复杂度高