summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/bytecode/InnerClassWriter.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/cuchaz/enigma/bytecode/InnerClassWriter.java')
-rw-r--r--src/cuchaz/enigma/bytecode/InnerClassWriter.java79
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 ******************************************************************************/
11package cuchaz.enigma.bytecode;
12
13import java.util.Collection;
14
15import javassist.CtClass;
16import javassist.bytecode.AccessFlag;
17import javassist.bytecode.Descriptor;
18import javassist.bytecode.InnerClassesAttribute;
19import cuchaz.enigma.analysis.JarIndex;
20import cuchaz.enigma.mapping.Translator;
21
22public 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}