【问题标题】:Java decompiler and editor for quick modifications [closed]用于快速修改的 Java 反编译器和编辑器 [关闭]
【发布时间】:2014-07-11 17:11:36
【问题描述】:

我正在尝试找到一个类似于 swf-decompiler 的 Java 反编译器,它允许编辑和重新编译源代码,而无需将其导出到任何地方,也无需执行任何外部操作。我想要的是非常快速地对 .jars 应用小的更改并保存它们,而无需花费额外的时间使用其他工具手动重新编译 java 代码,是否有这样的反编译器?有没有类似的东西(比如 .class 变量编辑器)以及是否有可能制作像 swf-decompiler 这样的 Java 反编译器?

【问题讨论】:

  • 你做过研究吗? duckduckgo.com/?q=java+decompiler+and+editor ... 而要求推荐工具的问题对于 stackoverflow 来说是题外话。
  • 在启用调试的 JVM 中热部署对原始源代码的更改有什么问题?
  • 您是否在问是否存在从 jar 中提取源文件、编辑源并重建 jar 的工具?这似乎很有可能,只要您拥有所有构建依赖项。
  • 当然是可能——但最初你要求工具的;不只是推荐那是 OT,finding 也是如此。这只是字节操作。从表面上看,有“大量的 .jars 供审查和编辑”似乎真的非常奇怪。也许您可以更具体地说明您要做什么。
  • @Victor2748 如果您足够聪明地破解 Java 游戏,那么您应该足够聪明地从现有组件(这些组件都在那里)中开发出这样的工具。

标签: java decompiler code-editor swf-decompiler


【解决方案1】:

推荐一个工具是题外话,但至于是否可能的问题,答案是肯定的和否定的。

Java 对反编译器比较友好,所以对于简单的情况,应该可以创建这样的工具。然而,有一些特性或模式往往会绊倒当前的反编译器,并且考虑到语言的复杂性,不可能有能够可靠地往返任意 Java 的反编译器。

此外,虽然编译 Java 丢失的信息比 C 少得多,但它确实丢失了信息。显然,你会丢失诸如 cmets 和空格之类的东西,但在默认设置下,你会丢失更多:局部变量名称、标志和类型、泛型类型、编译时注释等。这些信息大部分都保存到在一定程度上出于反射目的,将-g 标志传递给编译器可以强制它保存更多信息,但您无法全部取回。

因此,简而言之,您可以在大部分时间完成合理的工作,但您不可能始终完美地完成。

还要注意,这是针对自己编译的普通Java。如果类文件最初不是用 Java 编写的,或者它们完全被混淆了,你可以忘记重新编译。即使反编译器产生可读的输出,输出也不太可能是可重新编译的。

如果你想修改任意jar,你需要的是反汇编器和汇编器。我所知道的最好的是Krakatau(披露:我写的)。这样做的好处是它适用于任何类文件,即使它们被混淆了。但是,它根本不是用户友好的。如果您不知道如何处理类文件格式和字节码,那么您将只能进行微不足道的更改(例如更改常量字符串)。

【讨论】:

  • 据我了解,可以用 Java 字节码表达无法用 Java 语言轻松表达的功能。有关这方面的一些见解,请参阅 sable.mcgill.ca/publications/papers/2002-2/…
  • @ThorbjørnRavnAndersen 我很清楚这一点。
  • 此外,如果 Krakatau 可以生成具有正确行号的半可读源代码(来自类中的调试信息),那么如果您制作一个 Eclipse 插件替换默认类演示文稿,那么您将获得胜利。
  • @ThorbjørnRavnAndersen Krakatau 反编译器是为逆向工程设计的,所以它完全忽略调试信息(因为它通常不会出现)。由于我上面提到的原因,源代码通常无法重新编译。无论如何,我这里说的是汇编器和反汇编器,而不是反编译器。
猜你喜欢
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多