diff options
| author | 2014-09-01 22:52:07 -0400 | |
|---|---|---|
| committer | 2014-09-01 22:52:07 -0400 | |
| commit | 360bbd1c2fca8cbd575907b7d930a8072fccb0c2 (patch) | |
| tree | 93d0f3c4a0901411427df580c5ddb75cf27440f1 /src/cuchaz/enigma/Deobfuscator.java | |
| parent | added copyright notice (diff) | |
| download | enigma-fork-360bbd1c2fca8cbd575907b7d930a8072fccb0c2.tar.gz enigma-fork-360bbd1c2fca8cbd575907b7d930a8072fccb0c2.tar.xz enigma-fork-360bbd1c2fca8cbd575907b7d930a8072fccb0c2.zip | |
refactored jar,translation index. fixed bug with field renaming when fields are shadowed by subclasses
Diffstat (limited to 'src/cuchaz/enigma/Deobfuscator.java')
| -rw-r--r-- | src/cuchaz/enigma/Deobfuscator.java | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/src/cuchaz/enigma/Deobfuscator.java b/src/cuchaz/enigma/Deobfuscator.java index 49aa1ff..0356f92 100644 --- a/src/cuchaz/enigma/Deobfuscator.java +++ b/src/cuchaz/enigma/Deobfuscator.java | |||
| @@ -15,10 +15,12 @@ import java.io.FileWriter; | |||
| 15 | import java.io.IOException; | 15 | import java.io.IOException; |
| 16 | import java.io.StringWriter; | 16 | import java.io.StringWriter; |
| 17 | import java.util.List; | 17 | import java.util.List; |
| 18 | import java.util.Map; | ||
| 18 | import java.util.jar.JarFile; | 19 | import java.util.jar.JarFile; |
| 19 | 20 | ||
| 20 | import javassist.bytecode.Descriptor; | 21 | import javassist.bytecode.Descriptor; |
| 21 | 22 | ||
| 23 | import com.google.common.collect.Maps; | ||
| 22 | import com.strobel.assembler.metadata.MetadataSystem; | 24 | import com.strobel.assembler.metadata.MetadataSystem; |
| 23 | import com.strobel.assembler.metadata.TypeDefinition; | 25 | import com.strobel.assembler.metadata.TypeDefinition; |
| 24 | import com.strobel.decompiler.DecompilerContext; | 26 | import com.strobel.decompiler.DecompilerContext; |
| @@ -42,7 +44,7 @@ import cuchaz.enigma.mapping.FieldEntry; | |||
| 42 | import cuchaz.enigma.mapping.Mappings; | 44 | import cuchaz.enigma.mapping.Mappings; |
| 43 | import cuchaz.enigma.mapping.MethodEntry; | 45 | import cuchaz.enigma.mapping.MethodEntry; |
| 44 | import cuchaz.enigma.mapping.MethodMapping; | 46 | import cuchaz.enigma.mapping.MethodMapping; |
| 45 | import cuchaz.enigma.mapping.Renamer; | 47 | import cuchaz.enigma.mapping.MappingsRenamer; |
| 46 | import cuchaz.enigma.mapping.TranslationDirection; | 48 | import cuchaz.enigma.mapping.TranslationDirection; |
| 47 | import cuchaz.enigma.mapping.Translator; | 49 | import cuchaz.enigma.mapping.Translator; |
| 48 | 50 | ||
| @@ -59,8 +61,8 @@ public class Deobfuscator | |||
| 59 | private DecompilerSettings m_settings; | 61 | private DecompilerSettings m_settings; |
| 60 | private JarIndex m_jarIndex; | 62 | private JarIndex m_jarIndex; |
| 61 | private Mappings m_mappings; | 63 | private Mappings m_mappings; |
| 62 | private Renamer m_renamer; | 64 | private MappingsRenamer m_renamer; |
| 63 | private TranslatingTypeLoader m_typeLoader; | 65 | private Map<TranslationDirection,Translator> m_translatorCache; |
| 64 | 66 | ||
| 65 | public Deobfuscator( File file ) | 67 | public Deobfuscator( File file ) |
| 66 | throws IOException | 68 | throws IOException |
| @@ -78,6 +80,9 @@ public class Deobfuscator | |||
| 78 | // DEBUG | 80 | // DEBUG |
| 79 | //m_settings.setShowSyntheticMembers( true ); | 81 | //m_settings.setShowSyntheticMembers( true ); |
| 80 | 82 | ||
| 83 | // init defaults | ||
| 84 | m_translatorCache = Maps.newTreeMap(); | ||
| 85 | |||
| 81 | // init mappings | 86 | // init mappings |
| 82 | setMappings( new Mappings() ); | 87 | setMappings( new Mappings() ); |
| 83 | } | 88 | } |
| @@ -134,21 +139,19 @@ public class Deobfuscator | |||
| 134 | } | 139 | } |
| 135 | 140 | ||
| 136 | m_mappings = val; | 141 | m_mappings = val; |
| 137 | m_renamer = new Renamer( m_jarIndex, m_mappings ); | 142 | m_renamer = new MappingsRenamer( m_jarIndex, m_mappings ); |
| 138 | 143 | m_translatorCache.clear(); | |
| 139 | // update decompiler options | ||
| 140 | m_typeLoader = new TranslatingTypeLoader( | ||
| 141 | m_jar, | ||
| 142 | m_jarIndex, | ||
| 143 | getTranslator( TranslationDirection.Obfuscating ), | ||
| 144 | getTranslator( TranslationDirection.Deobfuscating ) | ||
| 145 | ); | ||
| 146 | m_settings.setTypeLoader( m_typeLoader ); | ||
| 147 | } | 144 | } |
| 148 | 145 | ||
| 149 | public Translator getTranslator( TranslationDirection direction ) | 146 | public Translator getTranslator( TranslationDirection direction ) |
| 150 | { | 147 | { |
| 151 | return m_mappings.getTranslator( m_jarIndex.getAncestries(), direction ); | 148 | Translator translator = m_translatorCache.get( direction ); |
| 149 | if( translator == null ) | ||
| 150 | { | ||
| 151 | translator = m_mappings.getTranslator( m_jarIndex.getTranslationIndex(), direction ); | ||
| 152 | m_translatorCache.put( direction, translator ); | ||
| 153 | } | ||
| 154 | return translator; | ||
| 152 | } | 155 | } |
| 153 | 156 | ||
| 154 | public void getSeparatedClasses( List<ClassEntry> obfClasses, List<ClassEntry> deobfClasses ) | 157 | public void getSeparatedClasses( List<ClassEntry> obfClasses, List<ClassEntry> deobfClasses ) |
| @@ -192,6 +195,14 @@ public class Deobfuscator | |||
| 192 | className = classMapping.getDeobfName(); | 195 | className = classMapping.getDeobfName(); |
| 193 | } | 196 | } |
| 194 | 197 | ||
| 198 | // set the type loader | ||
| 199 | m_settings.setTypeLoader( new TranslatingTypeLoader( | ||
| 200 | m_jar, | ||
| 201 | m_jarIndex, | ||
| 202 | getTranslator( TranslationDirection.Obfuscating ), | ||
| 203 | getTranslator( TranslationDirection.Deobfuscating ) | ||
| 204 | ) ); | ||
| 205 | |||
| 195 | // decompile it! | 206 | // decompile it! |
| 196 | TypeDefinition resolvedType = new MetadataSystem( m_settings.getTypeLoader() ).lookupType( className ).resolve(); | 207 | TypeDefinition resolvedType = new MetadataSystem( m_settings.getTypeLoader() ).lookupType( className ).resolve(); |
| 197 | DecompilerContext context = new DecompilerContext(); | 208 | DecompilerContext context = new DecompilerContext(); |
| @@ -350,8 +361,8 @@ public class Deobfuscator | |||
| 350 | throw new Error( "Unknown entry type: " + obfEntry.getClass().getName() ); | 361 | throw new Error( "Unknown entry type: " + obfEntry.getClass().getName() ); |
| 351 | } | 362 | } |
| 352 | 363 | ||
| 353 | // clear the type loader cache | 364 | // clear caches |
| 354 | m_typeLoader.clearCache(); | 365 | m_translatorCache.clear(); |
| 355 | } | 366 | } |
| 356 | 367 | ||
| 357 | public boolean hasMapping( Entry obfEntry ) | 368 | public boolean hasMapping( Entry obfEntry ) |