迈向两全其美的二进制反汇编工具
去年冬天,我有幸作为研究生实习生加入Trail of Bits,在Peter Goodman和Artem Dinaburg的指导下开发了Dr. Disassembler——一个基于Datalog的透明可变二进制反汇编框架。本文将介绍该工具的设计理念和关键技术实现。
二进制反汇编的挑战
二进制反汇编面临诸多难题:代码/数据区分、函数边界识别等任务本质上是不可判定的,需要精心设计的启发式算法。理想的反汇编工具应具备:(1)透明性——底层逻辑可解释;(2)可变性——支持即时交互和优化。然而现有工具往往只能满足其一。
技术基础:反汇编、Datalog与Dr. Lojekyll
反汇编是将机器码转换为汇编代码的过程。Dr. Disassembler采用Trail of Bits自研的增量式Datalog引擎Dr. Lojekyll,通过关系型数据库表示反汇编结果。例如,以下Datalog代码可识别潜在函数入口点:
|
|
Dr. Disassembler架构设计
反汇编流程三阶段
- 解析:识别二进制文件中的代码段和元数据
- 解码:将字节流转换为指令语义
- 后处理:通过Datalog关系表进行启发式优化
关键技术方案
- 控制流恢复:引入"非控制流后继指令"概念,统一线性扫描与递归下降策略
- 增量更新:支持反汇编结果的追溯修改而无需重新反汇编
- 查询接口:提供丰富的Datalog查询和导出功能
应用示例
函数指令分组查询
|
|
无效指令检测导出
|
|
未来方向
- 迁移到C++实现提升性能
- 开发可视化二进制分析界面
- 建立自动化工具差异分析平台
项目原型代码已开源:GitHub仓库