经过反编译的混淆代码"无法从初始化程序中返回"

时间:2014-06-20 07:04:44

标签: java obfuscation decompiling

我有一个名为StaticInitializer.class的类文件,它成功进行了模糊处理。 当我反编译它时,我得到了以下结果,其中IDE给出了编译器错误" Cannot return from within an initializer"。正在删除" return"声明解决了这个问题。 但实际上我想知道的是,如果类文件在静态初始化程序中有return语句,它是如何正常工作的。

java文件的编译和运行阶段是否存在不匹配,混淆检测并将它们用作混淆方式?

反编译代码

public class StaticInitializer {


    static {

        int a=12;
        int b=34;
        return ;
    }

}

编辑: 以下操作显示使用jdk 1.5

编译混淆的类文件
javap -c StaticInitializer.class
major version: 49  

J2SE 8 = 52, J2SE 7 = 51, J2SE 6.0 = 50,

J2SE 5.0 = 49,

JDK 1.4 = 48, JDK 1.3 = 47, JDK 1.2 = 46, JDK 1.1 = 45

2 个答案:

答案 0 :(得分:2)

反编译器永远不会100%准确,因为有多种方法可以编写任何代码行。 ALso JAD(当我们说Java的反编译器时,它几乎与JAD同义)不支持JDK 1.5及更高版本。它不再开发或维护。

同时查看反编译代码会给出错误,因为从Java 7开始,它在加载类之前会查找main方法。这是对以前的java版本的更改,因此您的静态块不会执行。在以前的版本中,行为是JRE用于在加载类之后以及执行静态块之后查找main方法。所以它可以在以前的版本中使用,但不适用于新版本的java。但是由于JAD不再被维护,它可能会向您显示过时的有效代码。

答案 1 :(得分:1)

  

但实际上我想知道的是,如果类文件在静态初始化程序中有一个return语句,它是如何正常工作的。

每个方法都必须返回,包括静态初始化程序。在字节码级别,有(并且必须是)return操作码。无论出于何种原因,在将字节码转换回Java代码时,您使用的反编译器都没有省略return语句,因此您最终会在不允许显式返回的上下文中使用return语句。这可能与你的课被混淆的事实无关。

有趣的是,一些反编译器(如Procyon)没有明确省略初始化程序块中的return语句。它通常不是必需的,因为它们会尝试删除所有冗余的return语句。由于不允许显式return,因此从Java代码编译的静态初始化程序应该只包含一个return,并且它始终是冗余的,因此总是被删除。混淆器可以通过在正文中插入新的return操作码来鼓励生成无效的Java代码。

相关问题