diff options
| author | 2014-08-15 01:43:48 -0400 | |
|---|---|---|
| committer | 2014-08-15 01:43:48 -0400 | |
| commit | 37467e4a7b5e05e4da413a1e06e597fa806b72e4 (patch) | |
| tree | 4c76a76aa3379fc236977646af48ec63dcf1712e /src/cuchaz/enigma/bytecode/InnerClassWriter.java | |
| parent | Added tag v0.1 beta for changeset 7beed0616320 (diff) | |
| download | enigma-fork-37467e4a7b5e05e4da413a1e06e597fa806b72e4.tar.gz enigma-fork-37467e4a7b5e05e4da413a1e06e597fa806b72e4.tar.xz enigma-fork-37467e4a7b5e05e4da413a1e06e597fa806b72e4.zip | |
trying to get inner/anonymous classes working... I have a working heuristic in place to detect anonymous classes, but I can't seem to get Procyon to decompile them correctly. I'm writing the InnerClasses attribute and translating all the inner class names, but there must be something else I'm missing...
Diffstat (limited to 'src/cuchaz/enigma/bytecode/InnerClassWriter.java')
| -rw-r--r-- | src/cuchaz/enigma/bytecode/InnerClassWriter.java | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/cuchaz/enigma/bytecode/InnerClassWriter.java b/src/cuchaz/enigma/bytecode/InnerClassWriter.java new file mode 100644 index 0000000..d4abe4e --- /dev/null +++ b/src/cuchaz/enigma/bytecode/InnerClassWriter.java | |||
| @@ -0,0 +1,79 @@ | |||
| 1 | /******************************************************************************* | ||
| 2 | * Copyright (c) 2014 Jeff Martin. | ||
| 3 | * All rights reserved. This program and the accompanying materials | ||
| 4 | * are made available under the terms of the GNU Public License v3.0 | ||
| 5 | * which accompanies this distribution, and is available at | ||
| 6 | * http://www.gnu.org/licenses/gpl.html | ||
| 7 | * | ||
| 8 | * Contributors: | ||
| 9 | * Jeff Martin - initial API and implementation | ||
| 10 | ******************************************************************************/ | ||
| 11 | package cuchaz.enigma.bytecode; | ||
| 12 | |||
| 13 | import java.util.Collection; | ||
| 14 | |||
| 15 | import javassist.CtClass; | ||
| 16 | import javassist.bytecode.AccessFlag; | ||
| 17 | import javassist.bytecode.Descriptor; | ||
| 18 | import javassist.bytecode.InnerClassesAttribute; | ||
| 19 | import cuchaz.enigma.analysis.JarIndex; | ||
| 20 | import cuchaz.enigma.mapping.Translator; | ||
| 21 | |||
| 22 | public class InnerClassWriter | ||
| 23 | { | ||
| 24 | private Translator m_deobfuscatingTranslator; | ||
| 25 | private JarIndex m_jarIndex; | ||
| 26 | |||
| 27 | public InnerClassWriter( Translator deobfuscatingTranslator, JarIndex jarIndex ) | ||
| 28 | { | ||
| 29 | m_deobfuscatingTranslator = deobfuscatingTranslator; | ||
| 30 | m_jarIndex = jarIndex; | ||
| 31 | } | ||
| 32 | |||
| 33 | public void writeInnerClasses( CtClass c ) | ||
| 34 | { | ||
| 35 | // is this an outer class with inner classes? | ||
| 36 | String obfOuterClassName = Descriptor.toJvmName( c.getName() ); | ||
| 37 | Collection<String> obfInnerClassNames = m_jarIndex.getInnerClasses( obfOuterClassName ); | ||
| 38 | if( obfInnerClassNames != null && !obfInnerClassNames.isEmpty() ) | ||
| 39 | { | ||
| 40 | writeInnerClasses( c, obfInnerClassNames ); | ||
| 41 | } | ||
| 42 | } | ||
| 43 | |||
| 44 | private void writeInnerClasses( CtClass c, Collection<String> obfInnerClassNames ) | ||
| 45 | { | ||
| 46 | String obfOuterClassName = Descriptor.toJvmName( c.getName() ); | ||
| 47 | InnerClassesAttribute attr = new InnerClassesAttribute( c.getClassFile().getConstPool() ); | ||
| 48 | c.getClassFile().addAttribute( attr ); | ||
| 49 | for( String obfInnerClassName : obfInnerClassNames ) | ||
| 50 | { | ||
| 51 | // deobfuscate the class names | ||
| 52 | String deobfOuterClassName = m_deobfuscatingTranslator.translateClass( obfOuterClassName ); | ||
| 53 | if( deobfOuterClassName == null ) | ||
| 54 | { | ||
| 55 | deobfOuterClassName = obfOuterClassName; | ||
| 56 | } | ||
| 57 | String deobfInnerClassName = m_deobfuscatingTranslator.translateClass( obfInnerClassName ); | ||
| 58 | if( deobfInnerClassName == null ) | ||
| 59 | { | ||
| 60 | deobfInnerClassName = obfInnerClassName; | ||
| 61 | } | ||
| 62 | |||
| 63 | // update the attribute | ||
| 64 | String deobfOuterInnerClassName = deobfOuterClassName + "$" + deobfInnerClassName; | ||
| 65 | attr.append( | ||
| 66 | deobfOuterInnerClassName, | ||
| 67 | deobfOuterClassName, | ||
| 68 | deobfInnerClassName, | ||
| 69 | c.getClassFile().getAccessFlags() & ~AccessFlag.SUPER | ||
| 70 | ); | ||
| 71 | |||
| 72 | // make sure the outer class references only the new inner class names | ||
| 73 | c.replaceClassName( obfInnerClassName, deobfOuterInnerClassName ); | ||
| 74 | |||
| 75 | // TEMP | ||
| 76 | System.out.println( "\tInner " + obfInnerClassName + " -> " + deobfOuterInnerClassName ); | ||
| 77 | } | ||
| 78 | } | ||
| 79 | } | ||