我有一个混淆的jar,它是我机器上Tomcat中已部署应用程序的一部分。 jar包含一些具有相同变量名称的奇怪代码。我使用jshrink来反编译代码。
static private org.apache.commons.logging.Log a;
private org.springframework.context.MessageSource a;
private org.springframework.context.support.MessageSourceAccessor a;
static private LicenseBean a;
static private ThreadLocal a;
private javax.servlet.ServletContext a;
private String a;
public LicenseBean() {
a = null;
a = null;
a = this;
}
这是反编译过程的问题吗?我的问题是如果反编译过程是正确的,JVM如何处理这个问题?
答案 0 :(得分:1)
有些混淆器使用控制符号来使标识符更难阅读。这尤其涉及将代码打印到控制台的情况,该控制台解释这些符号而不是打印其转义图标。因此,这些名称实际上可能是混淆的,例如:
U+0061 U+200B * n
其中U+0061
表示a
,U+200B
是零长度宽度符号,每个n
标识符需要增加的次数。在普通编辑器中,所有标识符将显示为a
。
通常,Java字节代码不允许对类的字段使用重复的标识符,但它允许在Java源代码中不正常的标识符。如果您的代码运行,Unicode理论是最可能的解释。也许您的反编译器也会错过这些字符,或者甚至没有将它们放入源代码中。尝试使用显示不可见Unicode 的编辑器读取上述类文件的字节代码(javap
输出)以验证此理论。
答案 1 :(得分:0)
该代码不是有效的Java代码,jshrink
可能无法正确反编译代码,通常的反编译器行为基于尽力而为技术
尝试使用CFR
对其进行反编译,它是一个出色的Java反编译器,通常会生成有效的代码。