迈向两全其美的二进制反汇编工具——Dr. Disassembler技术解析

本文介绍了Trail of Bits开发的Dr. Disassembler框架,这是一种基于Datalog的透明可变的二进制反汇编平台,通过关系型视图实现反汇编过程的可解释性和可交互性,支持启发式算法和追溯更新。

迈向两全其美的二进制反汇编工具

去年冬天,我有幸作为研究生实习生加入Trail of Bits,在Peter Goodman和Artem Dinaburg的指导下开发了Dr. Disassembler——一个基于Datalog的透明可变二进制反汇编框架。本文将介绍该工具的设计理念和关键技术实现。

二进制反汇编的挑战

二进制反汇编面临诸多难题:代码/数据区分、函数边界识别等任务本质上是不可判定的,需要精心设计的启发式算法。理想的反汇编工具应具备:(1)透明性——底层逻辑可解释;(2)可变性——支持即时交互和优化。然而现有工具往往只能满足其一。

技术基础:反汇编、Datalog与Dr. Lojekyll

反汇编是将机器码转换为汇编代码的过程。Dr. Disassembler采用Trail of Bits自研的增量式Datalog引擎Dr. Lojekyll,通过关系型数据库表示反汇编结果。例如,以下Datalog代码可识别潜在函数入口点:

1
2
3
4
plausible_function(FuncEA) :-
    direct_call_target(FuncEA);
    function_prologue(FuncEA);
    symbol_table_entry(FuncEA).

Dr. Disassembler架构设计

反汇编流程三阶段

  1. 解析:识别二进制文件中的代码段和元数据
  2. 解码:将字节流转换为指令语义
  3. 后处理:通过Datalog关系表进行启发式优化

关键技术方案

  • 控制流恢复:引入"非控制流后继指令"概念,统一线性扫描与递归下降策略
  • 增量更新:支持反汇编结果的追溯修改而无需重新反汇编
  • 查询接口:提供丰富的Datalog查询和导出功能

应用示例

函数指令分组查询

1
2
3
4
query function_instructions(FuncEA, InsnEA) :-
    function(FuncEA),
    instruction(InsnEA, _, _),
    reachable(FuncEA, InsnEA).

无效指令检测导出

1
2
3
4
export invalid_instruction_dominators(InsnEA) :-
    instruction(InsnEA, _, _),
    raw_transfer(InsnEA, BadEA),
    !instruction(BadEA, _, _).

未来方向

  1. 迁移到C++实现提升性能
  2. 开发可视化二进制分析界面
  3. 建立自动化工具差异分析平台

项目原型代码已开源:GitHub仓库

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计