无法反编译JAR文件

时间:2018-04-05 11:17:01

标签: java java-bytecode-asm

我发现了一个非常奇怪的JAR文件。它包含两个类。我试过我认识的每一个反编译器,甚至是IntelliJ的Fernflower。所有人都给了我这个结果:Screenshot of IntelliJ's decompiler 当我尝试查看类的字节码时,我可以看到一些奇怪的东西:Screenshot of ASM Bytecode Viewer in IntelliJ 它说这个类是“合成的”。我查了一下谷歌的意思,我真的不知道这样的课程怎么算是合成的。任何想法如何制作以及如何复制这样的东西?

2 个答案:

答案 0 :(得分:0)

在大多数情况下,您不得反编译软件。在这种情况下,我很确定你不被允许,因为类名是混淆。但是奇怪的@thingys在图书馆中是某种类型的Lombok或自定义Annotation

修改 它是minecraftforge的Annotation。以下是一些信息:https://mcforge.readthedocs.io/en/latest/gettingstarted/structuring/#what-is-mod

请不要反编译您不拥有的源代码!

答案 1 :(得分:0)

合成标志用于标记由编译器生成的类/字段/方法/ ...,因此在源代码中不存在。 (请参阅JVM-spec 4.1-B

由于您已经添加了java-bytecode-asm,所以我想您想知道如何使用objectweb asm库来实现这一点。 通过为该类设置ACC_SYNTETHIC标志来完成。

这是一个针对类以及所有字段和方法的类访问者:

public class MakeSyntheticVisitor extends ClassVisitor {
    public MakeSyntheticVisitor(int api, ClassVisitor classVisitor) {
        super(api, classVisitor);
    }

    @Override
    public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
        super.visit(version, access | Opcodes.ACC_SYNTHETIC, name, signature, superName, interfaces);
    }

    @Override
    public FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value) {
        return super.visitField(access | Opcodes.ACC_SYNTHETIC, name, descriptor, signature, value);
    }

    @Override
    public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
        return super.visitMethod(access | Opcodes.ACC_SYNTHETIC, name, descriptor, signature, exceptions);
    }
}

让我们使用访问者来转换类:

public static void main() throws Exception {
    InputStream in = new FileInputStream(new File("in/Test.class"));

    ClassReader cr = new ClassReader(in);
    ClassWriter cw = new ClassWriter(0);

    cr.accept(new MakeSyntheticVisitor(Opcodes.ASM7, cw), 0);

    FileOutputStream out = new FileOutputStream(new File("obfuscated/Test.class"));
    out.write(cw.toByteArray());
    out.close();
}