无法反编译JAR文件

问题描述 投票:0回答:3

我发现了一个非常奇怪的 JAR 文件。它包含两个类。我尝试了我所知道的每一个反编译器,甚至包括 IntelliJ 的 Fernflower。他们都给了我这个结果:Screenshot of IntelliJ's decompiler 当我尝试查看类的字节码时,我也可以看到一些奇怪的东西:Screenshot of ASM Bytecode Viewer in IntelliJ 它说该类是“合成的”。我在谷歌中查找了它的含义,我真的不知道这样的类如何被认为是合成的。有什么想法是如何制作的以及如何复制这样的东西吗?

java java-bytecode-asm
3个回答
0
投票

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

Annotation

编辑: 这是 Minecraftforge 的 Annotation

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

请勿反编译不属于您的源代码!


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(); }
    

0
投票
{ 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();
}

© www.soinside.com 2019 - 2024. All rights reserved.