diff options
Diffstat (limited to 'src/cuchaz/enigma/bytecode/ClassTranslator.java')
| -rw-r--r-- | src/cuchaz/enigma/bytecode/ClassTranslator.java | 64 |
1 files changed, 6 insertions, 58 deletions
diff --git a/src/cuchaz/enigma/bytecode/ClassTranslator.java b/src/cuchaz/enigma/bytecode/ClassTranslator.java index 9ce06a5..885b45f 100644 --- a/src/cuchaz/enigma/bytecode/ClassTranslator.java +++ b/src/cuchaz/enigma/bytecode/ClassTranslator.java | |||
| @@ -10,18 +10,16 @@ | |||
| 10 | ******************************************************************************/ | 10 | ******************************************************************************/ |
| 11 | package cuchaz.enigma.bytecode; | 11 | package cuchaz.enigma.bytecode; |
| 12 | 12 | ||
| 13 | import java.util.Set; | 13 | import java.util.Map; |
| 14 | 14 | ||
| 15 | import javassist.ClassMap; | ||
| 16 | import javassist.CtBehavior; | 15 | import javassist.CtBehavior; |
| 17 | import javassist.CtClass; | 16 | import javassist.CtClass; |
| 18 | import javassist.CtField; | 17 | import javassist.CtField; |
| 19 | import javassist.CtMethod; | 18 | import javassist.CtMethod; |
| 20 | import javassist.bytecode.ConstPool; | 19 | import javassist.bytecode.ConstPool; |
| 21 | import javassist.bytecode.Descriptor; | 20 | import javassist.bytecode.Descriptor; |
| 22 | import javassist.bytecode.InnerClassesAttribute; | ||
| 23 | 21 | ||
| 24 | import com.beust.jcommander.internal.Sets; | 22 | import com.beust.jcommander.internal.Maps; |
| 25 | 23 | ||
| 26 | import cuchaz.enigma.mapping.ClassEntry; | 24 | import cuchaz.enigma.mapping.ClassEntry; |
| 27 | import cuchaz.enigma.mapping.FieldEntry; | 25 | import cuchaz.enigma.mapping.FieldEntry; |
| @@ -136,61 +134,11 @@ public class ClassTranslator | |||
| 136 | 134 | ||
| 137 | // translate all the class names referenced in the code | 135 | // translate all the class names referenced in the code |
| 138 | // the above code only changed method/field/reference names and types, but not the class names themselves | 136 | // the above code only changed method/field/reference names and types, but not the class names themselves |
| 139 | Set<ClassEntry> classEntries = getAllClassEntries( c ); | 137 | Map<ClassEntry,ClassEntry> map = Maps.newHashMap(); |
| 140 | ClassMap map = new ClassMap(); | 138 | for( ClassEntry obfClassEntry : ClassRenamer.getAllClassEntries( c ) ) |
| 141 | for( ClassEntry obfClassEntry : classEntries ) | ||
| 142 | { | 139 | { |
| 143 | map.put( obfClassEntry.getName(), m_translator.translateEntry( obfClassEntry ).getName() ); | 140 | map.put( obfClassEntry, m_translator.translateEntry( obfClassEntry ) ); |
| 144 | } | 141 | } |
| 145 | c.replaceClassName( map ); | 142 | ClassRenamer.renameClasses( c, map ); |
| 146 | |||
| 147 | // translate the names in the InnerClasses attribute | ||
| 148 | InnerClassesAttribute attr = (InnerClassesAttribute)c.getClassFile().getAttribute( InnerClassesAttribute.tag ); | ||
| 149 | if( attr != null ) | ||
| 150 | { | ||
| 151 | for( int i=0; i<attr.tableLength(); i++ ) | ||
| 152 | { | ||
| 153 | ClassEntry obfClassEntry = new ClassEntry( Descriptor.toJvmName( attr.innerClass( i ) ) ); | ||
| 154 | ClassEntry deobfClassEntry = m_translator.translateEntry( obfClassEntry ); | ||
| 155 | attr.setInnerClassIndex( i, constants.addClassInfo( deobfClassEntry.getName() ) ); | ||
| 156 | if( attr.outerClassIndex( i ) != 0 ) | ||
| 157 | { | ||
| 158 | attr.setOuterClassIndex( i, constants.addClassInfo( deobfClassEntry.getOuterClassName() ) ); | ||
| 159 | } | ||
| 160 | if( attr.innerNameIndex( i ) != 0 ) | ||
| 161 | { | ||
| 162 | attr.setInnerNameIndex( i, constants.addUtf8Info( deobfClassEntry.getInnerClassName() ) ); | ||
| 163 | } | ||
| 164 | |||
| 165 | /* DEBUG | ||
| 166 | System.out.println( String.format( "\tOBF: %s DEOBF: %s-> ATTR: %s,%s,%s", | ||
| 167 | obfClassEntry, deobfClassEntry, | ||
| 168 | attr.outerClass( i ), | ||
| 169 | attr.innerClass( i ), | ||
| 170 | attr.innerName( i ) | ||
| 171 | ) ); | ||
| 172 | */ | ||
| 173 | } | ||
| 174 | } | ||
| 175 | } | ||
| 176 | |||
| 177 | private Set<ClassEntry> getAllClassEntries( CtClass c ) | ||
| 178 | { | ||
| 179 | final Set<ClassEntry> entries = Sets.newHashSet(); | ||
| 180 | ClassMap map = new ClassMap( ) | ||
| 181 | { | ||
| 182 | @Override | ||
| 183 | public Object get( Object obj ) | ||
| 184 | { | ||
| 185 | if( obj instanceof String ) | ||
| 186 | { | ||
| 187 | entries.add( new ClassEntry( (String)obj ) ); | ||
| 188 | } | ||
| 189 | return null; | ||
| 190 | } | ||
| 191 | private static final long serialVersionUID = -202160293602070641L; | ||
| 192 | }; | ||
| 193 | c.replaceClassName( map ); | ||
| 194 | return entries; | ||
| 195 | } | 143 | } |
| 196 | } | 144 | } |