From 6c4440ac1133bfaa7871d1049d174528a289ef30 Mon Sep 17 00:00:00 2001 From: hg Date: Sun, 17 Aug 2014 10:56:17 -0400 Subject: added support for automatic reconstruction of inner and anonymous classes also added class to restore bridge method flags taken out by the obfuscator --- src/cuchaz/enigma/mapping/ClassMapping.java | 97 +++++++++++++++++++++++++---- 1 file changed, 86 insertions(+), 11 deletions(-) (limited to 'src/cuchaz/enigma/mapping/ClassMapping.java') diff --git a/src/cuchaz/enigma/mapping/ClassMapping.java b/src/cuchaz/enigma/mapping/ClassMapping.java index c6826f3..c7f930c 100644 --- a/src/cuchaz/enigma/mapping/ClassMapping.java +++ b/src/cuchaz/enigma/mapping/ClassMapping.java @@ -21,6 +21,8 @@ public class ClassMapping implements Serializable, Comparable private String m_obfName; private String m_deobfName; + private Map m_innerClassesByObf; + private Map m_innerClassesByDeobf; private Map m_fieldsByObf; private Map m_fieldsByDeobf; private Map m_methodsByObf; @@ -31,6 +33,8 @@ public class ClassMapping implements Serializable, Comparable { m_obfName = obfName; m_deobfName = NameValidator.validateClassName( deobfName ); + m_innerClassesByObf = Maps.newHashMap(); + m_innerClassesByDeobf = Maps.newHashMap(); m_fieldsByObf = Maps.newHashMap(); m_fieldsByDeobf = Maps.newHashMap(); m_methodsByObf = Maps.newHashMap(); @@ -51,6 +55,72 @@ public class ClassMapping implements Serializable, Comparable m_deobfName = NameValidator.validateClassName( val ); } + //// INNER CLASSES //////// + + public Iterable innerClasses( ) + { + assert( m_innerClassesByObf.size() == m_innerClassesByDeobf.size() ); + return m_innerClassesByObf.values(); + } + + protected void addInnerClassMapping( ClassMapping classMapping ) + { + m_innerClassesByObf.put( classMapping.getObfName(), classMapping ); + m_innerClassesByDeobf.put( classMapping.getDeobfName(), classMapping ); + } + + public ClassMapping getOrCreateInnerClass( String obfName ) + { + ClassMapping classMapping = m_innerClassesByObf.get( obfName ); + if( classMapping == null ) + { + classMapping = new ClassMapping( obfName, obfName ); + m_innerClassesByObf.put( obfName, classMapping ); + m_innerClassesByDeobf.put( obfName, classMapping ); + } + return classMapping; + } + + public ClassMapping getInnerClassByObf( String obfName ) + { + return m_innerClassesByObf.get( obfName ); + } + + public ClassMapping getInnerClassByDeobf( String deobfName ) + { + return m_innerClassesByDeobf.get( deobfName ); + } + + public String getObfInnerClassName( String deobfName ) + { + ClassMapping classMapping = m_innerClassesByDeobf.get( deobfName ); + if( classMapping != null ) + { + return classMapping.getObfName(); + } + return null; + } + + public String getDeobfInnerClassName( String obfName ) + { + ClassMapping classMapping = m_innerClassesByObf.get( obfName ); + if( classMapping != null ) + { + return classMapping.getDeobfName(); + } + return null; + } + + public void setInnerClassName( String obfName, String deobfName ) + { + ClassMapping classMapping = getOrCreateInnerClass( obfName ); + m_innerClassesByDeobf.remove( classMapping.getDeobfName() ); + classMapping.setDeobfName( deobfName ); + m_innerClassesByDeobf.put( deobfName, classMapping ); + } + + //// FIELDS //////// + public Iterable fields( ) { assert( m_fieldsByObf.size() == m_fieldsByDeobf.size() ); @@ -62,18 +132,7 @@ public class ClassMapping implements Serializable, Comparable m_fieldsByObf.put( fieldMapping.getObfName(), fieldMapping ); m_fieldsByDeobf.put( fieldMapping.getDeobfName(), fieldMapping ); } - - public Iterable methods( ) - { - assert( m_methodsByObf.size() == m_methodsByDeobf.size() ); - return m_methodsByObf.values(); - } - protected void addMethodMapping( MethodMapping methodMapping ) - { - m_methodsByObf.put( getMethodKey( methodMapping.getObfName(), methodMapping.getObfSignature() ), methodMapping ); - m_methodsByDeobf.put( getMethodKey( methodMapping.getDeobfName(), methodMapping.getDeobfSignature() ), methodMapping ); - } public String getObfFieldName( String deobfName ) { @@ -110,6 +169,20 @@ public class ClassMapping implements Serializable, Comparable m_fieldsByDeobf.put( deobfName, fieldMapping ); } + //// METHODS //////// + + public Iterable methods( ) + { + assert( m_methodsByObf.size() == m_methodsByDeobf.size() ); + return m_methodsByObf.values(); + } + + protected void addMethodMapping( MethodMapping methodMapping ) + { + m_methodsByObf.put( getMethodKey( methodMapping.getObfName(), methodMapping.getObfSignature() ), methodMapping ); + m_methodsByDeobf.put( getMethodKey( methodMapping.getDeobfName(), methodMapping.getDeobfSignature() ), methodMapping ); + } + public MethodMapping getMethodByObf( String obfName, String signature ) { return m_methodsByObf.get( getMethodKey( obfName, signature ) ); @@ -155,6 +228,8 @@ public class ClassMapping implements Serializable, Comparable } } + //// ARGUMENTS //////// + public void setArgumentName( String obfMethodName, String obfMethodSignature, int argumentIndex, String argumentName ) { MethodMapping methodIndex = m_methodsByObf.get( getMethodKey( obfMethodName, obfMethodSignature ) ); -- cgit v1.2.3