是否有任何 Java 反编译器足够准确,如果我重新编译结果,它应该与原始程序相同?

逆向工程 反编译 爪哇
2021-07-01 17:47:27

我正在尝试反编译 Minecraft,看看我是否可以分析代码以进行一些小的更改,但我需要一个足够好的反编译器,以便我可以以一种可行的方式重新编译它。我已经在网上尝试了多个反编译器,比如 javadecompilers.com。但是,由于各种原因,它们不能很好地工作,例如它们要么抛出错误,要么代码看起来不像原始代码,例如所有变量名称都替换为雪人表情符号或 \u+5 数字,例如,\u26032. 至于雪人表情符号,java编译器将无法区分不同的变量并导致名称冲突。而对于\u 数字,编译器可能会抱怨程序中的\ 或其他东西。是否有任何易于使用的编译器在 Linux 上工作,并且尽可能准确,准确到可以直接重新编译反编译代码而无需修复数千个反编译缺陷?

1个回答

Krakatau可能是最有可能生成行为与原始代码等效的代码的反编译器(除非代码使用 Java 8 lambdas,Krakaau 不支持)。但是,通常不可能进行往返反编译,因为编译和反编译都是有损过程。如果代码像 Minecraft 一样被混淆,如果反编译的结果甚至可以理解,你就很幸运了,更不用说可编译了。

如果要编辑混淆代码,则需要了解 Java 字节码的工作原理并在字节码级别对其进行编辑。幸运的是,除了反编译器之外,Krakatau 还提供了一个字节码汇编器和反汇编器,可以轻松编辑 Java 字节码,即使它已被混淆。

PS 没有工具可以恢复原始变量或方法名称,因为它们根本不存在于编译代码中。如果您看到奇怪的标识符,则意味着代码被一种工具混淆了,该工具去除了原始名称并用无意义的名称替换它们,这不会影响执行但显然会减慢逆向工程的速度。