summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Thiakil2018-07-24 22:40:03 +0800
committerGravatar Thiakil2018-07-24 22:40:03 +0800
commit0993c18bc44b35fad25af05f50c7efde3e85fec4 (patch)
tree9f3c81a352ead573ed4a7dc94e247bee8653a0ae
parentmatch the keybind to what the UI says (diff)
downloadenigma-0993c18bc44b35fad25af05f50c7efde3e85fec4.tar.gz
enigma-0993c18bc44b35fad25af05f50c7efde3e85fec4.tar.xz
enigma-0993c18bc44b35fad25af05f50c7efde3e85fec4.zip
use a common metadata (no-retry) instance to decompile all the files, similar to the procyon standalone decompiler
-rw-r--r--src/main/java/cuchaz/enigma/Deobfuscator.java39
1 files changed, 37 insertions, 2 deletions
diff --git a/src/main/java/cuchaz/enigma/Deobfuscator.java b/src/main/java/cuchaz/enigma/Deobfuscator.java
index 2642424e..f42b59f2 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;
15import com.google.common.collect.Lists; 15import com.google.common.collect.Lists;
16import com.google.common.collect.Maps; 16import com.google.common.collect.Maps;
17import com.google.common.collect.Sets; 17import com.google.common.collect.Sets;
18import com.strobel.assembler.metadata.ITypeLoader;
18import com.strobel.assembler.metadata.MetadataSystem; 19import com.strobel.assembler.metadata.MetadataSystem;
19import com.strobel.assembler.metadata.TypeDefinition; 20import com.strobel.assembler.metadata.TypeDefinition;
20import com.strobel.assembler.metadata.TypeReference; 21import com.strobel.assembler.metadata.TypeReference;
@@ -44,6 +45,7 @@ import org.objectweb.asm.tree.ClassNode;
44 45
45import java.io.*; 46import java.io.*;
46import java.util.*; 47import java.util.*;
48import java.util.concurrent.ConcurrentHashMap;
47import java.util.concurrent.atomic.AtomicInteger; 49import java.util.concurrent.atomic.AtomicInteger;
48import java.util.jar.JarEntry; 50import java.util.jar.JarEntry;
49import java.util.jar.JarFile; 51import java.util.jar.JarFile;
@@ -173,6 +175,10 @@ public class Deobfuscator {
173 } 175 }
174 176
175 public CompilationUnit getSourceTree(String className, ITranslatingTypeLoader loader) { 177 public CompilationUnit getSourceTree(String className, ITranslatingTypeLoader loader) {
178 return getSourceTree(className, loader, new NoRetryMetadataSystem(loader));
179 }
180
181 public CompilationUnit getSourceTree(String className, ITranslatingTypeLoader loader, MetadataSystem metadataSystem) {
176 182
177 // we don't know if this class name is obfuscated or deobfuscated 183 // we don't know if this class name is obfuscated or deobfuscated
178 // we need to tell the decompiler the deobfuscated name so it doesn't get freaked out 184 // we need to tell the decompiler the deobfuscated name so it doesn't get freaked out
@@ -191,7 +197,7 @@ public class Deobfuscator {
191 this.settings.setTypeLoader(loader); 197 this.settings.setTypeLoader(loader);
192 198
193 // see if procyon can find the desc 199 // see if procyon can find the desc
194 TypeReference type = new MetadataSystem(loader).lookupType(deobfClassName); 200 TypeReference type = metadataSystem.lookupType(deobfClassName);
195 if (type == null) { 201 if (type == null) {
196 throw new Error(String.format("Unable to find desc: %s (deobf: %s)\nTried class names: %s", 202 throw new Error(String.format("Unable to find desc: %s (deobf: %s)\nTried class names: %s",
197 className, deobfClassName, loader.getClassNamesToTry(deobfClassName) 203 className, deobfClassName, loader.getClassNamesToTry(deobfClassName)
@@ -281,6 +287,9 @@ public class Deobfuscator {
281 //synchronized to make sure the parallelStream doesn't CME with the cache 287 //synchronized to make sure the parallelStream doesn't CME with the cache
282 ITranslatingTypeLoader typeLoader = new SynchronizedTypeLoader(createTypeLoader()); 288 ITranslatingTypeLoader typeLoader = new SynchronizedTypeLoader(createTypeLoader());
283 289
290 MetadataSystem metadataSystem = new NoRetryMetadataSystem(typeLoader);
291 metadataSystem.setEagerMethodLoadingEnabled(true);//ensures methods are loaded on classload and prevents race conditions
292
284 // DEOBFUSCATE ALL THE THINGS!! @_@ 293 // DEOBFUSCATE ALL THE THINGS!! @_@
285 Stopwatch stopwatch = Stopwatch.createStarted(); 294 Stopwatch stopwatch = Stopwatch.createStarted();
286 AtomicInteger count = new AtomicInteger(); 295 AtomicInteger count = new AtomicInteger();
@@ -292,7 +301,7 @@ public class Deobfuscator {
292 301
293 try { 302 try {
294 // get the source 303 // get the source
295 CompilationUnit sourceTree = getSourceTree(obfClassEntry.getName(), typeLoader); 304 CompilationUnit sourceTree = getSourceTree(obfClassEntry.getName(), typeLoader, metadataSystem);
296 305
297 // write the file 306 // write the file
298 File file = new File(dirOut, deobfClassEntry.getName().replace('.', '/') + ".java"); 307 File file = new File(dirOut, deobfClassEntry.getName().replace('.', '/') + ".java");
@@ -686,4 +695,30 @@ public class Deobfuscator {
686 String transform(ClassNode node, ClassWriter writer); 695 String transform(ClassNode node, ClassWriter writer);
687 } 696 }
688 697
698 public static class NoRetryMetadataSystem extends MetadataSystem {
699 private final Set<String> _failedTypes = Collections.newSetFromMap(new ConcurrentHashMap<>());
700
701 public NoRetryMetadataSystem(final ITypeLoader typeLoader) {
702 super(typeLoader);
703 }
704
705 @Override
706 protected synchronized TypeDefinition resolveType(final String descriptor, final boolean mightBePrimitive) {
707 if (_failedTypes.contains(descriptor)) {
708 return null;
709 }
710
711 final TypeDefinition result = super.resolveType(descriptor, mightBePrimitive);
712
713 if (result == null) {
714 _failedTypes.add(descriptor);
715 }
716
717 return result;
718 }
719
720 public synchronized TypeDefinition resolve(final TypeReference type) {
721 return super.resolve(type);
722 }
723 }
689} 724}