寻找一种为反编译器定义规则的好方法,需要建议

Riz*_*Riz 6 decompiling mips opcode disassembly control-flow

我正在为MIPS架构开发一个非常简单的反编译器,随着我的进步,我必须为代码分析定义许多规则,例如"如果这个操作码是lui而下一个操作码是addiu然后返回var = value "或"如果这个操作码是bne,它指的是当前的地址 - 创建循环解析树中的定义".问题 - 有很多这样的规则,我找不到定义它们的好方法.我尝试为每个规则编写分离的函数,定义好的OOP基础逻辑类并扩展它们来创建规则,甚至尝试了令人沮丧的代码的正则表达式(令我惊讶的是这比预期更好)但无论我尝试过什么,我的代码很快变得很大,难以阅读,无论我试图记录和结构如何它.

这让我得出结论,我试图通过使用错误的工具来解决这个任务(更不用说对于这样复杂的任务来说太愚蠢:)),但我不知道应该尝试什么.目前我有两个未经考虑的想法,一个是使用某种DSL(我完全没有这方面的经验,所以我可能完全错了),另一个是编写某种类似二进制regexp的工具用于操作码匹配.

我希望有人可以指出我正确的方向,谢谢.

Mat*_*ery 2

我猜你的一些规则太低级了,这就是为什么它们变得难以管理。

lui将后跟识别addiu为 32 位常量负载当然看起来非常合理;但是尝试从单个操作码级别的分支指令派生控制流似乎更可疑 - 我认为您希望在那里使用基本块。

Cifuentes 的反向编译技术是我所见过的反编译讨论中不断出现的参考资料;从相当简短的浏览来看,似乎非常值得花一些时间详细阅读您的项目。

一些特定于 x86 的内容是不相关的 - 特别是,将 x86 转换为低级中间表示的步骤对于 MIPS 可能不是必需的(MIPS 本质上只是每个操作码的一个基本操作) - 但除此之外还有很多内容看起来应该非常有用。