数据库逆向工程(二)
字数 2097 2025-08-18 11:35:36

数据库逆向工程高级教程

1. 数据库逆向工程基础概念

1.1 数据库定义

数据库是一组二进制文件,用于存放结构化数据和相互之间的交叉引用。关键特征:

  • 文件中的数据是结构化的
  • 文件由具有相同格式的记录组成
  • 通常包含多个表,不同表存放不同格式的记录

1.2 逆向工程目标

  • 理解记录格式和文件格式
  • 发现不同文件/表之间的交叉引用关系
  • 重建数据库的完整架构

2. 文件格式逆向分析方法

2.1 确定表的数量

技术要点:

  • 观察不同格式的相邻记录
  • 寻找明显不同的数据模式
  • 对于高熵二进制文件,通过字节模式的消失/出现来识别表切换

示例:

grpinc.dat文件包含2个表:
- 表1:4个彩色记录,每个记录大小0x3A字节
- 表2:纯文本记录,可能为单个大记录

2.2 确定记录大小

关键技术:

  1. 寻找重复出现的信息模式
  2. 计算两个相邻模式之间的间距
  3. 验证多个记录以确保一致性

示例分析:

catalogue文件记录大小确定:
- 第一个车辆名称偏移:0x0
- 第二个车辆名称偏移:0x800
- 记录大小=0x800-0x0=0x800字节

2.3 记录字段分析

步骤:

  1. 将记录划分为多个字段
  2. 根据数据类型(字符串、数字等)识别字段边界
  3. 通过跨记录比较验证假设

字段类型识别技巧:

  • 字符串:可打印字符序列,可能有固定长度
  • 数字:二进制表示的整数值
  • 数组:相同类型元素的重复模式

2.4 使用Kaitai Struct描述格式

Kaitai Struct是一种用于描述二进制文件格式的声明性语言,可生成多种语言的解析代码。

示例格式描述:

meta:
  id: catalogue
  file-extension: dat
  endian: le
  encoding: ascii
seq:
  - id: vehicle
    type: vehicle
    size: 0x800
    repeat: eos
types:
  vehicle:
    seq:
      - id: vehicle_name_1
        type: str
        size: 0x64
      - id: vehicle_id
        type: u2le
      # 更多字段定义...

3. 交叉引用研究方法

3.1 两种基本方法

  1. 从已知到未知

    • 获取已知字段值(如vehicle_id)
    • 在其他文件中搜索这些值
    • 发现关联文件
  2. 从关键字到信息

    • 搜索特定关键字
    • 找到包含关键字的文件
    • 逆向分析这些文件并发现与已知文件的关联

3.2 文件访问监控技术

使用Process Monitor(ProcMon)监控程序的文件访问行为:

  1. 设置过滤器:

    • 进程名称(如ntvdm.exe)
    • 操作类型(如ReadFile)
  2. 关键监控数据:

    • 访问的文件列表
    • 读取操作的块偏移量
    • 读取的块大小
    • 块的读取顺序
  3. 分析技巧:

    • 块偏移和大小可揭示记录结构和表边界
    • 读取顺序可揭示程序算法(如二进制搜索)

3.3 实际应用示例

研究车辆到零件的关系路径:

  1. 车辆 → 第一级部件树
  2. 第一级部件树 → 第二级部件树
  3. 第二级部件树 → 零件列表

通过监控发现的关键文件:

  • MCData.idx:绑定车辆ID与部件树级别
  • MCData.dat:包含零件列表
  • MCImage.dat/MCImage2.dat:零件图

4. 数据库逆向工程方法论

4.1 核心方法清单

基本方法

[2.1] 将使用DB的程序视为DBMS

初步分析

[2.2] 对待处理的数据和代码进行初步分析,搜索关键字获取更多信息
[2.3] 审查程序模块,查找可重用代码
[2.4] 代码重用的复杂性与黑盒子数量成正比,与执行动作数量成反比

研究入口点

[2.5] 选择离初始入口点近的数据库入口点
[2.6] 考察代表数据库入口点的文件
[2.7] 研究并描述入口点文件格式

研究交叉引用

[2.8] 监控程序加载感兴趣数据时的文件访问
[2.9] 利用监控获得的块偏移、大小和顺序研究文件

4.2 实用技巧总结

  1. 模式识别:寻找重复的数据模式来确定记录结构和大小
  2. 假设验证:对字段边界和类型的假设需要在多个记录中验证
  3. 工具使用
    • 十六进制编辑器查看原始数据
    • Kaitai Struct描述和可视化文件格式
    • ProcMon监控文件访问模式
  4. 渐进分析:从简单明显的结构开始,逐步深入复杂部分
  5. 文档记录:及时记录发现和假设,便于回溯和验证

5. 高级主题与挑战

5.1 复杂情况处理

  • 高熵数据:当字节模式不明显时,需要更精细的分析技术
  • 加密数据:识别加密算法和密钥是首要任务
  • 压缩数据:需要识别压缩算法并解压后分析

5.2 性能考量

  • 大文件处理:需要分段分析,避免一次性加载
  • 高效搜索:建立索引或使用专用工具加速模式搜索

5.3 架构重建

最终目标是将逆向工程结果转化为数据库架构图,包括:

  • 所有相关文件及其用途
  • 文件内部的表结构
  • 表之间的关系和交叉引用

6. 参考资料与工具推荐

