混淆代码包含相同的成员变量名称

时间:2014-08-12 11:16:05

标签: java obfuscation deobfuscation

我有一个混淆的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如何处理这个问题?

2 个答案:

答案 0 :(得分:1)

有些混淆器使用控制符号来使标识符更难阅读。这尤其涉及将代码打印到控制台的情况,该控制台解释这些符号而不是打印其转义图标。因此,这些名称实际上可能是混淆的,例如:

U+0061 U+200B * n

其中U+0061表示aU+200B是零长度宽度符号,每个n标识符需要增加的次数。在普通编辑器中,所有标识符将显示为a

通常,Java字节代码不允许对类的字段使用重复的标识符,但它允许在Java源代码中不正常的标识符。如果您的代码运行,Unicode理论是最可能的解释。也许您的反编译器也会错过这些字符,或者甚至没有将它们放入源代码中。尝试使用显示不可见Unicode 的编辑器读取上述类文件的字节代码(javap输出)以验证此理论。

答案 1 :(得分:0)

该代码不是有效的Java代码,jshrink可能无法正确反编译代码,通常的反编译器行为基于尽力而为技术

尝试使用CFR对其进行反编译,它是一个出色的Java反编译器,通常会生成有效的代码。