From 64537ba10cf6627ed944cb66b22019c698f705d8 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Wed, 30 Mar 2022 17:44:58 +0100 Subject: Add readonly bytecode view. (#443) --- .../java/cuchaz/enigma/gui/config/Decompiler.java | 3 +- .../java/cuchaz/enigma/analysis/BuiltinPlugin.java | 1 + .../java/cuchaz/enigma/source/Decompilers.java | 2 + .../enigma/source/bytecode/BytecodeDecompiler.java | 21 ++++++++ .../enigma/source/bytecode/BytecodeSource.java | 56 ++++++++++++++++++++++ .../enigma/source/bytecode/EnigmaTextifier.java | 14 ++++++ 6 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeDecompiler.java create mode 100644 enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeSource.java create mode 100644 enigma/src/main/java/cuchaz/enigma/source/bytecode/EnigmaTextifier.java diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/config/Decompiler.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/config/Decompiler.java index 8232ab6e..f9b5cbe1 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/config/Decompiler.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/config/Decompiler.java @@ -5,7 +5,8 @@ import cuchaz.enigma.source.Decompilers; public enum Decompiler { CFR("CFR", Decompilers.CFR), - PROCYON("Procyon", Decompilers.PROCYON); + PROCYON("Procyon", Decompilers.PROCYON), + BYTECODE("Bytecode", Decompilers.BYTECODE); public final DecompilerService service; public final String name; diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/BuiltinPlugin.java b/enigma/src/main/java/cuchaz/enigma/analysis/BuiltinPlugin.java index 989464de..013c52f5 100644 --- a/enigma/src/main/java/cuchaz/enigma/analysis/BuiltinPlugin.java +++ b/enigma/src/main/java/cuchaz/enigma/analysis/BuiltinPlugin.java @@ -57,6 +57,7 @@ public final class BuiltinPlugin implements EnigmaPlugin { private void registerDecompilerServices(EnigmaPluginContext ctx) { ctx.registerService("enigma:procyon", DecompilerService.TYPE, ctx1 -> Decompilers.PROCYON); ctx.registerService("enigma:cfr", DecompilerService.TYPE, ctx1 -> Decompilers.CFR); + ctx.registerService("enigma:bytecode", DecompilerService.TYPE, ctx1 -> Decompilers.BYTECODE); } private static final class EnumFieldNameFindingVisitor extends ClassVisitor { diff --git a/enigma/src/main/java/cuchaz/enigma/source/Decompilers.java b/enigma/src/main/java/cuchaz/enigma/source/Decompilers.java index 7d154a6a..643ea7a6 100644 --- a/enigma/src/main/java/cuchaz/enigma/source/Decompilers.java +++ b/enigma/src/main/java/cuchaz/enigma/source/Decompilers.java @@ -1,9 +1,11 @@ package cuchaz.enigma.source; +import cuchaz.enigma.source.bytecode.BytecodeDecompiler; import cuchaz.enigma.source.cfr.CfrDecompiler; import cuchaz.enigma.source.procyon.ProcyonDecompiler; public class Decompilers { public static final DecompilerService PROCYON = ProcyonDecompiler::new; public static final DecompilerService CFR = CfrDecompiler::new; + public static final DecompilerService BYTECODE = BytecodeDecompiler::new; } diff --git a/enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeDecompiler.java b/enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeDecompiler.java new file mode 100644 index 00000000..97d2969b --- /dev/null +++ b/enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeDecompiler.java @@ -0,0 +1,21 @@ +package cuchaz.enigma.source.bytecode; + +import cuchaz.enigma.classprovider.ClassProvider; +import cuchaz.enigma.source.Decompiler; +import cuchaz.enigma.source.Source; +import cuchaz.enigma.source.SourceSettings; +import cuchaz.enigma.translation.mapping.EntryRemapper; +import org.checkerframework.checker.nullness.qual.Nullable; + +public class BytecodeDecompiler implements Decompiler { + private final ClassProvider classProvider; + + public BytecodeDecompiler(ClassProvider classProvider, SourceSettings settings) { + this.classProvider = classProvider; + } + + @Override + public Source getSource(String className, @Nullable EntryRemapper remapper) { + return new BytecodeSource(classProvider.get(className), remapper); + } +} diff --git a/enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeSource.java b/enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeSource.java new file mode 100644 index 00000000..4364b408 --- /dev/null +++ b/enigma/src/main/java/cuchaz/enigma/source/bytecode/BytecodeSource.java @@ -0,0 +1,56 @@ +package cuchaz.enigma.source.bytecode; + +import cuchaz.enigma.Enigma; +import cuchaz.enigma.bytecode.translators.TranslationClassVisitor; +import cuchaz.enigma.source.Source; +import cuchaz.enigma.source.SourceIndex; +import cuchaz.enigma.translation.mapping.EntryRemapper; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.util.TraceClassVisitor; + +import java.io.PrintWriter; +import java.io.StringWriter; + +public class BytecodeSource implements Source { + private final ClassNode classNode; + private final EntryRemapper remapper; + + public BytecodeSource(ClassNode classNode, EntryRemapper remapper) { + this.classNode = classNode; + this.remapper = remapper; + } + + @Override + public String asString() { + return index().getSource(); + } + + @Override + public Source withJavadocs(EntryRemapper remapper) { + return new BytecodeSource(classNode, remapper); + } + + @Override + public SourceIndex index() { + SourceIndex index = new SourceIndex(); + + EnigmaTextifier textifier = new EnigmaTextifier(index); + StringWriter out = new StringWriter(); + PrintWriter writer = new PrintWriter(out); + + TraceClassVisitor traceClassVisitor = new TraceClassVisitor(null, textifier, writer); + + ClassNode node = this.classNode; + + if (remapper != null) { + ClassNode translatedNode = new ClassNode(); + node.accept(new TranslationClassVisitor(remapper.getDeobfuscator(), Enigma.ASM_VERSION, translatedNode)); + node = translatedNode; + } + + node.accept(traceClassVisitor); + index.setSource(out.toString()); + + return index; + } +} diff --git a/enigma/src/main/java/cuchaz/enigma/source/bytecode/EnigmaTextifier.java b/enigma/src/main/java/cuchaz/enigma/source/bytecode/EnigmaTextifier.java new file mode 100644 index 00000000..2f3fcf2b --- /dev/null +++ b/enigma/src/main/java/cuchaz/enigma/source/bytecode/EnigmaTextifier.java @@ -0,0 +1,14 @@ +package cuchaz.enigma.source.bytecode; + +import cuchaz.enigma.Enigma; +import cuchaz.enigma.source.SourceIndex; +import org.objectweb.asm.util.Textifier; + +public class EnigmaTextifier extends Textifier { + private final SourceIndex sourceIndex; + + public EnigmaTextifier(SourceIndex sourceIndex) { + super(Enigma.ASM_VERSION); + this.sourceIndex = sourceIndex; + } +} -- cgit v1.2.3