From 37467e4a7b5e05e4da413a1e06e597fa806b72e4 Mon Sep 17 00:00:00 2001 From: jeff Date: Fri, 15 Aug 2014 01:43:48 -0400 Subject: 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... --- src/cuchaz/enigma/bytecode/InnerClassWriter.java | 79 ++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 src/cuchaz/enigma/bytecode/InnerClassWriter.java (limited to 'src/cuchaz/enigma/bytecode/InnerClassWriter.java') 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 @@ +/******************************************************************************* + * Copyright (c) 2014 Jeff Martin. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Public License v3.0 + * which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/gpl.html + * + * Contributors: + * Jeff Martin - initial API and implementation + ******************************************************************************/ +package cuchaz.enigma.bytecode; + +import java.util.Collection; + +import javassist.CtClass; +import javassist.bytecode.AccessFlag; +import javassist.bytecode.Descriptor; +import javassist.bytecode.InnerClassesAttribute; +import cuchaz.enigma.analysis.JarIndex; +import cuchaz.enigma.mapping.Translator; + +public class InnerClassWriter +{ + private Translator m_deobfuscatingTranslator; + private JarIndex m_jarIndex; + + public InnerClassWriter( Translator deobfuscatingTranslator, JarIndex jarIndex ) + { + m_deobfuscatingTranslator = deobfuscatingTranslator; + m_jarIndex = jarIndex; + } + + public void writeInnerClasses( CtClass c ) + { + // is this an outer class with inner classes? + String obfOuterClassName = Descriptor.toJvmName( c.getName() ); + Collection obfInnerClassNames = m_jarIndex.getInnerClasses( obfOuterClassName ); + if( obfInnerClassNames != null && !obfInnerClassNames.isEmpty() ) + { + writeInnerClasses( c, obfInnerClassNames ); + } + } + + private void writeInnerClasses( CtClass c, Collection obfInnerClassNames ) + { + String obfOuterClassName = Descriptor.toJvmName( c.getName() ); + InnerClassesAttribute attr = new InnerClassesAttribute( c.getClassFile().getConstPool() ); + c.getClassFile().addAttribute( attr ); + for( String obfInnerClassName : obfInnerClassNames ) + { + // deobfuscate the class names + String deobfOuterClassName = m_deobfuscatingTranslator.translateClass( obfOuterClassName ); + if( deobfOuterClassName == null ) + { + deobfOuterClassName = obfOuterClassName; + } + String deobfInnerClassName = m_deobfuscatingTranslator.translateClass( obfInnerClassName ); + if( deobfInnerClassName == null ) + { + deobfInnerClassName = obfInnerClassName; + } + + // update the attribute + String deobfOuterInnerClassName = deobfOuterClassName + "$" + deobfInnerClassName; + attr.append( + deobfOuterInnerClassName, + deobfOuterClassName, + deobfInnerClassName, + c.getClassFile().getAccessFlags() & ~AccessFlag.SUPER + ); + + // make sure the outer class references only the new inner class names + c.replaceClassName( obfInnerClassName, deobfOuterInnerClassName ); + + // TEMP + System.out.println( "\tInner " + obfInnerClassName + " -> " + deobfOuterInnerClassName ); + } + } +} -- cgit v1.2.3