diff options
| -rw-r--r-- | src/cuchaz/enigma/analysis/Access.java | 51 | ||||
| -rw-r--r-- | src/cuchaz/enigma/analysis/BehaviorReferenceTreeNode.java | 8 | ||||
| -rw-r--r-- | src/cuchaz/enigma/analysis/FieldReferenceTreeNode.java | 12 | ||||
| -rw-r--r-- | src/cuchaz/enigma/analysis/JarIndex.java | 31 | ||||
| -rw-r--r-- | src/cuchaz/enigma/gui/Gui.java | 1 |
5 files changed, 92 insertions, 11 deletions
diff --git a/src/cuchaz/enigma/analysis/Access.java b/src/cuchaz/enigma/analysis/Access.java new file mode 100644 index 00000000..e35bb21b --- /dev/null +++ b/src/cuchaz/enigma/analysis/Access.java | |||
| @@ -0,0 +1,51 @@ | |||
| 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 | ******************************************************************************/ | ||
| 11 | package cuchaz.enigma.analysis; | ||
| 12 | |||
| 13 | import java.lang.reflect.Modifier; | ||
| 14 | |||
| 15 | import javassist.CtBehavior; | ||
| 16 | import javassist.CtField; | ||
| 17 | |||
| 18 | public enum Access | ||
| 19 | { | ||
| 20 | Public, | ||
| 21 | Protected, | ||
| 22 | Private; | ||
| 23 | |||
| 24 | public static Access get( CtBehavior behavior ) | ||
| 25 | { | ||
| 26 | return get( behavior.getModifiers() ); | ||
| 27 | } | ||
| 28 | |||
| 29 | public static Access get( CtField field ) | ||
| 30 | { | ||
| 31 | return get( field.getModifiers() ); | ||
| 32 | } | ||
| 33 | |||
| 34 | public static Access get( int modifiers ) | ||
| 35 | { | ||
| 36 | if( Modifier.isPublic( modifiers ) ) | ||
| 37 | { | ||
| 38 | return Public; | ||
| 39 | } | ||
| 40 | else if( Modifier.isProtected( modifiers ) ) | ||
| 41 | { | ||
| 42 | return Protected; | ||
| 43 | } | ||
| 44 | else if( Modifier.isPrivate( modifiers ) ) | ||
| 45 | { | ||
| 46 | return Private; | ||
| 47 | } | ||
| 48 | // assume public by default | ||
| 49 | return Public; | ||
| 50 | } | ||
| 51 | } \ No newline at end of file | ||
diff --git a/src/cuchaz/enigma/analysis/BehaviorReferenceTreeNode.java b/src/cuchaz/enigma/analysis/BehaviorReferenceTreeNode.java index 0f7e7f71..20f1d472 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 | |||
| 28 | private Translator m_deobfuscatingTranslator; | 28 | private Translator m_deobfuscatingTranslator; |
| 29 | private BehaviorEntry m_entry; | 29 | private BehaviorEntry m_entry; |
| 30 | private EntryReference<BehaviorEntry,BehaviorEntry> m_reference; | 30 | private EntryReference<BehaviorEntry,BehaviorEntry> m_reference; |
| 31 | private Access m_access; | ||
| 31 | 32 | ||
| 32 | public BehaviorReferenceTreeNode( Translator deobfuscatingTranslator, BehaviorEntry entry ) | 33 | public BehaviorReferenceTreeNode( Translator deobfuscatingTranslator, BehaviorEntry entry ) |
| 33 | { | 34 | { |
| @@ -36,11 +37,12 @@ public class BehaviorReferenceTreeNode extends DefaultMutableTreeNode implements | |||
| 36 | m_reference = null; | 37 | m_reference = null; |
| 37 | } | 38 | } |
| 38 | 39 | ||
| 39 | public BehaviorReferenceTreeNode( Translator deobfuscatingTranslator, EntryReference<BehaviorEntry,BehaviorEntry> reference ) | 40 | public BehaviorReferenceTreeNode( Translator deobfuscatingTranslator, EntryReference<BehaviorEntry,BehaviorEntry> reference, Access access ) |
| 40 | { | 41 | { |
| 41 | m_deobfuscatingTranslator = deobfuscatingTranslator; | 42 | m_deobfuscatingTranslator = deobfuscatingTranslator; |
| 42 | m_entry = reference.entry; | 43 | m_entry = reference.entry; |
| 43 | m_reference = reference; | 44 | m_reference = reference; |
| 45 | m_access = access; | ||
| 44 | } | 46 | } |
| 45 | 47 | ||
| 46 | @Override | 48 | @Override |
| @@ -60,7 +62,7 @@ public class BehaviorReferenceTreeNode extends DefaultMutableTreeNode implements | |||
| 60 | { | 62 | { |
| 61 | if( m_reference != null ) | 63 | if( m_reference != null ) |
| 62 | { | 64 | { |
| 63 | return m_deobfuscatingTranslator.translateEntry( m_reference.context ).toString(); | 65 | return String.format( "%s (%s)", m_deobfuscatingTranslator.translateEntry( m_reference.context ), m_access ); |
| 64 | } | 66 | } |
| 65 | return m_deobfuscatingTranslator.translateEntry( m_entry ).toString(); | 67 | return m_deobfuscatingTranslator.translateEntry( m_entry ).toString(); |
| 66 | } | 68 | } |
| @@ -70,7 +72,7 @@ public class BehaviorReferenceTreeNode extends DefaultMutableTreeNode implements | |||
| 70 | // get all the child nodes | 72 | // get all the child nodes |
| 71 | for( EntryReference<BehaviorEntry,BehaviorEntry> reference : index.getBehaviorReferences( m_entry ) ) | 73 | for( EntryReference<BehaviorEntry,BehaviorEntry> reference : index.getBehaviorReferences( m_entry ) ) |
| 72 | { | 74 | { |
| 73 | add( new BehaviorReferenceTreeNode( m_deobfuscatingTranslator, reference ) ); | 75 | add( new BehaviorReferenceTreeNode( m_deobfuscatingTranslator, reference, index.getAccess( m_entry ) ) ); |
| 74 | } | 76 | } |
| 75 | 77 | ||
| 76 | if( recurse && children != null ) | 78 | if( recurse && children != null ) |
diff --git a/src/cuchaz/enigma/analysis/FieldReferenceTreeNode.java b/src/cuchaz/enigma/analysis/FieldReferenceTreeNode.java index 94d0da7e..2652f64a 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 | |||
| 23 | private Translator m_deobfuscatingTranslator; | 23 | private Translator m_deobfuscatingTranslator; |
| 24 | private FieldEntry m_entry; | 24 | private FieldEntry m_entry; |
| 25 | private EntryReference<FieldEntry,BehaviorEntry> m_reference; | 25 | private EntryReference<FieldEntry,BehaviorEntry> m_reference; |
| 26 | 26 | private Access m_access; | |
| 27 | |||
| 27 | public FieldReferenceTreeNode( Translator deobfuscatingTranslator, FieldEntry entry ) | 28 | public FieldReferenceTreeNode( Translator deobfuscatingTranslator, FieldEntry entry ) |
| 28 | { | 29 | { |
| 29 | m_deobfuscatingTranslator = deobfuscatingTranslator; | 30 | m_deobfuscatingTranslator = deobfuscatingTranslator; |
| @@ -31,11 +32,12 @@ public class FieldReferenceTreeNode extends DefaultMutableTreeNode implements Re | |||
| 31 | m_reference = null; | 32 | m_reference = null; |
| 32 | } | 33 | } |
| 33 | 34 | ||
| 34 | private FieldReferenceTreeNode( Translator deobfuscatingTranslator, EntryReference<FieldEntry,BehaviorEntry> reference ) | 35 | private FieldReferenceTreeNode( Translator deobfuscatingTranslator, EntryReference<FieldEntry,BehaviorEntry> reference, Access access ) |
| 35 | { | 36 | { |
| 36 | m_deobfuscatingTranslator = deobfuscatingTranslator; | 37 | m_deobfuscatingTranslator = deobfuscatingTranslator; |
| 37 | m_entry = reference.entry; | 38 | m_entry = reference.entry; |
| 38 | m_reference = reference; | 39 | m_reference = reference; |
| 40 | m_access = access; | ||
| 39 | } | 41 | } |
| 40 | 42 | ||
| 41 | @Override | 43 | @Override |
| @@ -55,7 +57,7 @@ public class FieldReferenceTreeNode extends DefaultMutableTreeNode implements Re | |||
| 55 | { | 57 | { |
| 56 | if( m_reference != null ) | 58 | if( m_reference != null ) |
| 57 | { | 59 | { |
| 58 | return m_deobfuscatingTranslator.translateEntry( m_reference.context ).toString(); | 60 | return String.format( "%s (%s)", m_deobfuscatingTranslator.translateEntry( m_reference.context ), m_access ); |
| 59 | } | 61 | } |
| 60 | return m_deobfuscatingTranslator.translateEntry( m_entry ).toString(); | 62 | return m_deobfuscatingTranslator.translateEntry( m_entry ).toString(); |
| 61 | } | 63 | } |
| @@ -67,14 +69,14 @@ public class FieldReferenceTreeNode extends DefaultMutableTreeNode implements Re | |||
| 67 | { | 69 | { |
| 68 | for( EntryReference<FieldEntry,BehaviorEntry> reference : index.getFieldReferences( m_entry ) ) | 70 | for( EntryReference<FieldEntry,BehaviorEntry> reference : index.getFieldReferences( m_entry ) ) |
| 69 | { | 71 | { |
| 70 | add( new FieldReferenceTreeNode( m_deobfuscatingTranslator, reference ) ); | 72 | add( new FieldReferenceTreeNode( m_deobfuscatingTranslator, reference, index.getAccess( m_entry ) ) ); |
| 71 | } | 73 | } |
| 72 | } | 74 | } |
| 73 | else | 75 | else |
| 74 | { | 76 | { |
| 75 | for( EntryReference<BehaviorEntry,BehaviorEntry> reference : index.getBehaviorReferences( m_reference.context ) ) | 77 | for( EntryReference<BehaviorEntry,BehaviorEntry> reference : index.getBehaviorReferences( m_reference.context ) ) |
| 76 | { | 78 | { |
| 77 | add( new BehaviorReferenceTreeNode( m_deobfuscatingTranslator, reference ) ); | 79 | add( new BehaviorReferenceTreeNode( m_deobfuscatingTranslator, reference, index.getAccess( m_reference.context ) ) ); |
| 78 | } | 80 | } |
| 79 | } | 81 | } |
| 80 | 82 | ||
diff --git a/src/cuchaz/enigma/analysis/JarIndex.java b/src/cuchaz/enigma/analysis/JarIndex.java index 947453ef..deacf16d 100644 --- a/src/cuchaz/enigma/analysis/JarIndex.java +++ b/src/cuchaz/enigma/analysis/JarIndex.java | |||
| @@ -23,6 +23,7 @@ import javassist.CannotCompileException; | |||
| 23 | import javassist.CtBehavior; | 23 | import javassist.CtBehavior; |
| 24 | import javassist.CtClass; | 24 | import javassist.CtClass; |
| 25 | import javassist.CtConstructor; | 25 | import javassist.CtConstructor; |
| 26 | import javassist.CtField; | ||
| 26 | import javassist.CtMethod; | 27 | import javassist.CtMethod; |
| 27 | import javassist.NotFoundException; | 28 | import javassist.NotFoundException; |
| 28 | import javassist.bytecode.AccessFlag; | 29 | import javassist.bytecode.AccessFlag; |
| @@ -55,6 +56,7 @@ public class JarIndex | |||
| 55 | { | 56 | { |
| 56 | private Set<ClassEntry> m_obfClassEntries; | 57 | private Set<ClassEntry> m_obfClassEntries; |
| 57 | private Ancestries m_ancestries; | 58 | private Ancestries m_ancestries; |
| 59 | private Map<Entry,Access> m_access; | ||
| 58 | private Multimap<String,MethodEntry> m_methodImplementations; | 60 | private Multimap<String,MethodEntry> m_methodImplementations; |
| 59 | private Multimap<BehaviorEntry,EntryReference<BehaviorEntry,BehaviorEntry>> m_behaviorReferences; | 61 | private Multimap<BehaviorEntry,EntryReference<BehaviorEntry,BehaviorEntry>> m_behaviorReferences; |
| 60 | private Multimap<FieldEntry,EntryReference<FieldEntry,BehaviorEntry>> m_fieldReferences; | 62 | private Multimap<FieldEntry,EntryReference<FieldEntry,BehaviorEntry>> m_fieldReferences; |
| @@ -67,6 +69,7 @@ public class JarIndex | |||
| 67 | { | 69 | { |
| 68 | m_obfClassEntries = Sets.newHashSet(); | 70 | m_obfClassEntries = Sets.newHashSet(); |
| 69 | m_ancestries = new Ancestries(); | 71 | m_ancestries = new Ancestries(); |
| 72 | m_access = Maps.newHashMap(); | ||
| 70 | m_methodImplementations = HashMultimap.create(); | 73 | m_methodImplementations = HashMultimap.create(); |
| 71 | m_behaviorReferences = HashMultimap.create(); | 74 | m_behaviorReferences = HashMultimap.create(); |
| 72 | m_fieldReferences = HashMultimap.create(); | 75 | m_fieldReferences = HashMultimap.create(); |
| @@ -89,7 +92,24 @@ public class JarIndex | |||
| 89 | m_obfClassEntries.add( classEntry ); | 92 | m_obfClassEntries.add( classEntry ); |
| 90 | } | 93 | } |
| 91 | 94 | ||
| 92 | // step 2: index the types, methods | 95 | // step 2: index method/field access |
| 96 | for( CtClass c : JarClassIterator.classes( jar ) ) | ||
| 97 | { | ||
| 98 | fixClass( c ); | ||
| 99 | ClassEntry classEntry = new ClassEntry( Descriptor.toJvmName( c.getName() ) ); | ||
| 100 | for( CtField field : c.getDeclaredFields() ) | ||
| 101 | { | ||
| 102 | FieldEntry fieldEntry = new FieldEntry( classEntry, field.getName() ); | ||
| 103 | m_access.put( fieldEntry, Access.get( field ) ); | ||
| 104 | } | ||
| 105 | for( CtBehavior behavior : c.getDeclaredBehaviors() ) | ||
| 106 | { | ||
| 107 | MethodEntry methodEntry = new MethodEntry( classEntry, behavior.getName(), behavior.getSignature() ); | ||
| 108 | m_access.put( methodEntry, Access.get( behavior ) ); | ||
| 109 | } | ||
| 110 | } | ||
| 111 | |||
| 112 | // step 3: index the types, methods | ||
| 93 | for( CtClass c : JarClassIterator.classes( jar ) ) | 113 | for( CtClass c : JarClassIterator.classes( jar ) ) |
| 94 | { | 114 | { |
| 95 | fixClass( c ); | 115 | fixClass( c ); |
| @@ -105,7 +125,7 @@ public class JarIndex | |||
| 105 | } | 125 | } |
| 106 | } | 126 | } |
| 107 | 127 | ||
| 108 | // step 3: index inner classes and anonymous classes | 128 | // step 4: index inner classes and anonymous classes |
| 109 | for( CtClass c : JarClassIterator.classes( jar ) ) | 129 | for( CtClass c : JarClassIterator.classes( jar ) ) |
| 110 | { | 130 | { |
| 111 | fixClass( c ); | 131 | fixClass( c ); |
| @@ -132,7 +152,7 @@ public class JarIndex | |||
| 132 | } | 152 | } |
| 133 | } | 153 | } |
| 134 | 154 | ||
| 135 | // step 4: update other indices with inner class info | 155 | // step 5: update other indices with inner class info |
| 136 | Map<String,String> renames = Maps.newHashMap(); | 156 | Map<String,String> renames = Maps.newHashMap(); |
| 137 | for( Map.Entry<String,String> entry : m_outerClasses.entrySet() ) | 157 | for( Map.Entry<String,String> entry : m_outerClasses.entrySet() ) |
| 138 | { | 158 | { |
| @@ -522,6 +542,11 @@ public class JarIndex | |||
| 522 | return m_ancestries; | 542 | return m_ancestries; |
| 523 | } | 543 | } |
| 524 | 544 | ||
| 545 | public Access getAccess( Entry entry ) | ||
| 546 | { | ||
| 547 | return m_access.get( entry ); | ||
| 548 | } | ||
| 549 | |||
| 525 | public boolean isMethodImplemented( MethodEntry methodEntry ) | 550 | public boolean isMethodImplemented( MethodEntry methodEntry ) |
| 526 | { | 551 | { |
| 527 | Collection<MethodEntry> implementations = m_methodImplementations.get( methodEntry.getClassName() ); | 552 | Collection<MethodEntry> implementations = m_methodImplementations.get( methodEntry.getClassName() ); |
diff --git a/src/cuchaz/enigma/gui/Gui.java b/src/cuchaz/enigma/gui/Gui.java index 3ee8ade0..ec0f842a 100644 --- a/src/cuchaz/enigma/gui/Gui.java +++ b/src/cuchaz/enigma/gui/Gui.java | |||
| @@ -189,6 +189,7 @@ public class Gui | |||
| 189 | @Override | 189 | @Override |
| 190 | public void uncaughtException( Thread thread, Throwable ex ) | 190 | public void uncaughtException( Thread thread, Throwable ex ) |
| 191 | { | 191 | { |
| 192 | ex.printStackTrace( System.err ); | ||
| 192 | CrashDialog.show( ex ); | 193 | CrashDialog.show( ex ); |
| 193 | } | 194 | } |
| 194 | } ); | 195 | } ); |