如何反编译混淆的java程序以避免类/包名称冲突

2024-04-28

我想反编译一个java程序并重新编译派生的(混淆的)源代码。我解压了 .jar 存档并得到了如下目录结构:

com/
com/foo/A/
com/foo/A/A.class
com/foo/A/B.Class
com/foo/B/A.class
...
com/foo/A.class
com/foo/B.class
org/foo/Bar.class
...

问题是包和类之间存在名称冲突,导致反编译后的类文件无法重新编译。 反编译后的类将如下所示:

package org.foo;
import com.foo.A; // <-- name collision error

class Bar {
    ...
}

有没有办法解决这些命名问题,而不重命名类文件?

编辑: 这不是反编译器问题,而是如何拥有一个包含违反命名约定的类的工作 .jar 文件的问题。

编辑2: 好吧,我想在字节码级别上这样的命名是可能的,因此使用更智能的反编译器(自动重命名类并修复它们的引用)这个问题可以解决。


您真的需要解压整个 jar 并重新编译所有内容吗?不要自行重新编译整个反编译源,而是使用原始 jar 作为类路径,并仅提取并重新编译那些需要修改的类。然后,当您需要打包重新编译的代码时,只需复制原始 jar 并使用 jar -uf 替换修改后的类文件即可:

jar -uf ./lib/copy_of_original_jar_file.jar -C ./bin com/foo/A.class com/foo/B.class [...]

...并且 ./lib/copy_of_original_jar_file.jar 成为您的新库。

有一点是肯定的,那就是原始 jar 必须与 Java 类加载器一起正常工作才能使程序运行。它对于编译一次性 .class 文件应该同样有效。

通过使用原始 jar,您应该会遇到更少的命名冲突问题,因为您保持了与正在运行的应用程序使用的相同的类路径扫描顺序。不仅如此,Java 反编译器并不完美。通过从重新编译中消除大部分反编译代码,您可以避免反编译器遇到的大多数问题,例如异常处理程序重叠、混淆符号中的特殊字符、变量范围问题等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何反编译混淆的java程序以避免类/包名称冲突 的相关文章

随机推荐