summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/bytecode/InnerClassWriter.java
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/cuchaz/enigma/bytecode/InnerClassWriter.java42
1 files changed, 20 insertions, 22 deletions
diff --git a/src/cuchaz/enigma/bytecode/InnerClassWriter.java b/src/cuchaz/enigma/bytecode/InnerClassWriter.java
index b0e33ac..c412b1a 100644
--- a/src/cuchaz/enigma/bytecode/InnerClassWriter.java
+++ b/src/cuchaz/enigma/bytecode/InnerClassWriter.java
@@ -18,16 +18,14 @@ import javassist.bytecode.ConstPool;
18import javassist.bytecode.Descriptor; 18import javassist.bytecode.Descriptor;
19import javassist.bytecode.InnerClassesAttribute; 19import javassist.bytecode.InnerClassesAttribute;
20import cuchaz.enigma.analysis.JarIndex; 20import cuchaz.enigma.analysis.JarIndex;
21import cuchaz.enigma.mapping.Translator; 21import cuchaz.enigma.mapping.ClassEntry;
22 22
23public class InnerClassWriter 23public class InnerClassWriter
24{ 24{
25 private Translator m_deobfuscatingTranslator;
26 private JarIndex m_jarIndex; 25 private JarIndex m_jarIndex;
27 26
28 public InnerClassWriter( Translator deobfuscatingTranslator, JarIndex jarIndex ) 27 public InnerClassWriter( JarIndex jarIndex )
29 { 28 {
30 m_deobfuscatingTranslator = deobfuscatingTranslator;
31 m_jarIndex = jarIndex; 29 m_jarIndex = jarIndex;
32 } 30 }
33 31
@@ -44,7 +42,8 @@ public class InnerClassWriter
44 else 42 else
45 { 43 {
46 // this is an inner class, rename it to outer$inner 44 // this is an inner class, rename it to outer$inner
47 c.setName( obfOuterClassName + "$" + obfClassName ); 45 ClassEntry obfClassEntry = new ClassEntry( obfOuterClassName + "$" + obfClassName );
46 c.setName( obfClassEntry.getName() );
48 } 47 }
49 48
50 // write the inner classes if needed 49 // write the inner classes if needed
@@ -62,31 +61,20 @@ public class InnerClassWriter
62 for( String obfInnerClassName : obfInnerClassNames ) 61 for( String obfInnerClassName : obfInnerClassNames )
63 { 62 {
64 // deobfuscate the class names 63 // deobfuscate the class names
65 String deobfOuterClassName = m_deobfuscatingTranslator.translateClass( obfOuterClassName ); 64 ClassEntry obfClassEntry = new ClassEntry( obfOuterClassName + "$" + obfInnerClassName );
66 if( deobfOuterClassName == null ) 65
67 {
68 deobfOuterClassName = obfOuterClassName;
69 }
70 String obfOuterInnerClassName = obfOuterClassName + "$" + obfInnerClassName;
71 String deobfOuterInnerClassName = m_deobfuscatingTranslator.translateClass( obfOuterInnerClassName );
72 if( deobfOuterInnerClassName == null )
73 {
74 deobfOuterInnerClassName = obfOuterInnerClassName;
75 }
76 String deobfInnerClassName = deobfOuterInnerClassName.substring( deobfOuterInnerClassName.lastIndexOf( '$' ) + 1 );
77
78 // here's what the JVM spec says about the InnerClasses attribute 66 // here's what the JVM spec says about the InnerClasses attribute
79 // append( inner, outer of inner if inner is member of outer 0 ow, name after $ if inner not anonymous 0 ow, flags ); 67 // append( inner, outer of inner if inner is member of outer 0 ow, name after $ if inner not anonymous 0 ow, flags );
80 68
81 // update the attribute with this inner class 69 // update the attribute with this inner class
82 ConstPool constPool = c.getClassFile().getConstPool(); 70 ConstPool constPool = c.getClassFile().getConstPool();
83 int innerClassIndex = constPool.addClassInfo( deobfOuterInnerClassName ); 71 int innerClassIndex = constPool.addClassInfo( obfClassEntry.getName() );
84 int outerClassIndex = 0; 72 int outerClassIndex = 0;
85 int innerClassSimpleNameIndex = 0; 73 int innerClassSimpleNameIndex = 0;
86 if( !m_jarIndex.isAnonymousClass( obfInnerClassName ) ) 74 if( !m_jarIndex.isAnonymousClass( obfInnerClassName ) )
87 { 75 {
88 outerClassIndex = constPool.addClassInfo( deobfOuterClassName ); 76 outerClassIndex = constPool.addClassInfo( obfClassEntry.getOuterClassName() );
89 innerClassSimpleNameIndex = constPool.addUtf8Info( deobfInnerClassName ); 77 innerClassSimpleNameIndex = constPool.addUtf8Info( obfClassEntry.getInnerClassName() );
90 } 78 }
91 79
92 attr.append( 80 attr.append(
@@ -96,8 +84,18 @@ public class InnerClassWriter
96 c.getClassFile().getAccessFlags() & ~AccessFlag.SUPER 84 c.getClassFile().getAccessFlags() & ~AccessFlag.SUPER
97 ); 85 );
98 86
87 /* DEBUG
88 System.out.println( String.format( "\tOBF: %s -> ATTR: %s,%s,%s (replace %s with %s)",
89 obfClassEntry,
90 attr.outerClass( attr.tableLength() - 1 ),
91 attr.innerClass( attr.tableLength() - 1 ),
92 attr.innerName( attr.tableLength() - 1 ),
93 obfInnerClassName, obfClassEntry.getName()
94 ) );
95 */
96
99 // make sure the outer class references only the new inner class names 97 // make sure the outer class references only the new inner class names
100 c.replaceClassName( obfInnerClassName, deobfOuterInnerClassName ); 98 c.replaceClassName( obfInnerClassName, obfClassEntry.getName() );
101 } 99 }
102 } 100 }
103} 101}