From 5eeee98418bb39367258442a82b75a081a6f91e0 Mon Sep 17 00:00:00 2001 From: jeff Date: Wed, 1 Oct 2014 00:04:18 -0400 Subject: fixed inner class renaming bug also added smarter sorting to class mappings --- src/cuchaz/enigma/Deobfuscator.java | 2 +- src/cuchaz/enigma/Main.java | 3 +- src/cuchaz/enigma/TranslatingTypeLoader.java | 1 - src/cuchaz/enigma/analysis/SourceIndex.java | 2 +- src/cuchaz/enigma/gui/GuiController.java | 1 + src/cuchaz/enigma/mapping/ClassMapping.java | 28 ++++++- src/cuchaz/enigma/mapping/Mappings.java | 26 +------ src/cuchaz/enigma/mapping/MappingsRenamer.java | 11 +-- src/cuchaz/enigma/mapping/Translator.java | 104 +++++++++---------------- 9 files changed, 73 insertions(+), 105 deletions(-) (limited to 'src/cuchaz') diff --git a/src/cuchaz/enigma/Deobfuscator.java b/src/cuchaz/enigma/Deobfuscator.java index d45ffb41..7e0f0927 100644 --- a/src/cuchaz/enigma/Deobfuscator.java +++ b/src/cuchaz/enigma/Deobfuscator.java @@ -261,7 +261,7 @@ public class Deobfuscator Translator translator = m_translatorCache.get( direction ); if( translator == null ) { - translator = m_mappings.getTranslator( m_jarIndex.getTranslationIndex(), direction ); + translator = m_mappings.getTranslator( direction ); m_translatorCache.put( direction, translator ); } return translator; diff --git a/src/cuchaz/enigma/Main.java b/src/cuchaz/enigma/Main.java index bbd734c6..371662bc 100644 --- a/src/cuchaz/enigma/Main.java +++ b/src/cuchaz/enigma/Main.java @@ -13,6 +13,7 @@ package cuchaz.enigma; import java.io.File; import cuchaz.enigma.gui.Gui; +import cuchaz.enigma.mapping.ClassEntry; public class Main { @@ -32,7 +33,7 @@ public class Main } // DEBUG - //gui.getController().openDeclaration( new ClassEntry( "none/bub" ) ); + gui.getController().openDeclaration( new ClassEntry( "none/ry" ) ); } private static File getFile( String path ) diff --git a/src/cuchaz/enigma/TranslatingTypeLoader.java b/src/cuchaz/enigma/TranslatingTypeLoader.java index 86e52a34..939e342d 100644 --- a/src/cuchaz/enigma/TranslatingTypeLoader.java +++ b/src/cuchaz/enigma/TranslatingTypeLoader.java @@ -13,7 +13,6 @@ package cuchaz.enigma; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.util.Arrays; import java.util.Map; import java.util.jar.JarEntry; import java.util.jar.JarFile; diff --git a/src/cuchaz/enigma/analysis/SourceIndex.java b/src/cuchaz/enigma/analysis/SourceIndex.java index 21a499e8..0e33de00 100644 --- a/src/cuchaz/enigma/analysis/SourceIndex.java +++ b/src/cuchaz/enigma/analysis/SourceIndex.java @@ -90,7 +90,7 @@ public class SourceIndex //System.out.println( String.format( "%s \"%s\" region: %s", node.getNodeType(), name, region ) ); // for tokens representing inner classes, make sure we only get the simple name - int pos = node.getText().lastIndexOf( '$' ); + int pos = name.lastIndexOf( '$' ); if( pos >= 0 ) { token.end -= pos + 1; diff --git a/src/cuchaz/enigma/gui/GuiController.java b/src/cuchaz/enigma/gui/GuiController.java index 2862ebed..646bb87d 100644 --- a/src/cuchaz/enigma/gui/GuiController.java +++ b/src/cuchaz/enigma/gui/GuiController.java @@ -43,6 +43,7 @@ import cuchaz.enigma.mapping.MappingsReader; import cuchaz.enigma.mapping.MappingsWriter; import cuchaz.enigma.mapping.MethodEntry; import cuchaz.enigma.mapping.TranslationDirection; +import cuchaz.enigma.mapping.Translator; public class GuiController { diff --git a/src/cuchaz/enigma/mapping/ClassMapping.java b/src/cuchaz/enigma/mapping/ClassMapping.java index ee02781e..e084d4df 100644 --- a/src/cuchaz/enigma/mapping/ClassMapping.java +++ b/src/cuchaz/enigma/mapping/ClassMapping.java @@ -117,6 +117,16 @@ public class ClassMapping implements Serializable, Comparable return m_innerClassesByDeobf.get( deobfName ); } + public ClassMapping getInnerClassByDeobfThenObf( String name ) + { + ClassMapping classMapping = getInnerClassByDeobf( name ); + if( classMapping == null ) + { + classMapping = getInnerClassByObf( name ); + } + return classMapping; + } + public String getObfInnerClassName( String deobfName ) { assert( isSimpleClassName( deobfName ) ); @@ -392,9 +402,18 @@ public class ClassMapping implements Serializable, Comparable buf.append( "\n" ); } buf.append( "Methods:\n" ); - for( MethodMapping methodIndex : m_methodsByObf.values() ) + for( MethodMapping methodMapping : m_methodsByObf.values() ) { - buf.append( methodIndex.toString() ); + buf.append( methodMapping.toString() ); + buf.append( "\n" ); + } + buf.append( "Inner Classes:\n" ); + for( ClassMapping classMapping : m_innerClassesByObf.values() ) + { + buf.append( "\t" ); + buf.append( classMapping.getObfName() ); + buf.append( " <-> " ); + buf.append( classMapping.getDeobfName() ); buf.append( "\n" ); } return buf.toString(); @@ -403,6 +422,11 @@ public class ClassMapping implements Serializable, Comparable @Override public int compareTo( ClassMapping other ) { + // sort by a, b, c, ... aa, ab, etc + if( m_obfName.length() != other.m_obfName.length() ) + { + return m_obfName.length() - other.m_obfName.length(); + } return m_obfName.compareTo( other.m_obfName ); } diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index 45b41bcd..3a39d100 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -24,7 +24,6 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import cuchaz.enigma.Util; -import cuchaz.enigma.analysis.TranslationIndex; import cuchaz.enigma.mapping.SignatureUpdater.ClassNameUpdater; public class Mappings implements Serializable @@ -125,35 +124,16 @@ public class Mappings implements Serializable return m_classesByDeobf.get( deobfName ); } - public Translator getTranslator( TranslationIndex index, TranslationDirection direction ) + public Translator getTranslator( TranslationDirection direction ) { switch( direction ) { case Deobfuscating: - return new Translator( direction, m_classesByObf, index ); + return new Translator( direction, m_classesByObf ); case Obfuscating: - // deobfuscate the index - index = new TranslationIndex( index ); - Map renames = Maps.newHashMap(); - for( ClassMapping classMapping : classes() ) - { - if( classMapping.getDeobfName() != null ) - { - renames.put( classMapping.getObfName(), classMapping.getDeobfName() ); - } - for( ClassMapping innerClassMapping : classMapping.innerClasses() ) - { - if( innerClassMapping.getDeobfName() != null ) - { - renames.put( innerClassMapping.getObfName(), innerClassMapping.getDeobfName() ); - } - } - } - index.renameClasses( renames ); - // fill in the missing deobf class entries with obf entries Map classes = Maps.newHashMap(); for( ClassMapping classMapping : classes() ) @@ -168,7 +148,7 @@ public class Mappings implements Serializable } } - return new Translator( direction, classes, index ); + return new Translator( direction, classes ); default: throw new Error( "Invalid translation direction!" ); diff --git a/src/cuchaz/enigma/mapping/MappingsRenamer.java b/src/cuchaz/enigma/mapping/MappingsRenamer.java index 24ec7318..3e5f1a4d 100644 --- a/src/cuchaz/enigma/mapping/MappingsRenamer.java +++ b/src/cuchaz/enigma/mapping/MappingsRenamer.java @@ -121,11 +121,11 @@ public class MappingsRenamer deobfName = NameValidator.validateMethodName( deobfName ); for( MethodEntry entry : implementations ) { - String deobfSignature = getTranslator( TranslationDirection.Deobfuscating ).translateSignature( obf.getSignature() ); + String deobfSignature = m_mappings.getTranslator( TranslationDirection.Deobfuscating ).translateSignature( obf.getSignature() ); MethodEntry targetEntry = new MethodEntry( entry.getClassEntry(), deobfName, deobfSignature ); if( m_mappings.containsDeobfMethod( entry.getClassEntry(), deobfName, entry.getSignature() ) || m_index.containsObfBehavior( targetEntry ) ) { - String deobfClassName = getTranslator( TranslationDirection.Deobfuscating ).translateClass( entry.getClassName() ); + String deobfClassName = m_mappings.getTranslator( TranslationDirection.Deobfuscating ).translateClass( entry.getClassName() ); throw new IllegalNameException( deobfName, "There is already a method with that name and signature in class " + deobfClassName ); } } @@ -142,7 +142,7 @@ public class MappingsRenamer MethodEntry targetEntry = new MethodEntry( obf.getClassEntry(), deobfName, obf.getSignature() ); if( m_mappings.containsDeobfMethod( obf.getClassEntry(), deobfName, obf.getSignature() ) || m_index.containsObfBehavior( targetEntry ) ) { - String deobfClassName = getTranslator( TranslationDirection.Deobfuscating ).translateClass( obf.getClassName() ); + String deobfClassName = m_mappings.getTranslator( TranslationDirection.Deobfuscating ).translateClass( obf.getClassName() ); throw new IllegalNameException( deobfName, "There is already a method with that name and signature in class " + deobfClassName ); } @@ -288,9 +288,4 @@ public class MappingsRenamer } return classMapping; } - - private Translator getTranslator( TranslationDirection direction ) - { - return m_mappings.getTranslator( m_index.getTranslationIndex(), direction ); - } } diff --git a/src/cuchaz/enigma/mapping/Translator.java b/src/cuchaz/enigma/mapping/Translator.java index 1c69b2f4..6cb52402 100644 --- a/src/cuchaz/enigma/mapping/Translator.java +++ b/src/cuchaz/enigma/mapping/Translator.java @@ -10,33 +10,27 @@ ******************************************************************************/ package cuchaz.enigma.mapping; -import java.util.ArrayList; -import java.util.List; import java.util.Map; import com.google.common.collect.Maps; -import cuchaz.enigma.analysis.TranslationIndex; import cuchaz.enigma.mapping.SignatureUpdater.ClassNameUpdater; public class Translator { private TranslationDirection m_direction; private Map m_classes; - private TranslationIndex m_index; public Translator( ) { m_direction = null; m_classes = Maps.newHashMap(); - m_index = new TranslationIndex(); } - public Translator( TranslationDirection direction, Map classes, TranslationIndex index ) + public Translator( TranslationDirection direction, Map classes ) { m_direction = direction; m_classes = classes; - m_index = index; } @SuppressWarnings( "unchecked" ) @@ -138,28 +132,18 @@ public class Translator public String translate( FieldEntry in ) { - for( String className : getSelfAndAncestors( in.getClassName() ) ) + // look for the class + ClassMapping classMapping = findClassMapping( in.getClassEntry() ); + if( classMapping != null ) { - // look for the class - ClassMapping classMapping = findClassMapping( new ClassEntry( className ) ); - if( classMapping != null ) - { - // look for the field - String translatedName = m_direction.choose( - classMapping.getDeobfFieldName( in.getName() ), - classMapping.getObfFieldName( in.getName() ) - ); - if( translatedName != null ) - { - return translatedName; - } - } - - // is the field implemented in this class? - if( m_index.containsField( className, in.getName() ) ) + // look for the field + String translatedName = m_direction.choose( + classMapping.getDeobfFieldName( in.getName() ), + classMapping.getObfFieldName( in.getName() ) + ); + if( translatedName != null ) { - // stop traversing the superclass chain - break; + return translatedName; } } return null; @@ -180,27 +164,23 @@ public class Translator public String translate( MethodEntry in ) { - for( String className : getSelfAndAncestors( in.getClassName() ) ) + // look for class + ClassMapping classMapping = findClassMapping( in.getClassEntry() ); + if( classMapping != null ) { - // look for class - ClassMapping classMapping = findClassMapping( new ClassEntry( className ) ); - if( classMapping != null ) + // look for the method + MethodMapping methodMapping = m_direction.choose( + classMapping.getMethodByObf( in.getName(), in.getSignature() ), + classMapping.getMethodByDeobf( in.getName(), translateSignature( in.getSignature() ) ) + ); + if( methodMapping != null ) { - // look for the method - MethodMapping methodMapping = m_direction.choose( - classMapping.getMethodByObf( in.getName(), in.getSignature() ), - classMapping.getMethodByDeobf( in.getName(), translateSignature( in.getSignature() ) ) + return m_direction.choose( + methodMapping.getDeobfName(), + methodMapping.getObfName() ); - if( methodMapping != null ) - { - return m_direction.choose( - methodMapping.getDeobfName(), - methodMapping.getObfName() - ); - } } } - return null; } @@ -248,27 +228,23 @@ public class Translator public String translate( ArgumentEntry in ) { - for( String className : getSelfAndAncestors( in.getClassName() ) ) + // look for the class + ClassMapping classMapping = findClassMapping( in.getClassEntry() ); + if( classMapping != null ) { - // look for the class - ClassMapping classMapping = findClassMapping( new ClassEntry( className ) ); - if( classMapping != null ) + // look for the method + MethodMapping methodMapping = m_direction.choose( + classMapping.getMethodByObf( in.getMethodName(), in.getMethodSignature() ), + classMapping.getMethodByDeobf( in.getMethodName(), translateSignature( in.getMethodSignature() ) ) + ); + if( methodMapping != null ) { - // look for the method - MethodMapping methodMapping = m_direction.choose( - classMapping.getMethodByObf( in.getMethodName(), in.getMethodSignature() ), - classMapping.getMethodByDeobf( in.getMethodName(), translateSignature( in.getMethodSignature() ) ) + return m_direction.choose( + methodMapping.getDeobfArgumentName( in.getIndex() ), + methodMapping.getObfArgumentName( in.getIndex() ) ); - if( methodMapping != null ) - { - return m_direction.choose( - methodMapping.getDeobfArgumentName( in.getIndex() ), - methodMapping.getObfArgumentName( in.getIndex() ) - ); - } } } - return null; } @@ -303,14 +279,6 @@ public class Translator } ); } - private List getSelfAndAncestors( String className ) - { - List ancestry = new ArrayList(); - ancestry.add( className ); - ancestry.addAll( m_index.getAncestry( className ) ); - return ancestry; - } - private ClassMapping findClassMapping( ClassEntry classEntry ) { ClassMapping classMapping = m_classes.get( classEntry.getOuterClassName() ); @@ -318,7 +286,7 @@ public class Translator { classMapping = m_direction.choose( classMapping.getInnerClassByObf( classEntry.getInnerClassName() ), - classMapping.getInnerClassByDeobf( classEntry.getInnerClassName() ) + classMapping.getInnerClassByDeobfThenObf( classEntry.getInnerClassName() ) ); } return classMapping; -- cgit v1.2.3