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/Renamer.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 'src/cuchaz/enigma/mapping/Renamer.java')
| -rw-r--r-- | src/cuchaz/enigma/mapping/Renamer.java | 64 |
1 files changed, 32 insertions, 32 deletions
diff --git a/src/cuchaz/enigma/mapping/Renamer.java b/src/cuchaz/enigma/mapping/Renamer.java index d372575..0bb8dc1 100644 --- a/src/cuchaz/enigma/mapping/Renamer.java +++ b/src/cuchaz/enigma/mapping/Renamer.java | |||
| @@ -32,15 +32,18 @@ public class Renamer | |||
| 32 | public void setClassName( ClassEntry obf, String deobfName ) | 32 | public void setClassName( ClassEntry obf, String deobfName ) |
| 33 | { | 33 | { |
| 34 | deobfName = NameValidator.validateClassName( deobfName ); | 34 | deobfName = NameValidator.validateClassName( deobfName ); |
| 35 | ClassMapping classMapping = m_mappings.m_classesByObf.get( obf.getName() ); | 35 | ClassMapping classMapping = getOrCreateClassMapping( obf ); |
| 36 | if( classMapping == null ) | 36 | |
| 37 | if( obf.isInnerClass() ) | ||
| 37 | { | 38 | { |
| 38 | classMapping = createClassMapping( obf ); | 39 | classMapping.setInnerClassName( obf.getInnerClassName(), deobfName ); |
| 40 | } | ||
| 41 | else | ||
| 42 | { | ||
| 43 | m_mappings.m_classesByDeobf.remove( classMapping.getDeobfName() ); | ||
| 44 | classMapping.setDeobfName( deobfName ); | ||
| 45 | m_mappings.m_classesByDeobf.put( deobfName, classMapping ); | ||
| 39 | } | 46 | } |
| 40 | |||
| 41 | m_mappings.m_classesByDeobf.remove( classMapping.getDeobfName() ); | ||
| 42 | classMapping.setDeobfName( deobfName ); | ||
| 43 | m_mappings.m_classesByDeobf.put( deobfName, classMapping ); | ||
| 44 | 47 | ||
| 45 | updateDeobfMethodSignatures(); | 48 | updateDeobfMethodSignatures(); |
| 46 | } | 49 | } |
| @@ -48,12 +51,7 @@ public class Renamer | |||
| 48 | public void setFieldName( FieldEntry obf, String deobfName ) | 51 | public void setFieldName( FieldEntry obf, String deobfName ) |
| 49 | { | 52 | { |
| 50 | deobfName = NameValidator.validateFieldName( deobfName ); | 53 | deobfName = NameValidator.validateFieldName( deobfName ); |
| 51 | ClassMapping classMapping = m_mappings.m_classesByObf.get( obf.getClassName() ); | 54 | ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping( obf.getClassEntry() ); |
| 52 | if( classMapping == null ) | ||
| 53 | { | ||
| 54 | classMapping = createClassMapping( obf.getClassEntry() ); | ||
| 55 | } | ||
| 56 | |||
| 57 | classMapping.setFieldName( obf.getName(), deobfName ); | 55 | classMapping.setFieldName( obf.getName(), deobfName ); |
| 58 | } | 56 | } |
| 59 | 57 | ||
| @@ -84,28 +82,15 @@ public class Renamer | |||
| 84 | public void setMethodName( MethodEntry obf, String deobfName ) | 82 | public void setMethodName( MethodEntry obf, String deobfName ) |
| 85 | { | 83 | { |
| 86 | deobfName = NameValidator.validateMethodName( deobfName ); | 84 | deobfName = NameValidator.validateMethodName( deobfName ); |
| 87 | ClassMapping classMapping = m_mappings.m_classesByObf.get( obf.getClassName() ); | 85 | ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping( obf.getClassEntry() ); |
| 88 | if( classMapping == null ) | ||
| 89 | { | ||
| 90 | classMapping = createClassMapping( obf.getClassEntry() ); | ||
| 91 | } | ||
| 92 | |||
| 93 | String deobfSignature = m_mappings.getTranslator( m_index.getAncestries(), TranslationDirection.Deobfuscating ).translateSignature( obf.getSignature() ); | 86 | String deobfSignature = m_mappings.getTranslator( m_index.getAncestries(), TranslationDirection.Deobfuscating ).translateSignature( obf.getSignature() ); |
| 94 | classMapping.setMethodNameAndSignature( obf.getName(), obf.getSignature(), deobfName, deobfSignature ); | 87 | classMapping.setMethodNameAndSignature( obf.getName(), obf.getSignature(), deobfName, deobfSignature ); |
| 95 | |||
| 96 | // TODO: update ancestor/descendant methods in other classes in the inheritance hierarchy too | ||
| 97 | |||
| 98 | } | 88 | } |
| 99 | 89 | ||
| 100 | public void setArgumentName( ArgumentEntry obf, String deobfName ) | 90 | public void setArgumentName( ArgumentEntry obf, String deobfName ) |
| 101 | { | 91 | { |
| 102 | deobfName = NameValidator.validateArgumentName( deobfName ); | 92 | deobfName = NameValidator.validateArgumentName( deobfName ); |
| 103 | ClassMapping classMapping = m_mappings.m_classesByObf.get( obf.getClassName() ); | 93 | ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping( obf.getClassEntry() ); |
| 104 | if( classMapping == null ) | ||
| 105 | { | ||
| 106 | classMapping = createClassMapping( obf.getClassEntry() ); | ||
| 107 | } | ||
| 108 | |||
| 109 | classMapping.setArgumentName( obf.getMethodName(), obf.getMethodSignature(), obf.getIndex(), deobfName ); | 94 | classMapping.setArgumentName( obf.getMethodName(), obf.getMethodSignature(), obf.getIndex(), deobfName ); |
| 110 | } | 95 | } |
| 111 | 96 | ||
| @@ -119,11 +104,26 @@ public class Renamer | |||
| 119 | gzipout.finish(); | 104 | gzipout.finish(); |
| 120 | } | 105 | } |
| 121 | 106 | ||
| 122 | private ClassMapping createClassMapping( ClassEntry obf ) | 107 | private ClassMapping getOrCreateClassMapping( ClassEntry obfClassEntry ) |
| 108 | { | ||
| 109 | String obfClassName = obfClassEntry.getOuterClassName(); | ||
| 110 | ClassMapping classMapping = m_mappings.m_classesByObf.get( obfClassName ); | ||
| 111 | if( classMapping == null ) | ||
| 112 | { | ||
| 113 | classMapping = new ClassMapping( obfClassName, obfClassName ); | ||
| 114 | m_mappings.m_classesByObf.put( classMapping.getObfName(), classMapping ); | ||
| 115 | m_mappings.m_classesByDeobf.put( classMapping.getDeobfName(), classMapping ); | ||
| 116 | } | ||
| 117 | return classMapping; | ||
| 118 | } | ||
| 119 | |||
| 120 | private ClassMapping getOrCreateClassMappingOrInnerClassMapping( ClassEntry obfClassEntry ) | ||
| 123 | { | 121 | { |
| 124 | ClassMapping classMapping = new ClassMapping( obf.getName(), obf.getName() ); | 122 | ClassMapping classMapping = getOrCreateClassMapping( obfClassEntry ); |
| 125 | m_mappings.m_classesByObf.put( classMapping.getObfName(), classMapping ); | 123 | if( obfClassEntry.isInnerClass() ) |
| 126 | m_mappings.m_classesByDeobf.put( classMapping.getDeobfName(), classMapping ); | 124 | { |
| 125 | classMapping = classMapping.getOrCreateInnerClass( obfClassEntry.getInnerClassName() ); | ||
| 126 | } | ||
| 127 | return classMapping; | 127 | return classMapping; |
| 128 | } | 128 | } |
| 129 | 129 | ||