RULECOMPILE - 未记录的 Ghidra 反编译器规则语言

主要观点:作者因对不良反编译感到恼火而挖掘出 Ghidra 的一个隐藏功能,即可以使用自定义 DSL 创建自己的反编译传递。通过这个功能,作者为一种简单的混淆技术编写了去混淆规则。
关键信息:

  • 故事背景:遇到一个未被反混淆的函数,讨论了多种处理方式,如忽略、脚本修复、修补二进制代码、改进反编译器并提交请求等,最后发现可通过调试反编译器内部来寻找解决方案。
  • RULECOMPILE:在 Ghidra 反编译器的源文件中发现两个被功能标志屏蔽且默认未启用的命令,尝试启用该功能时遇到编译错误,经过修复后可运行,但仍不清楚如何使用。
  • 深入研究:通过阅读源代码和调试,了解到实验性规则文件的结构和语法,包括各种语句和操作的定义,以及如何使用它们来匹配和转换 AST。
  • 最终规则:编写了一个简单的去混淆规则,能够匹配并转换特定的混淆代码,使其恢复为简单的增量操作。
    重要细节:
  • 介绍了 Ghidra 反编译的过程,包括字节到 Pcode 的转换、优化等步骤,以及大多数步骤无法通过脚本影响。
  • 详细描述了在使能 RULECOMPILE 过程中遇到的编译错误及修复方法,包括创建和修改相关的 C++ 文件和 YACC 文件。
  • 展示了实验性规则文件的示例结构和语法,以及如何使用它们来匹配和转换代码。
  • 提供了最终的去混淆规则示例及其在 Ghidra 中的使用方法,包括命令和 XML 内容。
  • 最后对该功能的未来发展进行了思考,认为 Ghidra 开发者可能不会默认启用该功能,且现在可能更倾向于让插件通过 Java 或 Python 代码进行任意转换。
阅读 10
0 条评论