diff options
| author | 2014-08-17 10:56:17 -0400 | |
|---|---|---|
| committer | 2014-08-17 10:56:17 -0400 | |
| commit | 6c4440ac1133bfaa7871d1049d174528a289ef30 (patch) | |
| tree | fe1142b285c5e43dbd3afe8dd3eb0189f027c6a6 /src/cuchaz/enigma/mapping/ClassMapping.java | |
| parent | trying to get inner/anonymous classes working... I have a working heuristic i... (diff) | |
| download | enigma-fork-6c4440ac1133bfaa7871d1049d174528a289ef30.tar.gz enigma-fork-6c4440ac1133bfaa7871d1049d174528a289ef30.tar.xz enigma-fork-6c4440ac1133bfaa7871d1049d174528a289ef30.zip | |
added support for automatic reconstruction of inner and anonymous classes
also added class to restore bridge method flags taken out by the obfuscator
Diffstat (limited to '')
| -rw-r--r-- | src/cuchaz/enigma/mapping/ClassMapping.java | 97 |
1 files changed, 86 insertions, 11 deletions
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<ClassMapping> | |||
| 21 | 21 | ||
| 22 | private String m_obfName; | 22 | private String m_obfName; |
| 23 | private String m_deobfName; | 23 | private String m_deobfName; |
| 24 | private Map<String,ClassMapping> m_innerClassesByObf; | ||
| 25 | private Map<String,ClassMapping> m_innerClassesByDeobf; | ||
| 24 | private Map<String,FieldMapping> m_fieldsByObf; | 26 | private Map<String,FieldMapping> m_fieldsByObf; |
| 25 | private Map<String,FieldMapping> m_fieldsByDeobf; | 27 | private Map<String,FieldMapping> m_fieldsByDeobf; |
| 26 | private Map<String,MethodMapping> m_methodsByObf; | 28 | private Map<String,MethodMapping> m_methodsByObf; |
| @@ -31,6 +33,8 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> | |||
| 31 | { | 33 | { |
| 32 | m_obfName = obfName; | 34 | m_obfName = obfName; |
| 33 | m_deobfName = NameValidator.validateClassName( deobfName ); | 35 | m_deobfName = NameValidator.validateClassName( deobfName ); |
| 36 | m_innerClassesByObf = Maps.newHashMap(); | ||
| 37 | m_innerClassesByDeobf = Maps.newHashMap(); | ||
| 34 | m_fieldsByObf = Maps.newHashMap(); | 38 | m_fieldsByObf = Maps.newHashMap(); |
| 35 | m_fieldsByDeobf = Maps.newHashMap(); | 39 | m_fieldsByDeobf = Maps.newHashMap(); |
| 36 | m_methodsByObf = Maps.newHashMap(); | 40 | m_methodsByObf = Maps.newHashMap(); |
| @@ -51,6 +55,72 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> | |||
| 51 | m_deobfName = NameValidator.validateClassName( val ); | 55 | m_deobfName = NameValidator.validateClassName( val ); |
| 52 | } | 56 | } |
| 53 | 57 | ||
| 58 | //// INNER CLASSES //////// | ||
| 59 | |||
| 60 | public Iterable<ClassMapping> innerClasses( ) | ||
| 61 | { | ||
| 62 | assert( m_innerClassesByObf.size() == m_innerClassesByDeobf.size() ); | ||
| 63 | return m_innerClassesByObf.values(); | ||
| 64 | } | ||
| 65 | |||
| 66 | protected void addInnerClassMapping( ClassMapping classMapping ) | ||
| 67 | { | ||
| 68 | m_innerClassesByObf.put( classMapping.getObfName(), classMapping ); | ||
| 69 | m_innerClassesByDeobf.put( classMapping.getDeobfName(), classMapping ); | ||
| 70 | } | ||
| 71 | |||
| 72 | public ClassMapping getOrCreateInnerClass( String obfName ) | ||
| 73 | { | ||
| 74 | ClassMapping classMapping = m_innerClassesByObf.get( obfName ); | ||
| 75 | if( classMapping == null ) | ||
| 76 | { | ||
| 77 | classMapping = new ClassMapping( obfName, obfName ); | ||
| 78 | m_innerClassesByObf.put( obfName, classMapping ); | ||
| 79 | m_innerClassesByDeobf.put( obfName, classMapping ); | ||
| 80 | } | ||
| 81 | return classMapping; | ||
| 82 | } | ||
| 83 | |||
| 84 | public ClassMapping getInnerClassByObf( String obfName ) | ||
| 85 | { | ||
| 86 | return m_innerClassesByObf.get( obfName ); | ||
| 87 | } | ||
| 88 | |||
| 89 | public ClassMapping getInnerClassByDeobf( String deobfName ) | ||
| 90 | { | ||
| 91 | return m_innerClassesByDeobf.get( deobfName ); | ||
| 92 | } | ||
| 93 | |||
| 94 | public String getObfInnerClassName( String deobfName ) | ||
| 95 | { | ||
| 96 | ClassMapping classMapping = m_innerClassesByDeobf.get( deobfName ); | ||
| 97 | if( classMapping != null ) | ||
| 98 | { | ||
| 99 | return classMapping.getObfName(); | ||
| 100 | } | ||
| 101 | return null; | ||
| 102 | } | ||
| 103 | |||
| 104 | public String getDeobfInnerClassName( String obfName ) | ||
| 105 | { | ||
| 106 | ClassMapping classMapping = m_innerClassesByObf.get( obfName ); | ||
| 107 | if( classMapping != null ) | ||
| 108 | { | ||
| 109 | return classMapping.getDeobfName(); | ||
| 110 | } | ||
| 111 | return null; | ||
| 112 | } | ||
| 113 | |||
| 114 | public void setInnerClassName( String obfName, String deobfName ) | ||
| 115 | { | ||
| 116 | ClassMapping classMapping = getOrCreateInnerClass( obfName ); | ||
| 117 | m_innerClassesByDeobf.remove( classMapping.getDeobfName() ); | ||
| 118 | classMapping.setDeobfName( deobfName ); | ||
| 119 | m_innerClassesByDeobf.put( deobfName, classMapping ); | ||
| 120 | } | ||
| 121 | |||
| 122 | //// FIELDS //////// | ||
| 123 | |||
| 54 | public Iterable<FieldMapping> fields( ) | 124 | public Iterable<FieldMapping> fields( ) |
| 55 | { | 125 | { |
| 56 | assert( m_fieldsByObf.size() == m_fieldsByDeobf.size() ); | 126 | assert( m_fieldsByObf.size() == m_fieldsByDeobf.size() ); |
| @@ -62,18 +132,7 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> | |||
| 62 | m_fieldsByObf.put( fieldMapping.getObfName(), fieldMapping ); | 132 | m_fieldsByObf.put( fieldMapping.getObfName(), fieldMapping ); |
| 63 | m_fieldsByDeobf.put( fieldMapping.getDeobfName(), fieldMapping ); | 133 | m_fieldsByDeobf.put( fieldMapping.getDeobfName(), fieldMapping ); |
| 64 | } | 134 | } |
| 65 | |||
| 66 | public Iterable<MethodMapping> methods( ) | ||
| 67 | { | ||
| 68 | assert( m_methodsByObf.size() == m_methodsByDeobf.size() ); | ||
| 69 | return m_methodsByObf.values(); | ||
| 70 | } | ||
| 71 | 135 | ||
| 72 | protected void addMethodMapping( MethodMapping methodMapping ) | ||
| 73 | { | ||
| 74 | m_methodsByObf.put( getMethodKey( methodMapping.getObfName(), methodMapping.getObfSignature() ), methodMapping ); | ||
| 75 | m_methodsByDeobf.put( getMethodKey( methodMapping.getDeobfName(), methodMapping.getDeobfSignature() ), methodMapping ); | ||
| 76 | } | ||
| 77 | 136 | ||
| 78 | public String getObfFieldName( String deobfName ) | 137 | public String getObfFieldName( String deobfName ) |
| 79 | { | 138 | { |
| @@ -110,6 +169,20 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> | |||
| 110 | m_fieldsByDeobf.put( deobfName, fieldMapping ); | 169 | m_fieldsByDeobf.put( deobfName, fieldMapping ); |
| 111 | } | 170 | } |
| 112 | 171 | ||
| 172 | //// METHODS //////// | ||
| 173 | |||
| 174 | public Iterable<MethodMapping> methods( ) | ||
| 175 | { | ||
| 176 | assert( m_methodsByObf.size() == m_methodsByDeobf.size() ); | ||
| 177 | return m_methodsByObf.values(); | ||
| 178 | } | ||
| 179 | |||
| 180 | protected void addMethodMapping( MethodMapping methodMapping ) | ||
| 181 | { | ||
| 182 | m_methodsByObf.put( getMethodKey( methodMapping.getObfName(), methodMapping.getObfSignature() ), methodMapping ); | ||
| 183 | m_methodsByDeobf.put( getMethodKey( methodMapping.getDeobfName(), methodMapping.getDeobfSignature() ), methodMapping ); | ||
| 184 | } | ||
| 185 | |||
| 113 | public MethodMapping getMethodByObf( String obfName, String signature ) | 186 | public MethodMapping getMethodByObf( String obfName, String signature ) |
| 114 | { | 187 | { |
| 115 | return m_methodsByObf.get( getMethodKey( obfName, signature ) ); | 188 | return m_methodsByObf.get( getMethodKey( obfName, signature ) ); |
| @@ -155,6 +228,8 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> | |||
| 155 | } | 228 | } |
| 156 | } | 229 | } |
| 157 | 230 | ||
| 231 | //// ARGUMENTS //////// | ||
| 232 | |||
| 158 | public void setArgumentName( String obfMethodName, String obfMethodSignature, int argumentIndex, String argumentName ) | 233 | public void setArgumentName( String obfMethodName, String obfMethodSignature, int argumentIndex, String argumentName ) |
| 159 | { | 234 | { |
| 160 | MethodMapping methodIndex = m_methodsByObf.get( getMethodKey( obfMethodName, obfMethodSignature ) ); | 235 | MethodMapping methodIndex = m_methodsByObf.get( getMethodKey( obfMethodName, obfMethodSignature ) ); |