From 268e8bd3a292162c215723638665e32415207c28 Mon Sep 17 00:00:00 2001 From: Thiakil Date: Thu, 12 Jul 2018 07:35:04 +0800 Subject: remove raw casts to Object --- src/main/java/cuchaz/enigma/Deobfuscator.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/main/java/cuchaz/enigma/Deobfuscator.java') diff --git a/src/main/java/cuchaz/enigma/Deobfuscator.java b/src/main/java/cuchaz/enigma/Deobfuscator.java index 6ea1c40..5b21011 100644 --- a/src/main/java/cuchaz/enigma/Deobfuscator.java +++ b/src/main/java/cuchaz/enigma/Deobfuscator.java @@ -34,6 +34,7 @@ import cuchaz.enigma.mapping.entry.*; import cuchaz.enigma.throwables.IllegalNameException; import cuchaz.enigma.utils.Utils; import oml.ast.transformers.ObfuscatedEnumSwitchRewriterTransform; +import oml.ast.transformers.RemoveObjectCasts; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.ClassNode; @@ -661,7 +662,8 @@ public class Deobfuscator { public static void runCustomTransforms(AstBuilder builder, DecompilerContext context){ List transformers = Arrays.asList( - new ObfuscatedEnumSwitchRewriterTransform(context) + new ObfuscatedEnumSwitchRewriterTransform(context), + new RemoveObjectCasts(context) ); for (IAstTransform transform : transformers){ transform.run(builder.getCompilationUnit()); -- cgit v1.2.3 From 714c0297c2e4e389ac52c6378b590b77c7058594 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Sun, 22 Jul 2018 23:38:02 +0100 Subject: Make rebuildMethodNames use parallelStream's should improve the speed a lot let me know if it breaks anything --- src/main/java/cuchaz/enigma/Deobfuscator.java | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'src/main/java/cuchaz/enigma/Deobfuscator.java') diff --git a/src/main/java/cuchaz/enigma/Deobfuscator.java b/src/main/java/cuchaz/enigma/Deobfuscator.java index 5b21011..599387e 100644 --- a/src/main/java/cuchaz/enigma/Deobfuscator.java +++ b/src/main/java/cuchaz/enigma/Deobfuscator.java @@ -340,28 +340,28 @@ public class Deobfuscator { } public void rebuildMethodNames(ProgressListener progress) { - int i = 0; + final AtomicInteger i = new AtomicInteger(); Map> renameClassMap = new HashMap<>(); progress.init(getMappings().classes().size() * 3, "Rebuilding method names"); - for (ClassMapping classMapping : Lists.newArrayList(getMappings().classes())) { - progress.onProgress(i++, classMapping.getDeobfName()); + Lists.newArrayList(getMappings().classes()).parallelStream().forEach(classMapping -> { + progress.onProgress(i.getAndIncrement(), classMapping.getDeobfName()); rebuildMethodNames(classMapping, renameClassMap); - } + }); - for (Map.Entry> renameClassMapEntry : renameClassMap.entrySet()) { - progress.onProgress(i++, renameClassMapEntry.getKey().getDeobfName()); + renameClassMap.entrySet().parallelStream().forEach(renameClassMapEntry -> { + progress.onProgress(i.getAndIncrement(), renameClassMapEntry.getKey().getDeobfName()); for (Map.Entry entry : renameClassMapEntry.getValue().entrySet()) { Entry obfEntry = entry.getKey(); removeMapping(obfEntry); } - } + }); - for (Map.Entry> renameClassMapEntry : renameClassMap.entrySet()) { - progress.onProgress(i++, renameClassMapEntry.getKey().getDeobfName()); + renameClassMap.entrySet().parallelStream().forEach(renameClassMapEntry -> { + progress.onProgress(i.getAndIncrement(), renameClassMapEntry.getKey().getDeobfName()); for (Map.Entry entry : renameClassMapEntry.getValue().entrySet()) { Entry obfEntry = entry.getKey(); @@ -373,7 +373,7 @@ public class Deobfuscator { System.out.println("WARNING: " + exception.getMessage()); } } - } + }); } private void rebuildMethodNames(ClassMapping classMapping, Map> renameClassMap) { -- cgit v1.2.3 From 8537f73abcf45e4380cf86d29404f61f0c9d88fe Mon Sep 17 00:00:00 2001 From: Thiakil Date: Tue, 24 Jul 2018 22:36:08 +0800 Subject: more custom source transformers --- src/main/java/cuchaz/enigma/Deobfuscator.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'src/main/java/cuchaz/enigma/Deobfuscator.java') diff --git a/src/main/java/cuchaz/enigma/Deobfuscator.java b/src/main/java/cuchaz/enigma/Deobfuscator.java index 599387e..2642424 100644 --- a/src/main/java/cuchaz/enigma/Deobfuscator.java +++ b/src/main/java/cuchaz/enigma/Deobfuscator.java @@ -33,8 +33,11 @@ import cuchaz.enigma.mapping.*; import cuchaz.enigma.mapping.entry.*; import cuchaz.enigma.throwables.IllegalNameException; import cuchaz.enigma.utils.Utils; +import oml.ast.transformers.InvalidIdentifierFix; +import oml.ast.transformers.Java8Generics; import oml.ast.transformers.ObfuscatedEnumSwitchRewriterTransform; import oml.ast.transformers.RemoveObjectCasts; +import oml.ast.transformers.VaragsFixer; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.ClassNode; @@ -663,7 +666,10 @@ public class Deobfuscator { public static void runCustomTransforms(AstBuilder builder, DecompilerContext context){ List transformers = Arrays.asList( new ObfuscatedEnumSwitchRewriterTransform(context), - new RemoveObjectCasts(context) + new VaragsFixer(context), + new RemoveObjectCasts(context), + new Java8Generics(), + new InvalidIdentifierFix() ); for (IAstTransform transform : transformers){ transform.run(builder.getCompilationUnit()); -- cgit v1.2.3 From 0993c18bc44b35fad25af05f50c7efde3e85fec4 Mon Sep 17 00:00:00 2001 From: Thiakil Date: Tue, 24 Jul 2018 22:40:03 +0800 Subject: use a common metadata (no-retry) instance to decompile all the files, similar to the procyon standalone decompiler --- src/main/java/cuchaz/enigma/Deobfuscator.java | 39 +++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) (limited to 'src/main/java/cuchaz/enigma/Deobfuscator.java') diff --git a/src/main/java/cuchaz/enigma/Deobfuscator.java b/src/main/java/cuchaz/enigma/Deobfuscator.java index 2642424..f42b59f 100644 --- a/src/main/java/cuchaz/enigma/Deobfuscator.java +++ b/src/main/java/cuchaz/enigma/Deobfuscator.java @@ -15,6 +15,7 @@ import com.google.common.base.Stopwatch; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import com.strobel.assembler.metadata.ITypeLoader; import com.strobel.assembler.metadata.MetadataSystem; import com.strobel.assembler.metadata.TypeDefinition; import com.strobel.assembler.metadata.TypeReference; @@ -44,6 +45,7 @@ import org.objectweb.asm.tree.ClassNode; import java.io.*; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -173,6 +175,10 @@ public class Deobfuscator { } public CompilationUnit getSourceTree(String className, ITranslatingTypeLoader loader) { + return getSourceTree(className, loader, new NoRetryMetadataSystem(loader)); + } + + public CompilationUnit getSourceTree(String className, ITranslatingTypeLoader loader, MetadataSystem metadataSystem) { // we don't know if this class name is obfuscated or deobfuscated // we need to tell the decompiler the deobfuscated name so it doesn't get freaked out @@ -191,7 +197,7 @@ public class Deobfuscator { this.settings.setTypeLoader(loader); // see if procyon can find the desc - TypeReference type = new MetadataSystem(loader).lookupType(deobfClassName); + TypeReference type = metadataSystem.lookupType(deobfClassName); if (type == null) { throw new Error(String.format("Unable to find desc: %s (deobf: %s)\nTried class names: %s", className, deobfClassName, loader.getClassNamesToTry(deobfClassName) @@ -281,6 +287,9 @@ public class Deobfuscator { //synchronized to make sure the parallelStream doesn't CME with the cache ITranslatingTypeLoader typeLoader = new SynchronizedTypeLoader(createTypeLoader()); + MetadataSystem metadataSystem = new NoRetryMetadataSystem(typeLoader); + metadataSystem.setEagerMethodLoadingEnabled(true);//ensures methods are loaded on classload and prevents race conditions + // DEOBFUSCATE ALL THE THINGS!! @_@ Stopwatch stopwatch = Stopwatch.createStarted(); AtomicInteger count = new AtomicInteger(); @@ -292,7 +301,7 @@ public class Deobfuscator { try { // get the source - CompilationUnit sourceTree = getSourceTree(obfClassEntry.getName(), typeLoader); + CompilationUnit sourceTree = getSourceTree(obfClassEntry.getName(), typeLoader, metadataSystem); // write the file File file = new File(dirOut, deobfClassEntry.getName().replace('.', '/') + ".java"); @@ -686,4 +695,30 @@ public class Deobfuscator { String transform(ClassNode node, ClassWriter writer); } + public static class NoRetryMetadataSystem extends MetadataSystem { + private final Set _failedTypes = Collections.newSetFromMap(new ConcurrentHashMap<>()); + + public NoRetryMetadataSystem(final ITypeLoader typeLoader) { + super(typeLoader); + } + + @Override + protected synchronized TypeDefinition resolveType(final String descriptor, final boolean mightBePrimitive) { + if (_failedTypes.contains(descriptor)) { + return null; + } + + final TypeDefinition result = super.resolveType(descriptor, mightBePrimitive); + + if (result == null) { + _failedTypes.add(descriptor); + } + + return result; + } + + public synchronized TypeDefinition resolve(final TypeReference type) { + return super.resolve(type); + } + } } -- cgit v1.2.3