【问题标题】:Decompile JAR, Modify it, Recompile again?反编译JAR,修改它,重新编译?
【发布时间】:2021-02-20 08:21:22
【问题描述】:

我有一个较旧的 Jar 文件,我必须对其进行修改才能使其正常工作。 我已经用 jd-gui 对其进行了反编译并更改了需要更改的部分。我现在想知道我必须做什么才能拿回一个罐子? 我想我必须添加库,但是没有额外的 lib 目录。

如何将所有内容放在一起?

@斯蒂芬·C “因此,当您进行更改并重新编译时,生成的“.class”文件可能会出现意外“ 这到底有多相关?我只想要 Jar 文件的功能,而不是它的 1:1 副本。

Jar 文件未签名。无论如何,签署 Jar 文件的确切原因是什么?如果我从另一个程序启动它?

【问题讨论】:

  • “这到底有多相关?” - 它与您相关,因为您不希望以意外/不需要的方式改变 JAR 的行为。在某些情况下,重新编译(例如使用不同的类路径)可能会大大改变类的行为。而且由于您正在编译反编译代码,因此还有一个额外的问题是反编译代码可能不是对原始代码的正确反编译。 (这实际上很常见......)
  • “究竟是什么原因要签署 Jar 文件?” - 它允许运行 JAR 的人检测 JAR 是否被篡改。跨度>
  • 注意:如果您在问题中添加@ping,则不会通知人们。它需要在评论中才能触发通知。如果您要求澄清答案,最好在答案上发表评论。 (无论如何,您不一定会得到答复......但这是另一个问题。请记住:这不是一个帮助台,人们可以付费回答您的问题。)

标签: java jar decompiling recompile


【解决方案1】:

如果您在反编译整个 jar 后缺少依赖项,这可能意味着 jar 没有包含它们。创建 jar 时,可以选择不包含依赖项,但这假定它们在运行时在类路径中可用。运行原始 jar 时检查是否与类路径上的其他 jar 文件有任何关系。有关如何实现此目的的详细信息,请参阅this answer。确定所有依赖项后,您可以轻松地从 IDE 编译 jar,例如 IntelliJ/Eclipsecommand line

附带说明,如果您想要对 jar 进行的更改很小或孤立,我建议您编辑字节码(对于小型编辑来说更容易)。我更喜欢this bytecode editor

如果对代码的某些部分进行反编译失败,则重新编译时将无法恢复 jar 的功能。在这种情况下,与其通过所有可用的反编译器并希望您可以反编译该代码,我建议您确定您正在尝试编辑的类集,修改其余的类,以便它们可以编译并且没有任何对您感兴趣的类的副作用(不要删除这些引用的任何内容)并编译 jar(即使这不是您想要的 jar)。然后,您可以 extract 仅从 jar 中修改您想要修改的类文件,并在原始 jar 中 overwrite 它们。这只有在您的更改没有任何副作用时才有效。

【讨论】:

  • 我意识到这是一个旧的响应,但我想知道,如果我只需要更改 persistence.xml 文件中的 IP 地址而无需其他任何东西,字节码编辑器是否也可以工作?我只是想用persistence.xml文件中的另一个IP取回相同的.jar文件,我不知道依赖关系和其他东西(这不是我的程序,我根本没有java知识)
  • @Dennis 我认为在这种情况下有一个更简单的解决方案,如果这个 persistence.xml 文件是 jar 的一部分。提取 jar 并验证其中是否存在 persistence.xml。如果是,则在记事本(或任何编辑器)中编辑它,然后在 jar 中覆盖它。请参阅我的帖子中的提取/覆盖部分。
【解决方案2】:

如果您询问如何创建 JAR:

  • 您可以使用 Maven、Gradle、Ant 等构建工具来完成。
  • 您可以使用 Java IDE 完成此操作
  • 您可以使用命令行jar工具来完成;请参阅 Oracle Java 官方教程中的 How to create a JAR file

但不能保证您所做的事情会真正奏效。这里有几个问题。

  • 如果原始 JAR 文件已签名,您将无法重新签署新 JAR ...除非您拥有签名时使用的私钥。

  • 反编译通常是不准确的。不能保证它生成的 Java 代码是原始类的正确表示。因此,当您进行更改并重新编译时,生成的“.class”文件可能与原始文件相比存在意外/不需要的差异。


我想我必须添加库,但是没有额外的lib目录。

我不确定你的意思。 JAR 的(新)依赖项不一定需要在 JAR 本身中。这取决于它是哪种 JAR;例如它是您使用java -jar my.jar ... 启动的所谓“可执行”JAR。

【讨论】:

    【解决方案3】:

    例如为 gradle 或 maven 使用 jar 插件,或者使用 intelliJ 构建它,这是另一个帖子中的答案:How to build jars from IntelliJ properly?

    【讨论】:

    • 请不要只使用链接回答。请提供一些带有上下文的示例。以后链接可能失效了,你的回答就没用了
    猜你喜欢
    • 2012-09-04
    • 2011-09-30
    • 1970-01-01
    • 2017-12-05
    • 2012-03-23
    • 1970-01-01
    • 2014-12-05
    • 2020-08-22
    • 1970-01-01
    相关资源
    最近更新 更多