diff options
| author | 2014-08-18 00:55:30 -0400 | |
|---|---|---|
| committer | 2014-08-18 00:55:30 -0400 | |
| commit | 34c1e8e64ec4575527a19fb4cb0640c57da784db (patch) | |
| tree | 44e3f1d50f8d8b8a9ab7c26dd94b58cba750cc67 /src/cuchaz/enigma/bytecode/InnerClassWriter.java | |
| parent | added support for automatic reconstruction of inner and anonymous classes (diff) | |
| download | enigma-fork-34c1e8e64ec4575527a19fb4cb0640c57da784db.tar.gz enigma-fork-34c1e8e64ec4575527a19fb4cb0640c57da784db.tar.xz enigma-fork-34c1e8e64ec4575527a19fb4cb0640c57da784db.zip | |
crap-ton of bug fixes for inner classes
Diffstat (limited to 'src/cuchaz/enigma/bytecode/InnerClassWriter.java')
| -rw-r--r-- | src/cuchaz/enigma/bytecode/InnerClassWriter.java | 42 |
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; | |||
| 18 | import javassist.bytecode.Descriptor; | 18 | import javassist.bytecode.Descriptor; |
| 19 | import javassist.bytecode.InnerClassesAttribute; | 19 | import javassist.bytecode.InnerClassesAttribute; |
| 20 | import cuchaz.enigma.analysis.JarIndex; | 20 | import cuchaz.enigma.analysis.JarIndex; |
| 21 | import cuchaz.enigma.mapping.Translator; | 21 | import cuchaz.enigma.mapping.ClassEntry; |
| 22 | 22 | ||
| 23 | public class InnerClassWriter | 23 | public 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 | } |