【问题标题】:Modify a string in Java bytecode (jar)修改Java字节码(jar)中的字符串
【发布时间】:2010-12-14 14:28:37
【问题描述】:

我想修改在 Java 应用程序中硬编码的连接字符串(没有源的 jar)。

我认为可以反编译 jar,然后更改源并重新编译为新的 jar,但是有更快的方法吗?

编辑:

  • 这是一个独立的应用程序,而不是我从自己的代码中加载的 jar
  • 我怀疑它会被混淆:小众科学应用,作者擅离职守。
  • 需要在应用程序运行时修改“内存中”字符串的解决方案也足够了,但并不理想

【问题讨论】:

    标签: java jar reverse-engineering decompiling


    【解决方案1】:

    在使用该 jar 的应用程序中,您可以使用 reflection 来设置连接字符串。 (反射甚至可以与私有设置器一起使用)。

    显然,如果 setter 是公开的,您可以直接调用它而无需反射。

    【讨论】:

    • 我同意布鲁诺的观点,反思可能是解决这个问题的最佳方法。您需要知道 setter 方法或成员变量,但您必须知道。如果您正在反编译或编辑字节码,无论如何都需要知道这一点。
    • 它是一个独立的应用程序,所以程序化修改并不是我想要的
    • 请注意,修改字段的反射可能无法可靠地工作。例如。如果该字段是public static final String,它可能已被编译器作为常量内联。我不确定它是否会发生,但它可能......
    • JavaSpecialists 上有一篇关于此的兴趣帖子('Insane Strings'):javaspecialists.eu/archive/Issue014.html;另请参阅javaspecialists.eu/archive/Issue096.html('"final" 不再是最终的')。
    【解决方案2】:

    我认为反编译可能是最快的方法,前提是代码没有被混淆,以至于反编译/编译往返是不可能的。你将必须反编译代码以找到连接字符串,所以你已经完成了一半。

    更重要的是,您可以利用此方法将连接字符串拉出到属性文件中,因此(希望)只执行一次反编译!

    【讨论】:

    • 哪位 - 查找字符串或应用代码更改以从属性文件中读取?如果字符串很容易获得(即没有碎片化或混淆),那么我认为从属性文件中读取并不困难。
    • 我指的是反编译和重新编译。我记得一些混淆器使用“new”、“class”等受保护的名称作为方法和字段名称。
    • @Stroboskop - 有趣。没有意识到这一点。是的 - 以上取决于是否能够往返
    • 我认为这不是一个可行的解决方案......我们不应该这样想。反思是要走的路
    • @Suraj - 鉴于问题中的信息,为什么这不可行?
    【解决方案3】:

    由于 Jars 通常不会被压缩,因此地址在 Jar 中以纯文本形式显示的可能性很小。您可以尝试使用不怕二进制数据的编辑器(我使用 vim)编辑 Jar,只需搜索并更改文本,前提是旧地址和新地址使用相同数量的字符。这很原始但非常简单。

    如果它不起作用,您将需要其他方法之一。

    当然,您需要保留 jar 的备份副本,以防这种方法失败。

    【讨论】:

    • Jar 是否被压缩并不重要;它只是 ZIP 压缩,只需使用任何 ZIP 工具解压缩和重新压缩。
    【解决方案4】:

    由于 jar 文件只是具有一定结构的 ZIP 文件,因此您可以使用 zip 工具(WinZip 等)来提取类文件;然后使用十六进制编辑器修改类文件(如果新的连接字符串与旧的连接字符串具有相同的长度,应该不会太难);之后,将其压缩回 jar 文件中。

    当然,当上述所有其他可能性都不起作用时,这应该只是你最后的尝试。

    【讨论】:

      【解决方案5】:

      我假设你已经想到了这一点,但如果 .jar 文件中的编译方法看起来像这样,也许你可以简单地使用继承:

      公共字符串 getConnectionString(){...

      然后只需扩展类,重写方法以返回新字符串并改用您的类。显然,这只适用于超类不是最终的,方法不是最终的,并且它是公共的或受保护的(如果你可以使用相同的包名)。

      【讨论】:

        猜你喜欢
        • 2021-10-04
        • 1970-01-01
        • 2011-02-07
        • 1970-01-01
        • 2016-02-13
        • 2011-05-22
        • 2016-11-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多