From 22b6c861df68557352fb5a87948f3e065f395ef3 Mon Sep 17 00:00:00 2001 From: jeff Date: Sun, 10 Aug 2014 22:13:01 -0400 Subject: refactored to remove ClassFile class to prep for upcoming stack navigation. It wasn't really necessary anymore. --- src/cuchaz/enigma/ClassFile.java | 41 -------------- src/cuchaz/enigma/Deobfuscator.java | 25 ++++----- .../enigma/gui/ClassInheritanceTreeNode.java | 2 +- src/cuchaz/enigma/gui/ClassListCellRenderer.java | 38 +++++++++++++ src/cuchaz/enigma/gui/ClassSelectionListener.java | 18 ------- .../gui/DeobfuscatedClassListCellRenderer.java | 43 --------------- src/cuchaz/enigma/gui/Gui.java | 63 +++++++++++----------- src/cuchaz/enigma/gui/GuiController.java | 37 ++++--------- .../gui/ObfuscatedClassListCellRenderer.java | 42 --------------- src/cuchaz/enigma/mapping/ArgumentEntry.java | 1 + src/cuchaz/enigma/mapping/ClassEntry.java | 6 +++ src/cuchaz/enigma/mapping/Entry.java | 1 + src/cuchaz/enigma/mapping/FieldEntry.java | 1 + src/cuchaz/enigma/mapping/MethodEntry.java | 1 + 14 files changed, 101 insertions(+), 218 deletions(-) delete mode 100644 src/cuchaz/enigma/ClassFile.java create mode 100644 src/cuchaz/enigma/gui/ClassListCellRenderer.java delete mode 100644 src/cuchaz/enigma/gui/ClassSelectionListener.java delete mode 100644 src/cuchaz/enigma/gui/DeobfuscatedClassListCellRenderer.java delete mode 100644 src/cuchaz/enigma/gui/ObfuscatedClassListCellRenderer.java (limited to 'src') diff --git a/src/cuchaz/enigma/ClassFile.java b/src/cuchaz/enigma/ClassFile.java deleted file mode 100644 index 043558d0..00000000 --- a/src/cuchaz/enigma/ClassFile.java +++ /dev/null @@ -1,41 +0,0 @@ -/******************************************************************************* - * 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; - - -public class ClassFile -{ - private String m_name; - - public ClassFile( String name ) - { - if( name.indexOf( '.' ) >= 0 ) - { - throw new IllegalArgumentException( "Class name should be in JVM format!" ); - } - m_name = name; - } - - public String getName( ) - { - return m_name; - } - - public String getPath( ) - { - return m_name.replace( ".", "/" ) + ".class"; - } - - public boolean isInPackage( ) - { - return m_name.indexOf( '/' ) >= 0; - } -} diff --git a/src/cuchaz/enigma/Deobfuscator.java b/src/cuchaz/enigma/Deobfuscator.java index 16c11d3f..8d4394cd 100644 --- a/src/cuchaz/enigma/Deobfuscator.java +++ b/src/cuchaz/enigma/Deobfuscator.java @@ -17,7 +17,6 @@ import java.io.InputStream; import java.io.StringWriter; import java.util.Enumeration; import java.util.List; -import java.util.Map; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -139,43 +138,41 @@ public class Deobfuscator return m_mappings.getTranslator( m_ancestries, direction ); } - public void getSeparatedClasses( List obfClasses, Map deobfClasses ) + public void getSeparatedClasses( List obfClasses, List deobfClasses ) { for( String obfClassName : m_obfClassNames ) { - ClassFile classFile = new ClassFile( obfClassName ); - // separate the classes - ClassMapping classMapping = m_mappings.getClassByObf( classFile.getName() ); + ClassMapping classMapping = m_mappings.getClassByObf( obfClassName ); if( classMapping != null ) { - deobfClasses.put( classFile, classMapping.getDeobfName() ); + deobfClasses.add( classMapping.getDeobfName() ); } - else if( classFile.isInPackage() ) + else if( obfClassName.indexOf( '/' ) >= 0 ) { - deobfClasses.put( classFile, classFile.getName() ); + // this class is in a package and therefore is not obfuscated + deobfClasses.add( obfClassName ); } else { - obfClasses.add( classFile ); + obfClasses.add( obfClassName ); } } } - public SourceIndex getSource( final ClassFile classFile ) + public SourceIndex getSource( String className ) { // is this class deobfuscated? // we need to tell the decompiler the deobfuscated name so it doesn't get freaked out // the decompiler only sees the deobfuscated class, so we need to load it by the deobfuscated name - String deobfName = classFile.getName(); - ClassMapping classMapping = m_mappings.getClassByObf( classFile.getName() ); + ClassMapping classMapping = m_mappings.getClassByObf( className ); if( classMapping != null ) { - deobfName = classMapping.getDeobfName(); + className = classMapping.getDeobfName(); } // decompile it! - TypeDefinition resolvedType = new MetadataSystem( m_settings.getTypeLoader() ).lookupType( deobfName ).resolve(); + TypeDefinition resolvedType = new MetadataSystem( m_settings.getTypeLoader() ).lookupType( className ).resolve(); DecompilerContext context = new DecompilerContext(); context.setCurrentType( resolvedType ); context.setSettings( m_settings ); diff --git a/src/cuchaz/enigma/gui/ClassInheritanceTreeNode.java b/src/cuchaz/enigma/gui/ClassInheritanceTreeNode.java index 61e582df..295bebe4 100644 --- a/src/cuchaz/enigma/gui/ClassInheritanceTreeNode.java +++ b/src/cuchaz/enigma/gui/ClassInheritanceTreeNode.java @@ -62,7 +62,7 @@ public class ClassInheritanceTreeNode extends DefaultMutableTreeNode nodes.add( new ClassInheritanceTreeNode( m_deobfuscatingTranslator, subclassName ) ); } - // add then to this node + // add them to this node for( ClassInheritanceTreeNode node : nodes ) { this.add( node ); diff --git a/src/cuchaz/enigma/gui/ClassListCellRenderer.java b/src/cuchaz/enigma/gui/ClassListCellRenderer.java new file mode 100644 index 00000000..d9d65788 --- /dev/null +++ b/src/cuchaz/enigma/gui/ClassListCellRenderer.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * 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.gui; + +import java.awt.Component; + +import javassist.bytecode.Descriptor; + +import javax.swing.DefaultListCellRenderer; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.ListCellRenderer; + +public class ClassListCellRenderer implements ListCellRenderer +{ + private DefaultListCellRenderer m_defaultRenderer; + + public ClassListCellRenderer( ) + { + m_defaultRenderer = new DefaultListCellRenderer(); + } + + @Override + public Component getListCellRendererComponent( JList list, String className, int index, boolean isSelected, boolean hasFocus ) + { + JLabel label = (JLabel)m_defaultRenderer.getListCellRendererComponent( list, className, index, isSelected, hasFocus ); + label.setText( Descriptor.toJavaName( className ) ); + return label; + } +} diff --git a/src/cuchaz/enigma/gui/ClassSelectionListener.java b/src/cuchaz/enigma/gui/ClassSelectionListener.java deleted file mode 100644 index 4a2aa8d0..00000000 --- a/src/cuchaz/enigma/gui/ClassSelectionListener.java +++ /dev/null @@ -1,18 +0,0 @@ -/******************************************************************************* - * 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.gui; - -import cuchaz.enigma.ClassFile; - -public interface ClassSelectionListener -{ - void classSelected( ClassFile classFile ); -} diff --git a/src/cuchaz/enigma/gui/DeobfuscatedClassListCellRenderer.java b/src/cuchaz/enigma/gui/DeobfuscatedClassListCellRenderer.java deleted file mode 100644 index 3a8729d2..00000000 --- a/src/cuchaz/enigma/gui/DeobfuscatedClassListCellRenderer.java +++ /dev/null @@ -1,43 +0,0 @@ -/******************************************************************************* - * 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.gui; - -import java.awt.Component; -import java.util.Map; - -import javassist.bytecode.Descriptor; - -import javax.swing.DefaultListCellRenderer; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.ListCellRenderer; - -import cuchaz.enigma.ClassFile; - -public class DeobfuscatedClassListCellRenderer implements ListCellRenderer> -{ - private DefaultListCellRenderer m_defaultRenderer; - - public DeobfuscatedClassListCellRenderer( ) - { - m_defaultRenderer = new DefaultListCellRenderer(); - } - - @Override - public Component getListCellRendererComponent( JList> list, Map.Entry entry, int index, boolean isSelected, boolean hasFocus ) - { - JLabel label = (JLabel)m_defaultRenderer.getListCellRendererComponent( list, entry, index, isSelected, hasFocus ); - - label.setText( Descriptor.toJavaName( entry.getValue() ) ); - - return label; - } -} diff --git a/src/cuchaz/enigma/gui/Gui.java b/src/cuchaz/enigma/gui/Gui.java index bf72c85d..6666b4c4 100644 --- a/src/cuchaz/enigma/gui/Gui.java +++ b/src/cuchaz/enigma/gui/Gui.java @@ -31,7 +31,6 @@ import java.io.IOException; import java.util.Collections; import java.util.Comparator; import java.util.List; -import java.util.Map; import java.util.Vector; import javax.swing.BorderFactory; @@ -66,7 +65,6 @@ import jsyntaxpane.DefaultSyntaxKit; import com.google.common.collect.Lists; -import cuchaz.enigma.ClassFile; import cuchaz.enigma.Constants; import cuchaz.enigma.analysis.Token; import cuchaz.enigma.mapping.ArgumentEntry; @@ -79,35 +77,34 @@ import cuchaz.enigma.mapping.MethodEntry; public class Gui { - private static Comparator m_obfuscatedClassSorter; - private static Comparator> m_deobfuscatedClassSorter; + private static Comparator m_obfClassSorter; + private static Comparator m_deobfClassSorter; static { - m_obfuscatedClassSorter = new Comparator( ) + m_obfClassSorter = new Comparator( ) { @Override - public int compare( ClassFile a, ClassFile b ) + public int compare( String a, String b ) { - if( a.getName().length() != b.getName().length() ) + if( a.length() != b.length() ) { - return a.getName().length() - b.getName().length(); + return a.length() - b.length(); } - - return a.getName().compareTo( b.getName() ); + return a.compareTo( b ); } }; - m_deobfuscatedClassSorter = new Comparator>( ) + m_deobfClassSorter = new Comparator( ) { @Override - public int compare( Map.Entry a, Map.Entry b ) + public int compare( String a, String b ) { // I can never keep this rule straight when writing these damn things... // a < b => -1, a == b => 0, a > b => +1 - String[] aparts = a.getValue().split( "\\." ); - String[] bparts = b.getValue().split( "\\." ); + String[] aparts = a.split( "\\." ); + String[] bparts = b.split( "\\." ); for( int i=0; true; i++ ) { if( i >= aparts.length ) @@ -133,8 +130,8 @@ public class Gui // controls private JFrame m_frame; - private JList m_obfClasses; - private JList> m_deobfClasses; + private JList m_obfClasses; + private JList m_deobfClasses; private JEditorPane m_editor; private JPanel m_infoPanel; private BoxHighlightPainter m_obfuscatedHighlightPainter; @@ -170,10 +167,10 @@ public class Gui pane.setLayout( new BorderLayout() ); // init obfuscated classes list - m_obfClasses = new JList(); + m_obfClasses = new JList(); m_obfClasses.setSelectionMode( ListSelectionModel.SINGLE_SELECTION ); m_obfClasses.setLayoutOrientation( JList.VERTICAL ); - m_obfClasses.setCellRenderer( new ObfuscatedClassListCellRenderer() ); + m_obfClasses.setCellRenderer( new ClassListCellRenderer() ); m_obfClasses.addMouseListener( new MouseAdapter() { @Override @@ -181,10 +178,10 @@ public class Gui { if( event.getClickCount() == 2 ) { - ClassFile selected = m_obfClasses.getSelectedValue(); + String selected = m_obfClasses.getSelectedValue(); if( selected != null ) { - m_controller.deobfuscateClass( selected ); + m_controller.openEntry( new ClassEntry( selected ) ); } } } @@ -196,10 +193,10 @@ public class Gui obfPanel.add( obfScroller, BorderLayout.CENTER ); // init deobfuscated classes list - m_deobfClasses = new JList>(); + m_deobfClasses = new JList(); m_deobfClasses.setSelectionMode( ListSelectionModel.SINGLE_SELECTION ); m_deobfClasses.setLayoutOrientation( JList.VERTICAL ); - m_deobfClasses.setCellRenderer( new DeobfuscatedClassListCellRenderer() ); + m_deobfClasses.setCellRenderer( new ClassListCellRenderer() ); m_deobfClasses.addMouseListener( new MouseAdapter() { @Override @@ -207,10 +204,10 @@ public class Gui { if( event.getClickCount() == 2 ) { - Map.Entry selected = m_deobfClasses.getSelectedValue(); + String selected = m_deobfClasses.getSelectedValue(); if( selected != null ) { - m_controller.deobfuscateClass( selected.getKey() ); + m_controller.openEntry( new ClassEntry( selected ) ); } } } @@ -330,7 +327,7 @@ public class Gui ClassInheritanceTreeNode node = (ClassInheritanceTreeNode)m_inheritanceTree.getSelectionPath().getLastPathComponent(); if( node != null ) { - m_controller.deobfuscateClass( new ClassFile( node.getObfClassName() ) ); + m_controller.openEntry( new ClassEntry( node.getDeobfClassName() ) ); } } } @@ -566,31 +563,31 @@ public class Gui m_closeMappingsMenu.setEnabled( false ); } - public void setObfClasses( List obfClasses ) + public void setObfClasses( List obfClasses ) { if( obfClasses != null ) { - Vector sortedClasses = new Vector( obfClasses ); - Collections.sort( sortedClasses, m_obfuscatedClassSorter ); + Vector sortedClasses = new Vector( obfClasses ); + Collections.sort( sortedClasses, m_obfClassSorter ); m_obfClasses.setListData( sortedClasses ); } else { - m_obfClasses.setListData( new Vector() ); + m_obfClasses.setListData( new Vector() ); } } - public void setDeobfClasses( Map deobfClasses ) + public void setDeobfClasses( List deobfClasses ) { if( deobfClasses != null ) { - Vector> sortedClasses = new Vector>( deobfClasses.entrySet() ); - Collections.sort( sortedClasses, m_deobfuscatedClassSorter ); + Vector sortedClasses = new Vector( deobfClasses ); + Collections.sort( sortedClasses, m_deobfClassSorter ); m_deobfClasses.setListData( sortedClasses ); } else { - m_deobfClasses.setListData( new Vector>() ); + m_deobfClasses.setListData( new Vector() ); } } diff --git a/src/cuchaz/enigma/gui/GuiController.java b/src/cuchaz/enigma/gui/GuiController.java index 834afecc..6a7a7da6 100644 --- a/src/cuchaz/enigma/gui/GuiController.java +++ b/src/cuchaz/enigma/gui/GuiController.java @@ -15,12 +15,9 @@ import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.List; -import java.util.Map; import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import cuchaz.enigma.ClassFile; import cuchaz.enigma.Deobfuscator; import cuchaz.enigma.analysis.SourceIndex; import cuchaz.enigma.analysis.Token; @@ -37,7 +34,7 @@ public class GuiController private Deobfuscator m_deobfuscator; private Gui m_gui; private SourceIndex m_index; - private ClassFile m_currentFile; + private ClassEntry m_currentClass; private boolean m_isDirty; public GuiController( Gui gui ) @@ -45,7 +42,7 @@ public class GuiController m_gui = gui; m_deobfuscator = null; m_index = null; - m_currentFile = null; + m_currentClass = null; m_isDirty = false; } @@ -97,12 +94,6 @@ public class GuiController refreshCurrentClass(); } - public void deobfuscateClass( ClassFile classFile ) - { - m_currentFile = classFile; - deobfuscate( m_currentFile ); - } - public Token getToken( int pos ) { if( m_index == null ) @@ -168,10 +159,10 @@ public class GuiController public void openEntry( Entry obfEntry ) { Entry deobfEntry = m_deobfuscator.deobfuscateEntry( obfEntry ); - if( !m_currentFile.getName().equals( obfEntry.getClassName() ) ) + if( m_currentClass == null || !m_currentClass.equals( deobfEntry.getClassEntry() ) ) { - m_currentFile = new ClassFile( obfEntry.getClassName() ); - deobfuscate( m_currentFile, deobfEntry ); + m_currentClass = new ClassEntry( obfEntry.getClassEntry() ); + deobfuscate( m_currentClass, deobfEntry ); } else { @@ -181,8 +172,8 @@ public class GuiController private void refreshClasses( ) { - List obfClasses = Lists.newArrayList(); - Map deobfClasses = Maps.newHashMap(); + List obfClasses = Lists.newArrayList(); + List deobfClasses = Lists.newArrayList(); m_deobfuscator.getSeparatedClasses( obfClasses, deobfClasses ); m_gui.setObfClasses( obfClasses ); m_gui.setDeobfClasses( deobfClasses ); @@ -195,20 +186,14 @@ public class GuiController private void refreshCurrentClass( Entry entryToShow ) { - if( m_currentFile != null ) + if( m_currentClass != null ) { - deobfuscate( m_currentFile, entryToShow ); + deobfuscate( m_currentClass, entryToShow ); } } - - private void deobfuscate( final ClassFile classFile ) - { - deobfuscate( classFile, null ); - } - private void deobfuscate( final ClassFile classFile, final Entry entryToShow ) + private void deobfuscate( final ClassEntry classEntry, final Entry entryToShow ) { - m_currentFile = classFile; m_gui.setSource( "(deobfuscating...)" ); // run the deobfuscator in a separate thread so we don't block the GUI event queue @@ -218,7 +203,7 @@ public class GuiController public void run( ) { // decompile,deobfuscate the bytecode - m_index = m_deobfuscator.getSource( classFile ); + m_index = m_deobfuscator.getSource( classEntry.getClassName() ); m_gui.setSource( m_index.getSource() ); if( entryToShow != null ) { diff --git a/src/cuchaz/enigma/gui/ObfuscatedClassListCellRenderer.java b/src/cuchaz/enigma/gui/ObfuscatedClassListCellRenderer.java deleted file mode 100644 index d46e1ae6..00000000 --- a/src/cuchaz/enigma/gui/ObfuscatedClassListCellRenderer.java +++ /dev/null @@ -1,42 +0,0 @@ -/******************************************************************************* - * 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.gui; - -import java.awt.Component; - -import javassist.bytecode.Descriptor; - -import javax.swing.DefaultListCellRenderer; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.ListCellRenderer; - -import cuchaz.enigma.ClassFile; - -public class ObfuscatedClassListCellRenderer implements ListCellRenderer -{ - private DefaultListCellRenderer m_defaultRenderer; - - public ObfuscatedClassListCellRenderer( ) - { - m_defaultRenderer = new DefaultListCellRenderer(); - } - - @Override - public Component getListCellRendererComponent( JList list, ClassFile classFile, int index, boolean isSelected, boolean hasFocus ) - { - JLabel label = (JLabel)m_defaultRenderer.getListCellRendererComponent( list, classFile, index, isSelected, hasFocus ); - - label.setText( Descriptor.toJavaName( classFile.getName() ) ); - - return label; - } -} diff --git a/src/cuchaz/enigma/mapping/ArgumentEntry.java b/src/cuchaz/enigma/mapping/ArgumentEntry.java index 0c25c4d3..27dcc41d 100644 --- a/src/cuchaz/enigma/mapping/ArgumentEntry.java +++ b/src/cuchaz/enigma/mapping/ArgumentEntry.java @@ -65,6 +65,7 @@ public class ArgumentEntry implements Entry, Serializable return m_name; } + @Override public ClassEntry getClassEntry( ) { return m_methodEntry.getClassEntry(); diff --git a/src/cuchaz/enigma/mapping/ClassEntry.java b/src/cuchaz/enigma/mapping/ClassEntry.java index 513862d9..738e8e3b 100644 --- a/src/cuchaz/enigma/mapping/ClassEntry.java +++ b/src/cuchaz/enigma/mapping/ClassEntry.java @@ -37,6 +37,12 @@ public class ClassEntry implements Entry, Serializable { m_name = other.m_name; } + + @Override + public ClassEntry getClassEntry( ) + { + return this; + } @Override public String getName( ) diff --git a/src/cuchaz/enigma/mapping/Entry.java b/src/cuchaz/enigma/mapping/Entry.java index 3ff80276..e1591f02 100644 --- a/src/cuchaz/enigma/mapping/Entry.java +++ b/src/cuchaz/enigma/mapping/Entry.java @@ -14,4 +14,5 @@ public interface Entry { String getName( ); String getClassName( ); + ClassEntry getClassEntry( ); } diff --git a/src/cuchaz/enigma/mapping/FieldEntry.java b/src/cuchaz/enigma/mapping/FieldEntry.java index 6148c84a..435490bd 100644 --- a/src/cuchaz/enigma/mapping/FieldEntry.java +++ b/src/cuchaz/enigma/mapping/FieldEntry.java @@ -49,6 +49,7 @@ public class FieldEntry implements Entry, Serializable m_name = other.m_name; } + @Override public ClassEntry getClassEntry( ) { return m_classEntry; diff --git a/src/cuchaz/enigma/mapping/MethodEntry.java b/src/cuchaz/enigma/mapping/MethodEntry.java index ff232c59..b4b9c9bf 100644 --- a/src/cuchaz/enigma/mapping/MethodEntry.java +++ b/src/cuchaz/enigma/mapping/MethodEntry.java @@ -56,6 +56,7 @@ public class MethodEntry implements Entry, Serializable m_signature = other.m_signature; } + @Override public ClassEntry getClassEntry( ) { return m_classEntry; -- cgit v1.2.3