我一直在对 Java 应用程序进行逆向工程,并且偶然发现了一些有趣的东西。我发现的字节码似乎违反了规则,因为没有首先在构造函数中初始化超类。
我正在尝试弄清楚这怎么可能。这可能是Java编译器的正常行为,还是某种偷偷摸摸的混淆技术(注:值得一提的是,原始类名尚未被混淆器剥离,这表明混淆过程可能不是很彻底。因此,字节码结构不太可能是故意混淆的结果。)
任何人都可以提供一些关于生成这种非常规字节码的原始代码是什么样子的见解吗?我渴望了解并解开这个谜团。非常感谢!
这是字节码。
final class a/ka$a extends java/lang/Thread {
<ClassVersion=51>
<SourceFile=CLThreadPool.java>
private synthetic a.ka a;
public ka$a(a.ka arg0, java.lang.String arg1, boolean arg2) { // <init> //(La/ka;Ljava/lang/String;Z)V
<localVar:index=0 , name=this , desc=La/ka$a;, sig=null, start=L0, end=L4>
<localVar:index=2 , name=name , desc=Ljava/lang/String;, sig=null, start=L0, end=L4>
<localVar:index=3 , name=daemon , desc=Z, sig=null, start=L0, end=L4>
L0 {
aload 0 // reference to self
aload 1 // reference to arg0
putfield a/ka$a.a:a.ka
}
L1 {
aload 0 // reference to self
aload 1 …Run Code Online (Sandbox Code Playgroud)