Trail of Bits的反编译技术栈
Trail of Bits正在开发多个与程序反编译相关的开源项目:Remill、Anvill、Rellic以及新推出的Magnifier。其技术策略是通过多级中间表示(IR)逐步提升编译程序:
- Remill:将机器指令转换为LLVM IR
- Anvill:把机器码函数转化为LLVM函数
- Rellic:通过Clang AST将LLVM IR转换为C代码
Magnifier创新性地实现了在任意管道阶段进行交互式转换,研究人员可以实时操作Anvill的LLVM IR并查看Rellic生成的C代码。
从REPL起步的原型
Magnifier最初作为命令行REPL(读取-求值-输出循环)开发,支持以下核心转换操作:
- 使用LLVM优化函数
- 函数内联
- 带/不带常量折叠的值替换
- 函数指针去虚拟化
关键技术实现包括:
- 唯一标识系统:为所有函数、参数、基本块和IR指令分配不透明ID
- 指令溯源机制:通过"当前ID|源ID"的双重标识追踪转换过程
- 通用替换接口:允许用户监控、允许或拒绝每个替换步骤
可视化界面MagnifierUI
基于Vue.js前端和C++后端的MagnifierUI具有以下特性:
- 多会话WebSocket通信架构
- 并列显示LLVM IR与Rellic生成的C代码
- 支持指令级高亮关联
- 集成优化按钮调用LLVM全套优化
典型工作流示例:
- 上传二进制文件
- 在终端视图执行参数值替换
- 实时观察IR和C代码同步更新
- 通过内联按钮优化函数调用
LLVM优化的实战演示
通过"fibIter(100)“案例展示Magnifier的威力:
- 内联fibIter函数调用
- 执行LLVM优化
- 直接获得结果值3314859971(第100个斐波那契数)
该过程避免了动态调试的复杂性,展示了如何将含循环/条件语句的复杂函数简化为常量。
未来发展方向
项目规划包括:
- 扩展转换类型支持(最终实现完整补丁集)
- 集成Anvill直接解析二进制文件
- 增强可视化界面的交互功能
Magnifier通过创新的交互式反编译方法,正在重新定义逆向工程的研究范式。