【问题标题】:If all the bytecode which compiled from java sources can be decompiled to java sources?如果所有从java源编译的字节码都可以反编译成java源?
【发布时间】:2013-04-01 01:42:31
【问题描述】:

我看到一些java反编译器可以将字节码反编译成可读的java源,我想知道是否所有来自java(不是其他JVM语言)的字节码都可以再次反编译成java源?


更新

对不起,让我把问题说清楚一点。

只说JVM上正常的Java代码(没有Android,没有字节码增强,没有AOP,没有混淆),其实我希望字节码可以反编译。但是我不知道是否有某种形式的java代码编译成字节码,永远无法被反编译成可读的java源代码。

【问题讨论】:

  • 大部分 java 代码都是用本地语言编写的……所以你可以“c”方法声明而不是它的主体……另外,例如 android 会混淆源代码……即使你反编译它也会让你更难阅读。
  • 理论上,任何非混淆类都可以很好地反编译。在实践中,所有现有的反编译器对于特别奇怪和复杂的类都将失败。许多人也不能很好地处理窄基元的类型转换。

标签: java bytecode decompiler


【解决方案1】:

我想知道是否所有来自java(不是其他JVM语言)的字节码都可以再次反编译为java源?

答案是否定的。

不保证反编译器适用于所有 Java 字节码:

  • 一个好的混淆器会故意重新排列字节码,使常见的反编译器不会产生可读源代码......并且可能不会产生valid 源代码。

  • 许多反编译器在处理较新的 Java 结构时存在问题。

  • 许多反编译器都存在从“复杂”源代码编译的字节码的问题。

  • 即使他们生成可编译的代码,也不能保证代码是正确的。

底线是,反编译器的好坏取决于作者的智慧和勤奋。我从来没有听说过完美的。

【讨论】:

    【解决方案2】:

    Java 字节码可以反编译回 Java 源代码。反编译的源代码通常看起来不完全相同,但具有相同的功能。如果您担心有人可能会反编译您的源代码,您可以使用混淆器(如 ProGuard)来提供帮助。

    【讨论】:

    • ProGuard 并不是一个混淆器,尽管它总比没有好,而且最重要的是免费。但是 AFAIK,ProGuard 不做任何流混淆。它只是重命名所有内容并去除属性,这使得反编译的源代码更难理解,但实际上并没有停止反编译器。
    【解决方案3】:

    是的,这(通常)是可能的(为此存在多种工具)。 见:How do I "decompile" Java class files?

    但是,您可以尝试保护您的文件,请参阅:How to lock compiled Java classes to prevent decompilation?

    【讨论】:

      【解决方案4】:

      我有机会反编译java多个代码,并且总是使用可用的工具进行管理,认为字节码是由编译器生成的,这个过程只需要反向得到原始代码。我知道一种避免这种情况的方法。

      我用过这个工具。

      java.decompiler.free.fr

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-20
        • 2019-09-20
        相关资源
        最近更新 更多