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

Mips 正在寻找一种定义反编译器规则的好方法,需要建议吗,mips,decompiling,disassembly,opcode,control-flow,Mips,Decompiling,Disassembly,Opcode,Control Flow,我正在为MIPS体系结构开发一个非常简单的反编译器,随着我的进步,我必须为代码分析定义许多规则,例如“如果此操作码是lui,下一个操作码是addiu,则返回var=value”或“如果此操作码是bne,并且它引用解析树中当前-创建循环定义之前的地址”。问题是,有很多这样的规则,我找不到一个好方法来定义它们。我曾尝试为每个规则编写单独的函数,定义好的OOP基本逻辑类并扩展它们以创建规则,甚至在disasmed代码上尝试正则表达式(令我惊讶的是,这比预期的效果更好),但无论我尝试了什么,我的代码很快

我正在为MIPS体系结构开发一个非常简单的反编译器,随着我的进步,我必须为代码分析定义许多规则,例如“如果此操作码是lui,下一个操作码是addiu,则返回var=value”或“如果此操作码是bne,并且它引用解析树中当前-创建循环定义之前的地址”。问题是,有很多这样的规则,我找不到一个好方法来定义它们。我曾尝试为每个规则编写单独的函数,定义好的OOP基本逻辑类并扩展它们以创建规则,甚至在disasmed代码上尝试正则表达式(令我惊讶的是,这比预期的效果更好),但无论我尝试了什么,我的代码很快变得庞大,难以阅读,无论我如何努力记录和组织它

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


我希望有人能给我指出正确的方向,谢谢。

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

lui
后跟
addiu
识别为32位恒定负载显然是非常合理的;但是,试图在单个操作码级别从分支指令派生控制流似乎更值得怀疑——我认为您希望在那里使用基本块

cifuntes’是一个在我所看到的反编译讨论中不断出现的参考文献;从一个相当简短的略读,它似乎是很值得花一些时间详细阅读您的项目


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

我不认为仅仅通过查看指令模式就可以编写反编译器。代码流和数据分析是正确构造代码块和表达式所必需的。AFAIK操作码模式观察是获得代码流的方法,就像在我的第二个示例中一样(您发现bne操作码在其自身之前引用地址=这是一个循环),但您是对的,这只是其中一个步骤,因为我需要计算这个循环的条件,这意味着我需要先查看代码,然后检查内存\寄存器修改。所以,这是两步分析——首先构建流树,然后计算其中的所有内容。二进制正则表达式方法听起来是个不错的主意。我唯一能想到的另一件事是将MIPS前端写入LLVM,并使用C后端获取代码(尽管我不知道生成的代码可读性如何,例如它可能使用
goto
s进行循环和回收变量等)Thx作为建议,我一定会尝试LLVM,但我担心它会在不了解MIPS的内部结构和确切硬件的情况下生成代码,而这些硬件有时有助于获取更多信息。我现在正在测试DSL方法,试图复制我在纸上反编译代码的方式。:)还有thx用于固定标签。哦,天哪,这是一个很好的论文来源,我无法表达我有多感激(请不要问我怎么会错过这个:)