java - 反编译混淆代码 "Cannot return from within an initializer"

标签 java obfuscation decompiling

我有一个名为 StaticInitializer.class 的类文件,该文件已成功混淆。 当我反编译它时,我得到以下结果,其中 IDE 给出编译器错误“无法从初始化程序中返回”。删除“return”语句可以解决该问题。 但实际上我想知道的是,如果混淆的类文件在静态初始化程序中有一个 return 语句,它如何正常工作。

Java 文件的编译阶段和运行阶段之间是否存在不匹配,混淆会检测到并使用它们作为混淆的一种方式?

反编译代码

public class StaticInitializer {


    static {

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

}

编辑: 以下操作显示混淆后的class文件是用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

最佳答案

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

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

关于java - 反编译混淆代码 "Cannot return from within an initializer",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24321724/

相关文章:

java - 写入对象

javascript - 在asp.net aspx页面上可以正常调用javascript混淆代码吗?

clr - 由于堆栈机 - 寄存器机的差异,混淆的 C# 或 Java 比 C 更容易反编译吗?还是有其他原因?

c++ - Hex-rays、MATLAB、MEX、转换 uintptr_t 失败

java - Java中基于左大括号的字符串分割

java - 使用 xpath 获取没有兄弟节点的节点以及父节点

java - Spring Boot 安全性 - 如果缺少授权 header ,则使用 Cookie 中的 token

java - 如何保留包含特定成员的类?

android - 使用 Proguard 处理 Jackson 库后混淆时出错

javassist 复制带有注释的方法