From 029f65d110279288f4cad7fb7cfaa33efd0f207d Mon Sep 17 00:00:00 2001 From: jeff Date: Thu, 28 Aug 2014 19:34:17 -0400 Subject: Show public/protected/private access on field/method/constructor references --- src/cuchaz/enigma/analysis/Access.java | 51 ++++++++++++++++++++++ .../enigma/analysis/BehaviorReferenceTreeNode.java | 8 ++-- .../enigma/analysis/FieldReferenceTreeNode.java | 12 ++--- src/cuchaz/enigma/analysis/JarIndex.java | 31 +++++++++++-- src/cuchaz/enigma/gui/Gui.java | 1 + 5 files changed, 92 insertions(+), 11 deletions(-) create mode 100644 src/cuchaz/enigma/analysis/Access.java diff --git a/src/cuchaz/enigma/analysis/Access.java b/src/cuchaz/enigma/analysis/Access.java new file mode 100644 index 0000000..e35bb21 --- /dev/null +++ b/src/cuchaz/enigma/analysis/Access.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * 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.analysis; + +import java.lang.reflect.Modifier; + +import javassist.CtBehavior; +import javassist.CtField; + +public enum Access +{ + Public, + Protected, + Private; + + public static Access get( CtBehavior behavior ) + { + return get( behavior.getModifiers() ); + } + + public static Access get( CtField field ) + { + return get( field.getModifiers() ); + } + + public static Access get( int modifiers ) + { + if( Modifier.isPublic( modifiers ) ) + { + return Public; + } + else if( Modifier.isProtected( modifiers ) ) + { + return Protected; + } + else if( Modifier.isPrivate( modifiers ) ) + { + return Private; + } + // assume public by default + return Public; + } +} \ No newline at end of file diff --git a/src/cuchaz/enigma/analysis/BehaviorReferenceTreeNode.java b/src/cuchaz/enigma/analysis/BehaviorReferenceTreeNode.java index 0f7e7f7..20f1d47 100644 --- a/src/cuchaz/enigma/analysis/BehaviorReferenceTreeNode.java +++ b/src/cuchaz/enigma/analysis/BehaviorReferenceTreeNode.java @@ -28,6 +28,7 @@ public class BehaviorReferenceTreeNode extends DefaultMutableTreeNode implements private Translator m_deobfuscatingTranslator; private BehaviorEntry m_entry; private EntryReference m_reference; + private Access m_access; public BehaviorReferenceTreeNode( Translator deobfuscatingTranslator, BehaviorEntry entry ) { @@ -36,11 +37,12 @@ public class BehaviorReferenceTreeNode extends DefaultMutableTreeNode implements m_reference = null; } - public BehaviorReferenceTreeNode( Translator deobfuscatingTranslator, EntryReference reference ) + public BehaviorReferenceTreeNode( Translator deobfuscatingTranslator, EntryReference reference, Access access ) { m_deobfuscatingTranslator = deobfuscatingTranslator; m_entry = reference.entry; m_reference = reference; + m_access = access; } @Override @@ -60,7 +62,7 @@ public class BehaviorReferenceTreeNode extends DefaultMutableTreeNode implements { if( m_reference != null ) { - return m_deobfuscatingTranslator.translateEntry( m_reference.context ).toString(); + return String.format( "%s (%s)", m_deobfuscatingTranslator.translateEntry( m_reference.context ), m_access ); } return m_deobfuscatingTranslator.translateEntry( m_entry ).toString(); } @@ -70,7 +72,7 @@ public class BehaviorReferenceTreeNode extends DefaultMutableTreeNode implements // get all the child nodes for( EntryReference reference : index.getBehaviorReferences( m_entry ) ) { - add( new BehaviorReferenceTreeNode( m_deobfuscatingTranslator, reference ) ); + add( new BehaviorReferenceTreeNode( m_deobfuscatingTranslator, reference, index.getAccess( m_entry ) ) ); } if( recurse && children != null ) diff --git a/src/cuchaz/enigma/analysis/FieldReferenceTreeNode.java b/src/cuchaz/enigma/analysis/FieldReferenceTreeNode.java index 94d0da7..2652f64 100644 --- a/src/cuchaz/enigma/analysis/FieldReferenceTreeNode.java +++ b/src/cuchaz/enigma/analysis/FieldReferenceTreeNode.java @@ -23,7 +23,8 @@ public class FieldReferenceTreeNode extends DefaultMutableTreeNode implements Re private Translator m_deobfuscatingTranslator; private FieldEntry m_entry; private EntryReference m_reference; - + private Access m_access; + public FieldReferenceTreeNode( Translator deobfuscatingTranslator, FieldEntry entry ) { m_deobfuscatingTranslator = deobfuscatingTranslator; @@ -31,11 +32,12 @@ public class FieldReferenceTreeNode extends DefaultMutableTreeNode implements Re m_reference = null; } - private FieldReferenceTreeNode( Translator deobfuscatingTranslator, EntryReference reference ) + private FieldReferenceTreeNode( Translator deobfuscatingTranslator, EntryReference reference, Access access ) { m_deobfuscatingTranslator = deobfuscatingTranslator; m_entry = reference.entry; m_reference = reference; + m_access = access; } @Override @@ -55,7 +57,7 @@ public class FieldReferenceTreeNode extends DefaultMutableTreeNode implements Re { if( m_reference != null ) { - return m_deobfuscatingTranslator.translateEntry( m_reference.context ).toString(); + return String.format( "%s (%s)", m_deobfuscatingTranslator.translateEntry( m_reference.context ), m_access ); } return m_deobfuscatingTranslator.translateEntry( m_entry ).toString(); } @@ -67,14 +69,14 @@ public class FieldReferenceTreeNode extends DefaultMutableTreeNode implements Re { for( EntryReference reference : index.getFieldReferences( m_entry ) ) { - add( new FieldReferenceTreeNode( m_deobfuscatingTranslator, reference ) ); + add( new FieldReferenceTreeNode( m_deobfuscatingTranslator, reference, index.getAccess( m_entry ) ) ); } } else { for( EntryReference reference : index.getBehaviorReferences( m_reference.context ) ) { - add( new BehaviorReferenceTreeNode( m_deobfuscatingTranslator, reference ) ); + add( new BehaviorReferenceTreeNode( m_deobfuscatingTranslator, reference, index.getAccess( m_reference.context ) ) ); } } diff --git a/src/cuchaz/enigma/analysis/JarIndex.java b/src/cuchaz/enigma/analysis/JarIndex.java index 947453e..deacf16 100644 --- a/src/cuchaz/enigma/analysis/JarIndex.java +++ b/src/cuchaz/enigma/analysis/JarIndex.java @@ -23,6 +23,7 @@ import javassist.CannotCompileException; import javassist.CtBehavior; import javassist.CtClass; import javassist.CtConstructor; +import javassist.CtField; import javassist.CtMethod; import javassist.NotFoundException; import javassist.bytecode.AccessFlag; @@ -55,6 +56,7 @@ public class JarIndex { private Set m_obfClassEntries; private Ancestries m_ancestries; + private Map m_access; private Multimap m_methodImplementations; private Multimap> m_behaviorReferences; private Multimap> m_fieldReferences; @@ -67,6 +69,7 @@ public class JarIndex { m_obfClassEntries = Sets.newHashSet(); m_ancestries = new Ancestries(); + m_access = Maps.newHashMap(); m_methodImplementations = HashMultimap.create(); m_behaviorReferences = HashMultimap.create(); m_fieldReferences = HashMultimap.create(); @@ -89,7 +92,24 @@ public class JarIndex m_obfClassEntries.add( classEntry ); } - // step 2: index the types, methods + // step 2: index method/field access + for( CtClass c : JarClassIterator.classes( jar ) ) + { + fixClass( c ); + ClassEntry classEntry = new ClassEntry( Descriptor.toJvmName( c.getName() ) ); + for( CtField field : c.getDeclaredFields() ) + { + FieldEntry fieldEntry = new FieldEntry( classEntry, field.getName() ); + m_access.put( fieldEntry, Access.get( field ) ); + } + for( CtBehavior behavior : c.getDeclaredBehaviors() ) + { + MethodEntry methodEntry = new MethodEntry( classEntry, behavior.getName(), behavior.getSignature() ); + m_access.put( methodEntry, Access.get( behavior ) ); + } + } + + // step 3: index the types, methods for( CtClass c : JarClassIterator.classes( jar ) ) { fixClass( c ); @@ -105,7 +125,7 @@ public class JarIndex } } - // step 3: index inner classes and anonymous classes + // step 4: index inner classes and anonymous classes for( CtClass c : JarClassIterator.classes( jar ) ) { fixClass( c ); @@ -132,7 +152,7 @@ public class JarIndex } } - // step 4: update other indices with inner class info + // step 5: update other indices with inner class info Map renames = Maps.newHashMap(); for( Map.Entry entry : m_outerClasses.entrySet() ) { @@ -522,6 +542,11 @@ public class JarIndex return m_ancestries; } + public Access getAccess( Entry entry ) + { + return m_access.get( entry ); + } + public boolean isMethodImplemented( MethodEntry methodEntry ) { Collection implementations = m_methodImplementations.get( methodEntry.getClassName() ); diff --git a/src/cuchaz/enigma/gui/Gui.java b/src/cuchaz/enigma/gui/Gui.java index 3ee8ade..ec0f842 100644 --- a/src/cuchaz/enigma/gui/Gui.java +++ b/src/cuchaz/enigma/gui/Gui.java @@ -189,6 +189,7 @@ public class Gui @Override public void uncaughtException( Thread thread, Throwable ex ) { + ex.printStackTrace( System.err ); CrashDialog.show( ex ); } } ); -- cgit v1.2.3