修改后的Java字节码,运行时没有区别

逆向工程 爪哇 字节码
2021-06-24 11:22:52

我修改了第三方 Java 桌面应用程序.class文件的字节码(并重新打包了.jar),结果发现在运行时,我的更改没有任何区别,除非我的更改以某种方式导致崩溃。我所做的最简单的实验是使用十六进制编辑器并简单地替换.class文件中文本字符串中的一个字母运行时(当然是重启Java应用后),文字还是原来的文字。

这是原始字节码的示例:

ldc "Some text."

使用十六进制编辑器,我更改了字符串,然后在字节码编辑器中再次查看:

ldc "Xome text."

反编译的代码还显示了修改后的字符串。文件中不再有对原始字符串的引用.class尽管有这种变化,运行时显示的文本是“ Some text. ”而不是“ Xome text. ”。

有什么我需要考虑的吗,例如某种必须清除的缓存(在应用程序范围之外)?我试图删除Java 控制台中的“临时 Internet 文件”,但无济于事。

感谢您提供的任何帮助!:)

删除:我正在试验的实际应用程序的反编译代码和修改文件,由于它们的问题性质(无论如何都没有真正帮助任何人)。

1个回答

首先,我要提一下,class与其使用通用的十六进制编辑器,不如使用专用的编辑器。他们有很多。

您尝试编辑该class文件,但令您惊讶的是,您所做的更改并未反映出来。在这一点上,您应该非常确定必须有一些其他技巧,例如动态生成字符串、加密、混淆等。class文件也可以从其他一些位置加载,例如cache您不期望的位置。

获取有关加载了哪些类的信息的一种方法是在启动 java 时使用以下命令行开关。

java -verbose:class -jar <Your jar file>

这样,jvm当类加载时以及从哪个位置加载时,它会通知您。使用它,您可以知道是否存在某种隐藏的 cache加载class文件。

此选项失败后,即当您确定没有这样的 hidden 时cache,您几乎可以确定有encryption涉及或字符串是动态生成的。Decompiling会有所帮助,但当然,如果没有阻碍反编译的混淆。如果一切都失败了,你可以尝试检查bytecode的的class文件作为最后的手段。