有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java反编译模糊代码“无法从初始值设定项中返回”

我有一个名为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) 个答案

  1. # 1 楼答案

    But In fact What I want to know is that how obfuscated class file works properly if it has an return statement in static initializer.

    每个方法都必须返回,包括静态初始值设定项。在字节码级别,有(而且必须有)一个return操作码。无论出于何种原因,在将字节码翻译回Java代码时,您使用的反编译器没有忽略return语句,因此,在不允许显式返回的上下文中,您最终会得到return语句。这可能与您的类被混淆的事实无关

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

  2. # 2 楼答案

    反编译器永远不会百分之百准确,因为对任何一行代码进行编程都有多种方法。此外,JAD(当我们说反编译器for Java时,它几乎是JAD的同义词)不支持JDK 1.5及更高版本。它不再被开发或维护

    另外,查看反编译的代码会给您带来错误,因为从Java7开始,它在加载类之前会查找main方法。这与以前的java版本不同,因此静态块不会执行。在以前的版本中,JRE用于在加载类后和执行静态块后查找主方法。因此,它可以在以前的版本中工作,但不能在java的新版本中工作。但是,由于JAD不再被维护,它可能会向您显示过时的代码,这些代码曾经是有效的