.class
文件的字节码(并重新包装了.jar
),只是看到在运行时,我的更改没有任何改变,除非我的更改导致崩溃。我做过的最简单的实验是使用十六进制编辑器,然后简单地替换.class
文件中文本字符串中的字母。运行时(当然,在重新启动Java应用程序之后),该文本仍然是原始文本。以下是原始字节码的示例:
ldc "Some text."
使用十六进制编辑器,我更改了字符串,然后在字节码编辑器中再次查看:
ldc "Xome text."
反编译的代码还显示了修改后的字符串。
.class
文件中没有对原始字符串的更多引用。尽管有此更改,运行时显示的文本仍为“某些文本”。而不是“ Xome文本”。是否需要考虑任何其他因素,例如必须清除某种缓存(超出应用程序范围)?我试图删除Java控制台中的“ Internet临时文件”,但无济于事。
感谢您提供的任何帮助! :)
已删除:由于它们的可疑性质(我并没有真正帮助任何人),我正在尝试的真实应用程序的反编译代码和修改文件。
#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
评论
我不知道你的问题吗?!?您能说得更清楚些吗?您确定更改了该静态字符串的所有实例吗?并且确定在运行时看到的字符串不是动态生成的吗? (最好是对类进行反编译并找出答案。)
该文本可能是由其他一些.class文件创建的。检查jar中有多少个.class文件。
可以在修改前后张贴jar吗?
如果它是真实世界的应用程序,则必须提供某种保护,某种混淆,加密等。因此,我的猜测是字符串是加密的,只有在运行时才能解密。因此,您可能永远不会在静态.class文件中看到该字符串。您正在编辑的内容可能还有其他内容。