summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/bytecode
diff options
context:
space:
mode:
authorGravatar jeff2014-08-15 01:43:48 -0400
committerGravatar jeff2014-08-15 01:43:48 -0400
commit37467e4a7b5e05e4da413a1e06e597fa806b72e4 (patch)
tree4c76a76aa3379fc236977646af48ec63dcf1712e /src/cuchaz/enigma/bytecode
parentAdded tag v0.1 beta for changeset 7beed0616320 (diff)
downloadenigma-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')
-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}