6.1 推荐阅读

  • DGTEFF - XentaxWiki
  • "How to crack a Binary File Format"
  • "BFF: A grammar for Binary File Formats"
  • "File format reverse engineering, an introduction"
  • "Reverse Engineering/File Formats" (Wikibooks)
  • "Reverse engineering visual novels 101"系列文章

6.2 实用工具

  • Kaitai Struct:文件格式描述语言和可视化工具
  • ksv:Kaitai Struct可视化工具
  • Process Monitor:监控文件、注册表等系统活动
  • 十六进制编辑器:如HxD、010 Editor等
  • 自定义工具:根据需要编写脚本处理特定格式

通过系统应用这些方法和工具,可以有效逆向工程各种专有数据库格式,理解其内部结构和关系。

数据库逆向工程高级教程 1. 数据库逆向工程基础概念 1.1 数据库定义 数据库是一组二进制文件,用于存放结构化数据和相互之间的交叉引用。关键特征: 文件中的数据是结构化的 文件由具有相同格式的记录组成 通常包含多个表,不同表存放不同格式的记录 1.2 逆向工程目标 理解记录格式和文件格式 发现不同文件/表之间的交叉引用关系 重建数据库的完整架构 2. 文件格式逆向分析方法 2.1 确定表的数量 技术要点: 观察不同格式的相邻记录 寻找明显不同的数据模式 对于高熵二进制文件,通过字节模式的消失/出现来识别表切换 示例: 2.2 确定记录大小 关键技术: 寻找重复出现的信息模式 计算两个相邻模式之间的间距 验证多个记录以确保一致性 示例分析: 2.3 记录字段分析 步骤: 将记录划分为多个字段 根据数据类型(字符串、数字等)识别字段边界 通过跨记录比较验证假设 字段类型识别技巧: 字符串:可打印字符序列,可能有固定长度 数字:二进制表示的整数值 数组:相同类型元素的重复模式 2.4 使用Kaitai Struct描述格式 Kaitai Struct是一种用于描述二进制文件格式的声明性语言,可生成多种语言的解析代码。 示例格式描述: 3. 交叉引用研究方法 3.1 两种基本方法 从已知到未知 : 获取已知字段值(如vehicle_ id) 在其他文件中搜索这些值 发现关联文件 从关键字到信息 : 搜索特定关键字 找到包含关键字的文件 逆向分析这些文件并发现与已知文件的关联 3.2 文件访问监控技术 使用Process Monitor(ProcMon)监控程序的文件访问行为: 设置过滤器: 进程名称(如ntvdm.exe) 操作类型(如ReadFile) 关键监控数据: 访问的文件列表 读取操作的块偏移量 读取的块大小 块的读取顺序 分析技巧: 块偏移和大小可揭示记录结构和表边界 读取顺序可揭示程序算法(如二进制搜索) 3.3 实际应用示例 研究车辆到零件的关系路径: 车辆 → 第一级部件树 第一级部件树 → 第二级部件树 第二级部件树 → 零件列表 通过监控发现的关键文件: MCData.idx:绑定车辆ID与部件树级别 MCData.dat:包含零件列表 MCImage.dat/MCImage2.dat:零件图 4. 数据库逆向工程方法论 4.1 核心方法清单 基本方法 [ 2.1 ] 将使用DB的程序视为DBMS 初步分析 [ 2.2 ] 对待处理的数据和代码进行初步分析,搜索关键字获取更多信息 [ 2.3 ] 审查程序模块,查找可重用代码 [ 2.4 ] 代码重用的复杂性与黑盒子数量成正比,与执行动作数量成反比 研究入口点 [ 2.5 ] 选择离初始入口点近的数据库入口点 [ 2.6 ] 考察代表数据库入口点的文件 [ 2.7 ] 研究并描述入口点文件格式 研究交叉引用 [ 2.8 ] 监控程序加载感兴趣数据时的文件访问 [ 2.9 ] 利用监控获得的块偏移、大小和顺序研究文件 4.2 实用技巧总结 模式识别 :寻找重复的数据模式来确定记录结构和大小 假设验证 :对字段边界和类型的假设需要在多个记录中验证 工具使用 : 十六进制编辑器查看原始数据 Kaitai Struct描述和可视化文件格式 ProcMon监控文件访问模式 渐进分析 :从简单明显的结构开始,逐步深入复杂部分 文档记录 :及时记录发现和假设,便于回溯和验证 5. 高级主题与挑战 5.1 复杂情况处理 高熵数据 :当字节模式不明显时,需要更精细的分析技术 加密数据 :识别加密算法和密钥是首要任务 压缩数据 :需要识别压缩算法并解压后分析 5.2 性能考量 大文件处理:需要分段分析,避免一次性加载 高效搜索:建立索引或使用专用工具加速模式搜索 5.3 架构重建 最终目标是将逆向工程结果转化为数据库架构图,包括: 所有相关文件及其用途 文件内部的表结构 表之间的关系和交叉引用 6. 参考资料与工具推荐 6.1 推荐阅读 DGTEFF - XentaxWiki "How to crack a Binary File Format" "BFF: A grammar for Binary File Formats" "File format reverse engineering, an introduction" "Reverse Engineering/File Formats" (Wikibooks) "Reverse engineering visual novels 101"系列文章 6.2 实用工具 Kaitai Struct :文件格式描述语言和可视化工具 ksv :Kaitai Struct可视化工具 Process Monitor :监控文件、注册表等系统活动 十六进制编辑器 :如HxD、010 Editor等 自定义工具 :根据需要编写脚本处理特定格式 通过系统应用这些方法和工具,可以有效逆向工程各种专有数据库格式,理解其内部结构和关系。