我修改了第三方Java桌面应用程序.class文件的字节码(并重新包装了.jar),只是看到在运行时,我的更改没有任何改变,除非我的更改导致崩溃。我做过的最简单的实验是使用十六进制编辑器,然后简单地替换.class文件中文本字符串中的字母。运行时(当然,在重新启动Java应用程序之后),该文本仍然是原始文本。

以下是原始字节码的示例:

ldc "Some text."


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

ldc "Xome text."


反编译的代码还显示了修改后的字符串。 .class文件中没有对原始字符串的更多引用。尽管有此更改,运行时显示的文本仍为“某些文本”。而不是“ Xome文本”。

是否需要考虑任何其他因素,例如必须清除某种缓存(超出应用程序范围)?我试图删除Java控制台中的“ Internet临时文件”,但无济于事。

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

已删除:由于它们的可疑性质(我并没有真正帮助任何人),我正在尝试的真实应用程序的反编译代码和修改文件。

评论

我不知道你的问题吗?!?您能说得更清楚些吗?

您确定更改了该静态字符串的所有实例吗?并且确定在运行时看到的字符串不是动态生成的吗? (最好是对类进行反编译并找出答案。)

该文本可能是由其他一些.class文件创建的。检查jar中有多少个.class文件。

可以在修改前后张贴jar吗?

如果它是真实世界的应用程序,则必须提供某种保护,某种混淆,加密等。因此,我的猜测是字符串是加密的,只有在运行时才能解密。因此,您可能永远不会在静态.class文件中看到该字符串。您正在编辑的内容可能还有其他内容。

#1 楼

首先,我要提到的是,与其使用通用的十六进制编辑器,不如使用专用的class编辑器会更好。有很多。

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

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

java -verbose:class -jar <Your jar file>
会在加载类以及从何处加载类时通知您。使用此方法,您可以知道是否存在某种隐藏的jvm从中加载cache文件。

此选项失败后,即当您确定没有这样的隐藏class时,您几乎可以确保涉及到cache或字符串是动态生成的。 encryption会有所帮助,但是当然如果没有混淆会妨碍反编译。如果其他所有操作均失败,则可以尝试检查Decompiling文件中的bytecode,作为最后的选择。

评论


非常感谢您提供此答案,并提供了更多信息! :)

– Dimm
2014年7月5日,11:57