diff options
| author | 2018-07-24 22:40:03 +0800 | |
|---|---|---|
| committer | 2018-07-24 22:40:03 +0800 | |
| commit | 0993c18bc44b35fad25af05f50c7efde3e85fec4 (patch) | |
| tree | 9f3c81a352ead573ed4a7dc94e247bee8653a0ae | |
| parent | match the keybind to what the UI says (diff) | |
| download | enigma-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.java | 39 |
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; | |||
| 15 | import com.google.common.collect.Lists; | 15 | import com.google.common.collect.Lists; |
| 16 | import com.google.common.collect.Maps; | 16 | import com.google.common.collect.Maps; |
| 17 | import com.google.common.collect.Sets; | 17 | import com.google.common.collect.Sets; |
| 18 | import com.strobel.assembler.metadata.ITypeLoader; | ||
| 18 | import com.strobel.assembler.metadata.MetadataSystem; | 19 | import com.strobel.assembler.metadata.MetadataSystem; |
| 19 | import com.strobel.assembler.metadata.TypeDefinition; | 20 | import com.strobel.assembler.metadata.TypeDefinition; |
| 20 | import com.strobel.assembler.metadata.TypeReference; | 21 | import com.strobel.assembler.metadata.TypeReference; |
| @@ -44,6 +45,7 @@ import org.objectweb.asm.tree.ClassNode; | |||
| 44 | 45 | ||
| 45 | import java.io.*; | 46 | import java.io.*; |
| 46 | import java.util.*; | 47 | import java.util.*; |
| 48 | import java.util.concurrent.ConcurrentHashMap; | ||
| 47 | import java.util.concurrent.atomic.AtomicInteger; | 49 | import java.util.concurrent.atomic.AtomicInteger; |
| 48 | import java.util.jar.JarEntry; | 50 | import java.util.jar.JarEntry; |
| 49 | import java.util.jar.JarFile; | 51 | import 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 | } |