From 027d79e46569321d7fe2d1049a512bf59370a47f Mon Sep 17 00:00:00 2001 From: Thiakil Date: Fri, 6 Jul 2018 13:03:02 +0800 Subject: speed up Deobfuscator's getSources by using a single TranslatingTypeloader and caching the ClassLoaderTypeloader --- src/main/java/cuchaz/enigma/Deobfuscator.java | 42 +++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 3 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 0e03753..cb02ffa 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.Buffer; import com.strobel.assembler.metadata.MetadataSystem; import com.strobel.assembler.metadata.TypeDefinition; import com.strobel.assembler.metadata.TypeReference; @@ -163,6 +164,10 @@ public class Deobfuscator { } public CompilationUnit getSourceTree(String className) { + return getSourceTree(className, createTypeLoader()); + } + + public CompilationUnit getSourceTree(String className, ITranslatingTypeLoader loader) { // 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 @@ -178,7 +183,6 @@ public class Deobfuscator { } // set the desc loader - TranslatingTypeLoader loader = createTypeLoader(); this.settings.setTypeLoader(loader); // see if procyon can find the desc @@ -267,6 +271,10 @@ public class Deobfuscator { progress.init(classEntries.size(), "Decompiling classes..."); } + //create a common instance outside the loop as mappings shouldn't be changing while this is happening + //synchronized to make sure the parallelStream doesn't CME with the cache + ITranslatingTypeLoader typeLoader = new SynchronizedTypeLoader(createTypeLoader()); + // DEOBFUSCATE ALL THE THINGS!! @_@ Stopwatch stopwatch = Stopwatch.createStarted(); AtomicInteger count = new AtomicInteger(); @@ -278,7 +286,7 @@ public class Deobfuscator { try { // get the source - CompilationUnit sourceTree = getSourceTree(obfClassEntry.getName()); + CompilationUnit sourceTree = getSourceTree(obfClassEntry.getName(), typeLoader); // write the file File file = new File(dirOut, deobfClassEntry.getName().replace('.', '/') + ".java"); @@ -295,7 +303,7 @@ public class Deobfuscator { } }); stopwatch.stop(); - System.out.println("Done in : " + stopwatch.toString()); + System.out.println("writeSources Done in : " + stopwatch.toString()); if (progress != null) { progress.onProgress(count.get(), "Done:"); } @@ -658,4 +666,32 @@ public class Deobfuscator { public interface ClassTransformer { String transform(ClassNode node, ClassWriter writer); } + + private class SynchronizedTypeLoader implements ITranslatingTypeLoader { + private final TranslatingTypeLoader delegate; + + private SynchronizedTypeLoader(TranslatingTypeLoader delegate) { + this.delegate = delegate; + } + + @Override + public List getClassNamesToTry(String className) { + return delegate.getClassNamesToTry(className); + } + + @Override + public List getClassNamesToTry(ClassEntry obfClassEntry) { + return delegate.getClassNamesToTry(obfClassEntry); + } + + @Override + public String transformInto(ClassNode node, ClassWriter writer) { + return delegate.transformInto(node, writer); + } + + @Override + public synchronized boolean tryLoadType(String internalName, Buffer buffer) { + return delegate.tryLoadType(internalName, buffer); + } + } } -- cgit v1.2.3 From 4297fa87848d379e15e80ebc0d3106082c4647e0 Mon Sep 17 00:00:00 2001 From: Thiakil Date: Fri, 6 Jul 2018 22:52:33 +0800 Subject: move SynchronizedTypeLoader to a non-inner --- src/main/java/cuchaz/enigma/Deobfuscator.java | 28 --------------------------- 1 file changed, 28 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 cb02ffa..b2cecfe 100644 --- a/src/main/java/cuchaz/enigma/Deobfuscator.java +++ b/src/main/java/cuchaz/enigma/Deobfuscator.java @@ -15,7 +15,6 @@ 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.Buffer; import com.strobel.assembler.metadata.MetadataSystem; import com.strobel.assembler.metadata.TypeDefinition; import com.strobel.assembler.metadata.TypeReference; @@ -667,31 +666,4 @@ public class Deobfuscator { String transform(ClassNode node, ClassWriter writer); } - private class SynchronizedTypeLoader implements ITranslatingTypeLoader { - private final TranslatingTypeLoader delegate; - - private SynchronizedTypeLoader(TranslatingTypeLoader delegate) { - this.delegate = delegate; - } - - @Override - public List getClassNamesToTry(String className) { - return delegate.getClassNamesToTry(className); - } - - @Override - public List getClassNamesToTry(ClassEntry obfClassEntry) { - return delegate.getClassNamesToTry(obfClassEntry); - } - - @Override - public String transformInto(ClassNode node, ClassWriter writer) { - return delegate.transformInto(node, writer); - } - - @Override - public synchronized boolean tryLoadType(String internalName, Buffer buffer) { - return delegate.tryLoadType(internalName, buffer); - } - } } -- cgit v1.2.3