逆向工程 Java - 去混淆符号

逆向工程 拆卸 混淆 爪哇 去混淆 反编译
2021-06-26 20:18:54

我是 Java 新手,正在清理一个相当大的 Java .jar 样本,其中混淆器已将符号重命名为无效名称。例如:

import org.lib.00.0.2;

public final class 90
extends 2 {
    public 90() {
        90 iiIIiiiiiIiIi;
        90 v0 = iiIIiiiiiIiIi;
    ...
}

使用 Recaf 我正在重命名这些使用数字的符号,但这样做后 Recaf 无法找到重命名的类/包,并且随后的代码更改编译失败。

是否有任何工具可以自动将符号恢复为合法名称?如果没有,我如何以不会破坏包/类路径的方式重命名事物?

此外,我正在考虑是否应该使用反编译器,也许只是更改 ASM/指令。我对定期组装很满意,似乎这可能会避开一些混淆措施?

谢谢。

1个回答

我不确定专门针对您的第一个问题的工具,但至于您的第二个问题,是的,绝对可以!

反编译对于理解代码很有用,但是对于修改代码却很糟糕编译和反编译都是有损过程。此外,您可以在字节码中做很多没有 Java 等价物的事情,所以您不应该期望混淆的字节码甚至一开始就可以干净地反编译。

相比之下,反汇编和反汇编不会丢失任何信息,甚至可以干净地往返于混淆的字节码,至少如果您使用像Krakatau这样的好的反汇编程序因此,如果您习惯于使用字节码并且正在使用高度混淆的字节码,我强烈建议您使用 Krakatau。对于常规或适度混淆的字节码(最常见的情况),其他工具(例如 ASM)也可以使用,以防您想改用它。有一些 ASM 不能正确支持的字节码怪癖,但我不知道有任何利用它们的混淆器,所以这在实践中不太可能成为问题。

请注意,您正在使用的代码也可能使用自省来尝试检测篡改,因此请注意这一点。例如,我查看的一些旧版本的 Stringer 会自行加载并计算类文件中常量池条目的数量,因此修改可能会破坏它们。(如果您小心的话,Krakatau 可以避免添加或删除常量池条目,但最好的办法是分析代码以查找并删除篡改检查)