【问题标题】:Decompiling Java Code反编译 Java 代码
【发布时间】:2018-01-04 19:05:16
【问题描述】:

我想知道反编译 Java 代码是什么意思。这是否意味着将本机代码翻译回字节码,然后再翻译为源代码?我还想知道在编译 java 程序时 RAM 扮演什么角色。反编译工具能获取内存中的原生代码吗?

【问题讨论】:

  • Java 编译器 ("javac") 不会将 Java 源代码编译为二进制代码,而是编译为字节码。字节码是一种中介表示(.class-files)。编译过程确实需要一些内存,但不要太多。反编译是从字节码到java源代码的反向转换。根据 java 代码的编译方式,反编译或多或少是精确的(例如,变量名可以被混淆)。但是,有些信息会永久丢失。例如,字节码没有booleancharbyteshort 的类型。它们都表示为int
  • 如果你想对一些代码进行逆向工程,你应该阅读大量书籍。祝你好运。
  • @Turing85 所有字段、参数和返回类型的原始类型都被记录下来,如果可以的话,反编译必须推断出的只是局部变量(除非它是 long.float 或 double)

标签: java compilation decompiling


【解决方案1】:

是不是说原生代码先翻译回字节码再翻译成源代码?

通常,反编译意味着将字节码转换回Java代码。

JVM 确实将本机代码优化回字节码,以避免在内存中保留两个代码副本。但是 JVM 永远不会将其转回源代码。

我也想知道在编译 java 程序时 RAM 扮演什么角色。

Java 编译器像任何其他 Java 程序一样使用 RAM。在使用 RAM 进行编译时,没有什么特别的事情发生。

反编译工具会在 RAM 中获取本机代码吗?

没有。从字节码反编译更简单、更快、更容易。

【讨论】:

    【解决方案2】:

    FWIW - 我和一个朋友几年前在 ACCU 上发表了一篇文章,描述了如何开始研究这类东西 - 你可能会发现它提供了丰富的信息。

    https://accu.org/index.php/journals/1850

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      相关资源
      最近更新 更多