二进制忍者 - 重构二进制忍者反编译器

主要观点:即将发布的 Binary Ninja 4.1 会推出新的反编译器控制流恢复实现,可通过切换到开发通道并更新到最新版本尝试。新实现旨在提高反编译器输出的可读性和可维护性,同时避免条件图解析中的复杂性爆炸问题,保留了条件图方法的优势并增加了传统方法的灵活性。

关键信息

  • Binary Ninja 4.0 及以下版本的控制流恢复:使用条件图解析算法,将任意控制流图转化为高级中间语言(HLIL),但面对编译器优化后的代码可能出现条件复杂度过高的问题。
  • 传统反编译方法:通过迭代应用规则将控制流图转化为可理解的代码,优势是灵活但需要维护大量规则。
  • 新控制流恢复算法:将条件图解析算法重新表达为控制流图的转换,可选择性地应用转换,包括&&||转换、条件复制、子区域解析、代码复制、跳转表转换、合并相邻代码节点和goto插入等,以达到每个节点最多一个入边的目标。
  • 测试套件:用 Rust 实现新的测试生成框架,测试各种控制流结构,以验证新算法的准确性,结果显示新算法在准确性上有大幅提升。
  • 当前状态和未来展望:新算法已实现但可能不是最优,会在 Binary Ninja 4.1 及后续版本中继续改进,欢迎反馈控制流相关问题。

重要细节

  • 新实现的反编译器在某些情况下输出可能不是最优,但可读性和可维护性有改善,如减少了嵌套深度和条件表达式的复杂性。
  • 条件图解析在处理编译器优化后的代码时可能出现问题,如产生大型复杂的条件,而新算法通过各种转换来解决这些问题。
  • 新算法具有灵活性,可添加更多转换原语,目前正在探索确定最佳转换的启发式方法。
  • 测试套件直接输出 Aarch64 机器码,以避免编译器优化,设计用于触发控制流恢复的稳健性问题。
  • 新算法在一些实际代码示例中能产生更自然的输出,如从 Cyber Apocalypse CTF 2022 和 32 位 Windows 应用程序的WinMain函数中得到的输出对比。
阅读 12
0 条评论