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

如何反编译模糊的java程序以避免类/包名称冲突,java,decompiler,Java,Decompiler,我想反编译一个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; impor

我想反编译一个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 {
    ...
}
package org.foo;

导入com.foo.A;// 您不能在Java中导入包,那么为什么这会是名称冲突呢?您从编译器获得了哪条错误消息


如果混淆代码中存在名称冲突,代码将不会运行。因此,反编译的代码应该是无冲突的。

Java的导入机制提供了命名事物的简写方法,但当发生冲突时,显然不能使用它。您可以在代码中始终使用完全限定名,例如

package org.foo;  

class Bar { 
    private com.foo.Bar aDifferentBar;
    ...
}
编辑:


我想可能有一些类文件符合JVM规范,但不能由符合JLS规范的Java程序生成。如果是这样,那么您肯定需要一个更智能的反编译器。

您真的需要解压整个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反编译器也不是完美的。通过从重新编译中消除大部分反编译代码,可以避免反编译器遇到的大多数问题,如异常处理程序重叠、模糊符号中的特殊字符、变量作用域问题、,等等。

我不知道你在问什么,但你总是可以反编译模糊的代码,但是你不会得到可读的代码,为什么你要反编译代码?@duffymo:我总是反编译代码来窃取它。这是整个国家的商业模式,不应透露姓名。错误消息是“进口…无法解决”。com/foo/a.class中可能有一个名为“a”的公共内部类,因此导入com.foo.a.a可能意味着该内部类,或com/foo/a/a.class。这就是为什么这种命名在Java中是被禁止的,但不知怎么的,程序一定是被编译的……内部类不是问题的一部分。在类文件中,类是使用它们的路径加载的,因此内部类是A$A,包中的类是A/A。这些类在源文件中具有相同的符号是Java语言的一个问题。因此,如果反编译器应该生成可编译的代码,那么它要么必须解决命名冲突并重命名类,要么必须生成使用反射的代码,这将使代码非常不可读,这通常不是反编译的目的。我知道,但是如果com.foo.Bar模棱两可的话,这并不能解决问题。我不知道你的意思。只能有一个com.foo.Bar,对吗?是否有一些模糊的技巧会给你提供多个com.foo.Bar?如果包org.foo中有一个类“Bar”,那么通常就不会有包org.foo.Bar。但是,在我想反编译的jar中会发生这样的类/包名称冲突。只重新编译一些类正是我所想的,但是如果我反编译一个类a,这个类导入一个名称不明确的类B,然后我不能编译类A。我可以重命名类B,但我必须修复A和其他类中对B的所有引用。我不确定这个错误是否一定意味着存在歧义问题。您是否尝试导入另一个无歧义的模糊类?Dang。我希望我的轶事经历能胜过你的现实。我想这样不行。也许您可以尝试使用类似JDO(JavaDeobFousator)的东西。我发现这里提到了:这是我没有尝试过的少数除臭剂之一。。。它非常聪明,因为它重命名了具有名称冲突的类。不幸的是,仍然有许多错误,但这是一个很好的起点。谢谢:)