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
# 1 楼答案
每个方法都必须返回,包括静态初始值设定项。在字节码级别,有(而且必须有)一个
return
操作码。无论出于何种原因,在将字节码翻译回Java代码时,您使用的反编译器没有忽略return
语句,因此,在不允许显式返回的上下文中,您最终会得到return
语句。这可能与您的类被混淆的事实无关有趣的是,一些反编译器(比如Procyon)并没有显式地忽略初始化程序块中的
return
语句。这通常不是必需的,因为它们试图删除所有冗余的return
语句。由于不允许显式return
,因此从Java代码编译的静态初始值设定项应该只包含一个return
,并且它总是冗余的,因此总是被删除。混淆器可能会通过在主体中插入新的return
操作码来鼓励生成无效的Java代码# 2 楼答案
反编译器永远不会百分之百准确,因为对任何一行代码进行编程都有多种方法。此外,JAD(当我们说反编译器for Java时,它几乎是JAD的同义词)不支持JDK 1.5及更高版本。它不再被开发或维护
另外,查看反编译的代码会给您带来错误,因为从Java7开始,它在加载类之前会查找main方法。这与以前的java版本不同,因此静态块不会执行。在以前的版本中,JRE用于在加载类后和执行静态块后查找主方法。因此,它可以在以前的版本中工作,但不能在java的新版本中工作。但是,由于JAD不再被维护,它可能会向您显示过时的代码,这些代码曾经是有效的