From 4349d22cc8abf5ec74075dde1b45c5f2f8679bbf Mon Sep 17 00:00:00 2001 From: jeff Date: Wed, 30 Jul 2014 23:43:09 -0400 Subject: switched to line-by-line mergable, human-readable file format for mappings --- src/cuchaz/enigma/mapping/Mappings.java | 128 ++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 src/cuchaz/enigma/mapping/Mappings.java (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java new file mode 100644 index 0000000..2a39057 --- /dev/null +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -0,0 +1,128 @@ +/******************************************************************************* + * 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.mapping; + +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.Serializable; +import java.util.Map; +import java.util.zip.GZIPInputStream; + +import com.beust.jcommander.internal.Maps; + +import cuchaz.enigma.Util; + +public class Mappings implements Serializable +{ + private static final long serialVersionUID = 4649790259460259026L; + + protected Map m_classesByObf; + protected Map m_classesByDeobf; + + public Mappings( ) + { + m_classesByObf = Maps.newHashMap(); + m_classesByDeobf = Maps.newHashMap(); + } + + public Mappings( Iterable classes ) + { + this(); + + for( ClassMapping classMapping : classes ) + { + m_classesByObf.put( classMapping.getObfName(), classMapping ); + m_classesByDeobf.put( classMapping.getDeobfName(), classMapping ); + } + } + + public static Mappings newFromResource( String resource ) + throws IOException + { + InputStream in = null; + try + { + in = Mappings.class.getResourceAsStream( resource ); + return newFromStream( in ); + } + finally + { + Util.closeQuietly( in ); + } + } + + public Iterable classes( ) + { + assert( m_classesByObf.size() == m_classesByDeobf.size() ); + return m_classesByObf.values(); + } + + protected void addClassMapping( ClassMapping classMapping ) + { + m_classesByObf.put( classMapping.getObfName(), classMapping ); + m_classesByDeobf.put( classMapping.getDeobfName(), classMapping ); + } + + public ClassMapping getClassByObf( ClassEntry entry ) + { + return getClassByObf( entry.getName() ); + } + + public ClassMapping getClassByObf( String obfName ) + { + return m_classesByObf.get( obfName ); + } + + public ClassMapping getClassByDeobf( ClassEntry entry ) + { + return getClassByObf( entry.getName() ); + } + + public ClassMapping getClassByDeobf( String deobfName ) + { + return m_classesByDeobf.get( deobfName ); + } + + public Translator getTranslator( Ancestries ancestries, TranslationDirection direction ) + { + return new Translator( + direction, + direction.choose( m_classesByObf, m_classesByDeobf ), + direction.choose( ancestries, new DeobfuscatedAncestries( ancestries, m_classesByObf, m_classesByDeobf ) ) + ); + } + + public static Mappings newFromStream( InputStream in ) + throws IOException + { + try + { + return (Mappings)new ObjectInputStream( new GZIPInputStream( in ) ).readObject(); + } + catch( ClassNotFoundException ex ) + { + throw new Error( ex ); + } + } + + @Override + public String toString( ) + { + StringBuilder buf = new StringBuilder(); + for( ClassMapping classMapping : m_classesByObf.values() ) + { + buf.append( classMapping.toString() ); + buf.append( "\n" ); + } + return buf.toString(); + } +} -- cgit v1.2.3 From d24d2b9ad9b5c895020b56f700a72906346482e5 Mon Sep 17 00:00:00 2001 From: jeff Date: Sun, 10 Aug 2014 01:03:40 -0400 Subject: completely re-wrote token recognizer to bootstrap from Procyon's AST changed imports to guava instead of whatever collections library happened to be on my classpath --- src/cuchaz/enigma/mapping/Mappings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index 2a39057..4dff693 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -17,7 +17,7 @@ import java.io.Serializable; import java.util.Map; import java.util.zip.GZIPInputStream; -import com.beust.jcommander.internal.Maps; +import com.google.common.collect.Maps; import cuchaz.enigma.Util; -- cgit v1.2.3 From bba7c6a19c15bc82946176c79a4eba3612b25f17 Mon Sep 17 00:00:00 2001 From: jeff Date: Mon, 11 Aug 2014 00:02:00 -0400 Subject: added method inheritance browsing also finally fixed method renamer to rename all method implementations in the inheritance hierarchy. --- src/cuchaz/enigma/mapping/Mappings.java | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index 4dff693..c7cb6a6 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -20,6 +20,8 @@ import java.util.zip.GZIPInputStream; import com.google.common.collect.Maps; import cuchaz.enigma.Util; +import cuchaz.enigma.analysis.Ancestries; +import cuchaz.enigma.analysis.DeobfuscatedAncestries; public class Mappings implements Serializable { -- cgit v1.2.3 From 88d6d655a022b8125355409bd88535da756e5c99 Mon Sep 17 00:00:00 2001 From: jeff Date: Wed, 27 Aug 2014 00:57:06 -0400 Subject: add more checking to catch duplicate mappings on load implemented more stable sort order for methods repackaged as v0.4.1beta --- src/cuchaz/enigma/mapping/Mappings.java | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index c7cb6a6..f3b8fad 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -70,8 +70,17 @@ public class Mappings implements Serializable protected void addClassMapping( ClassMapping classMapping ) { + if( m_classesByObf.containsKey( classMapping.getObfName() ) ) + { + throw new Error( "Already have mapping for " + classMapping.getObfName() ); + } + if( m_classesByDeobf.containsKey( classMapping.getDeobfName() ) ) + { + throw new Error( "Already have mapping for " + classMapping.getDeobfName() ); + } m_classesByObf.put( classMapping.getObfName(), classMapping ); m_classesByDeobf.put( classMapping.getDeobfName(), classMapping ); + assert( m_classesByObf.size() == m_classesByDeobf.size() ); } public ClassMapping getClassByObf( ClassEntry entry ) -- cgit v1.2.3 From 63172120a39a315e29bc38ea6634741797b3dcab Mon Sep 17 00:00:00 2001 From: jeff Date: Sat, 30 Aug 2014 14:14:54 -0400 Subject: finished class matching for now, need to work on class member matching --- src/cuchaz/enigma/mapping/Mappings.java | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index f3b8fad..70bea25 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -14,6 +14,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.Serializable; +import java.util.ArrayList; import java.util.Map; import java.util.zip.GZIPInputStream; @@ -136,4 +137,28 @@ public class Mappings implements Serializable } return buf.toString(); } + + public void renameObfClasses( Map nameMap ) + { + for( ClassMapping classMapping : new ArrayList( m_classesByObf.values() ) ) + { + String newName = nameMap.get( classMapping.getObfName() ); + if( newName != null ) + { + m_classesByObf.remove( classMapping.getObfName() ); + classMapping.renameObfClasses( nameMap ); + m_classesByObf.put( classMapping.getObfName(), classMapping ); + } + } + } + + public void removeClassByObfName( String obfName ) + { + ClassMapping classMapping = m_classesByObf.get( obfName ); + if( classMapping != null ) + { + m_classesByObf.remove( classMapping.getObfName() ); + m_classesByDeobf.remove( classMapping.getDeobfName() ); + } + } } -- cgit v1.2.3 From 59c592673635e989fd0785d41d51d7c3dd17cc0b Mon Sep 17 00:00:00 2001 From: jeff Date: Sat, 30 Aug 2014 16:31:31 -0400 Subject: debugging class matcher... almost got it! --- src/cuchaz/enigma/mapping/Mappings.java | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index 70bea25..c92f8de 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -15,6 +15,7 @@ import java.io.InputStream; import java.io.ObjectInputStream; import java.io.Serializable; import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.zip.GZIPInputStream; @@ -161,4 +162,10 @@ public class Mappings implements Serializable m_classesByDeobf.remove( classMapping.getDeobfName() ); } } + + public List getAllObfClassNames( ) + { + // TODO: implement this + return null; + } } -- cgit v1.2.3 From d3fc0b55515e81ae1b10fa16129f05b0241271f0 Mon Sep 17 00:00:00 2001 From: jeff Date: Sun, 31 Aug 2014 14:41:24 -0400 Subject: fixed lots of bugs in the mappings converter. It's finally ready. =) --- src/cuchaz/enigma/mapping/Mappings.java | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index c92f8de..4b47d16 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -15,15 +15,17 @@ import java.io.InputStream; import java.io.ObjectInputStream; import java.io.Serializable; import java.util.ArrayList; -import java.util.List; import java.util.Map; +import java.util.Set; import java.util.zip.GZIPInputStream; +import com.beust.jcommander.internal.Sets; import com.google.common.collect.Maps; import cuchaz.enigma.Util; import cuchaz.enigma.analysis.Ancestries; import cuchaz.enigma.analysis.DeobfuscatedAncestries; +import cuchaz.enigma.mapping.SignatureUpdater.ClassNameUpdater; public class Mappings implements Serializable { @@ -163,9 +165,28 @@ public class Mappings implements Serializable } } - public List getAllObfClassNames( ) + public Set getAllObfClassNames( ) { - // TODO: implement this - return null; + final Set classNames = Sets.newHashSet(); + for( ClassMapping classMapping : classes() ) + { + // add the class name + classNames.add( classMapping.getObfName() ); + + // add classes from method signatures + for( MethodMapping methodMapping : classMapping.methods() ) + { + SignatureUpdater.update( methodMapping.getObfSignature(), new ClassNameUpdater( ) + { + @Override + public String update( String className ) + { + classNames.add( className ); + return className; + } + } ); + } + } + return classNames; } } -- cgit v1.2.3 From 4e9c52d5fc5d23e8a77857e712654596203acb31 Mon Sep 17 00:00:00 2001 From: jeff Date: Sun, 31 Aug 2014 16:14:45 -0400 Subject: fixed mapping conversion bug with class rename order --- src/cuchaz/enigma/mapping/Mappings.java | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index 4b47d16..0b03abb 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -15,6 +15,7 @@ import java.io.InputStream; import java.io.ObjectInputStream; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collection; import java.util.Map; import java.util.Set; import java.util.zip.GZIPInputStream; @@ -66,7 +67,7 @@ public class Mappings implements Serializable } } - public Iterable classes( ) + public Collection classes( ) { assert( m_classesByObf.size() == m_classesByDeobf.size() ); return m_classesByObf.values(); @@ -141,30 +142,19 @@ public class Mappings implements Serializable return buf.toString(); } - public void renameObfClasses( Map nameMap ) + public void renameObfClass( String oldObfName, String newObfName ) { - for( ClassMapping classMapping : new ArrayList( m_classesByObf.values() ) ) + for( ClassMapping classMapping : new ArrayList( classes() ) ) { - String newName = nameMap.get( classMapping.getObfName() ); - if( newName != null ) + if( classMapping.renameObfClass( oldObfName, newObfName ) ) { - m_classesByObf.remove( classMapping.getObfName() ); - classMapping.renameObfClasses( nameMap ); - m_classesByObf.put( classMapping.getObfName(), classMapping ); + m_classesByObf.remove( oldObfName ); + m_classesByObf.put( newObfName, classMapping ); + assert( m_classesByObf.size() == m_classesByDeobf.size() ); } } } - - public void removeClassByObfName( String obfName ) - { - ClassMapping classMapping = m_classesByObf.get( obfName ); - if( classMapping != null ) - { - m_classesByObf.remove( classMapping.getObfName() ); - m_classesByDeobf.remove( classMapping.getDeobfName() ); - } - } - + public Set getAllObfClassNames( ) { final Set classNames = Sets.newHashSet(); -- cgit v1.2.3 From 195ffb47a68c4b40d8cc04b67e6c49d8081dc3d3 Mon Sep 17 00:00:00 2001 From: jeff Date: Sun, 31 Aug 2014 22:43:13 -0400 Subject: added checks to prevent renaming classes/fields/methods/arguments to the same name as other classes/fields/methods/arguments --- src/cuchaz/enigma/mapping/Mappings.java | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index 0b03abb..378d4c0 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -179,4 +179,39 @@ public class Mappings implements Serializable } return classNames; } + + public boolean containsDeobfClass( String deobfName ) + { + return m_classesByDeobf.containsKey( deobfName ); + } + + public boolean containsDeobfField( ClassEntry obfClassEntry, String deobfName ) + { + ClassMapping classMapping = m_classesByObf.get( obfClassEntry.getName() ); + if( classMapping != null ) + { + return classMapping.containsDeobfField( deobfName ); + } + return false; + } + + public boolean containsDeobfMethod( ClassEntry obfClassEntry, String deobfName, String deobfSignature ) + { + ClassMapping classMapping = m_classesByObf.get( obfClassEntry.getName() ); + if( classMapping != null ) + { + return classMapping.containsDeobfMethod( deobfName, deobfSignature ); + } + return false; + } + + public boolean containsArgument( MethodEntry obfMethodEntry, String name ) + { + ClassMapping classMapping = m_classesByObf.get( obfMethodEntry.getClassName() ); + if( classMapping != null ) + { + return classMapping.containsArgument( obfMethodEntry, name ); + } + return false; + } } -- cgit v1.2.3 From 360bbd1c2fca8cbd575907b7d930a8072fccb0c2 Mon Sep 17 00:00:00 2001 From: jeff Date: Mon, 1 Sep 2014 22:52:07 -0400 Subject: refactored jar,translation index. fixed bug with field renaming when fields are shadowed by subclasses --- src/cuchaz/enigma/mapping/Mappings.java | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index 378d4c0..f52094f 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -24,8 +24,7 @@ import com.beust.jcommander.internal.Sets; import com.google.common.collect.Maps; import cuchaz.enigma.Util; -import cuchaz.enigma.analysis.Ancestries; -import cuchaz.enigma.analysis.DeobfuscatedAncestries; +import cuchaz.enigma.analysis.TranslationIndex; import cuchaz.enigma.mapping.SignatureUpdater.ClassNameUpdater; public class Mappings implements Serializable @@ -108,12 +107,27 @@ public class Mappings implements Serializable return m_classesByDeobf.get( deobfName ); } - public Translator getTranslator( Ancestries ancestries, TranslationDirection direction ) + public Translator getTranslator( TranslationIndex index, TranslationDirection direction ) { + if( direction == TranslationDirection.Obfuscating ) + { + // deobfuscate the index + index = new TranslationIndex( index ); + Map renames = Maps.newHashMap(); + for( ClassMapping classMapping : classes() ) + { + renames.put( classMapping.getObfName(), classMapping.getDeobfName() ); + for( ClassMapping innerClassMapping : classMapping.innerClasses() ) + { + renames.put( innerClassMapping.getObfName(), innerClassMapping.getDeobfName() ); + } + } + index.renameClasses( renames ); + } return new Translator( direction, direction.choose( m_classesByObf, m_classesByDeobf ), - direction.choose( ancestries, new DeobfuscatedAncestries( ancestries, m_classesByObf, m_classesByDeobf ) ) + index ); } -- cgit v1.2.3 From b5338883d271779c335842c07047d60136316167 Mon Sep 17 00:00:00 2001 From: jeff Date: Wed, 3 Sep 2014 00:20:36 -0400 Subject: big refactor to better model class/method mappings with no deobf name --- src/cuchaz/enigma/mapping/Mappings.java | 90 +++++++++++++++++++++++---------- 1 file changed, 62 insertions(+), 28 deletions(-) (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index f52094f..99cb85f 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -47,7 +47,10 @@ public class Mappings implements Serializable for( ClassMapping classMapping : classes ) { m_classesByObf.put( classMapping.getObfName(), classMapping ); - m_classesByDeobf.put( classMapping.getDeobfName(), classMapping ); + if( classMapping.getDeobfName() != null ) + { + m_classesByDeobf.put( classMapping.getDeobfName(), classMapping ); + } } } @@ -68,23 +71,27 @@ public class Mappings implements Serializable public Collection classes( ) { - assert( m_classesByObf.size() == m_classesByDeobf.size() ); + assert( m_classesByObf.size() >= m_classesByDeobf.size() ); return m_classesByObf.values(); } - protected void addClassMapping( ClassMapping classMapping ) + public void addClassMapping( ClassMapping classMapping ) { if( m_classesByObf.containsKey( classMapping.getObfName() ) ) { throw new Error( "Already have mapping for " + classMapping.getObfName() ); } - if( m_classesByDeobf.containsKey( classMapping.getDeobfName() ) ) + boolean obfWasAdded = m_classesByObf.put( classMapping.getObfName(), classMapping ) == null; + assert( obfWasAdded ); + if( classMapping.getDeobfName() != null ) { - throw new Error( "Already have mapping for " + classMapping.getDeobfName() ); + if( m_classesByDeobf.containsKey( classMapping.getDeobfName() ) ) + { + throw new Error( "Already have mapping for " + classMapping.getDeobfName() ); + } + boolean deobfWasAdded = m_classesByDeobf.put( classMapping.getDeobfName(), classMapping ) == null; + assert( deobfWasAdded ); } - m_classesByObf.put( classMapping.getObfName(), classMapping ); - m_classesByDeobf.put( classMapping.getDeobfName(), classMapping ); - assert( m_classesByObf.size() == m_classesByDeobf.size() ); } public ClassMapping getClassByObf( ClassEntry entry ) @@ -99,7 +106,7 @@ public class Mappings implements Serializable public ClassMapping getClassByDeobf( ClassEntry entry ) { - return getClassByObf( entry.getName() ); + return getClassByDeobf( entry.getName() ); } public ClassMapping getClassByDeobf( String deobfName ) @@ -109,26 +116,52 @@ public class Mappings implements Serializable public Translator getTranslator( TranslationIndex index, TranslationDirection direction ) { - if( direction == TranslationDirection.Obfuscating ) + switch( direction ) { - // deobfuscate the index - index = new TranslationIndex( index ); - Map renames = Maps.newHashMap(); - for( ClassMapping classMapping : classes() ) - { - renames.put( classMapping.getObfName(), classMapping.getDeobfName() ); - for( ClassMapping innerClassMapping : classMapping.innerClasses() ) + case Deobfuscating: + + return new Translator( direction, m_classesByObf, index ); + + case Obfuscating: + + // deobfuscate the index + index = new TranslationIndex( index ); + Map renames = Maps.newHashMap(); + for( ClassMapping classMapping : classes() ) { - renames.put( innerClassMapping.getObfName(), innerClassMapping.getDeobfName() ); + if( classMapping.getDeobfName() != null ) + { + renames.put( classMapping.getObfName(), classMapping.getDeobfName() ); + } + for( ClassMapping innerClassMapping : classMapping.innerClasses() ) + { + if( innerClassMapping.getDeobfName() != null ) + { + renames.put( innerClassMapping.getObfName(), innerClassMapping.getDeobfName() ); + } + } } - } - index.renameClasses( renames ); + index.renameClasses( renames ); + + // fill in the missing deobf class entries with obf entries + Map classes = Maps.newHashMap(); + for( ClassMapping classMapping : classes() ) + { + if( classMapping.getDeobfName() != null ) + { + classes.put( classMapping.getDeobfName(), classMapping ); + } + else + { + classes.put( classMapping.getObfName(), classMapping ); + } + } + + return new Translator( direction, classes, index ); + + default: + throw new Error( "Invalid translation direction!" ); } - return new Translator( - direction, - direction.choose( m_classesByObf, m_classesByDeobf ), - index - ); } public static Mappings newFromStream( InputStream in ) @@ -162,9 +195,10 @@ public class Mappings implements Serializable { if( classMapping.renameObfClass( oldObfName, newObfName ) ) { - m_classesByObf.remove( oldObfName ); - m_classesByObf.put( newObfName, classMapping ); - assert( m_classesByObf.size() == m_classesByDeobf.size() ); + boolean wasRemoved = m_classesByObf.remove( oldObfName ) != null; + assert( wasRemoved ); + boolean wasAdded = m_classesByObf.put( newObfName, classMapping ) == null; + assert( wasAdded ); } } } -- cgit v1.2.3 From a8d0f97c270e32653aa246d7437478885077e24d Mon Sep 17 00:00:00 2001 From: jeff Date: Sat, 20 Sep 2014 17:11:25 -0400 Subject: cleaned up imports. I have no idea why Eclipse likes importing jcommander classes instead of guava classes, but it's annoyong! --- src/cuchaz/enigma/mapping/Mappings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index 99cb85f..f855f58 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -20,8 +20,8 @@ import java.util.Map; import java.util.Set; import java.util.zip.GZIPInputStream; -import com.beust.jcommander.internal.Sets; import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import cuchaz.enigma.Util; import cuchaz.enigma.analysis.TranslationIndex; -- cgit v1.2.3 From 8776a8ba38123c822530e5f659c626c8db616217 Mon Sep 17 00:00:00 2001 From: jeff Date: Wed, 24 Sep 2014 01:00:54 -0400 Subject: HOW DO I WRITE SO MANY BUGS?!? --- src/cuchaz/enigma/mapping/Mappings.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index f855f58..0b4e7f3 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -253,12 +253,12 @@ public class Mappings implements Serializable return false; } - public boolean containsArgument( MethodEntry obfMethodEntry, String name ) + public boolean containsArgument( BehaviorEntry obfBehaviorEntry, String name ) { - ClassMapping classMapping = m_classesByObf.get( obfMethodEntry.getClassName() ); + ClassMapping classMapping = m_classesByObf.get( obfBehaviorEntry.getClassName() ); if( classMapping != null ) { - return classMapping.containsArgument( obfMethodEntry, name ); + return classMapping.containsArgument( obfBehaviorEntry, name ); } return false; } -- cgit v1.2.3 From 575447097876b5cf3dfbae8fa1f6f749819e97b8 Mon Sep 17 00:00:00 2001 From: jeff Date: Fri, 26 Sep 2014 00:33:07 -0400 Subject: implemented mark-as-deobfuscated and reset-to-obfuscated --- src/cuchaz/enigma/mapping/Mappings.java | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index 0b4e7f3..45b41bc 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -94,6 +94,17 @@ public class Mappings implements Serializable } } + public void removeClassMapping( ClassMapping classMapping ) + { + boolean obfWasRemoved = m_classesByObf.remove( classMapping.getObfName() ) != null; + assert( obfWasRemoved ); + if( classMapping.getDeobfName() != null ) + { + boolean deobfWasRemoved = m_classesByDeobf.remove( classMapping.getDeobfName() ) != null; + assert( deobfWasRemoved ); + } + } + public ClassMapping getClassByObf( ClassEntry entry ) { return getClassByObf( entry.getName() ); -- cgit v1.2.3 From 5eeee98418bb39367258442a82b75a081a6f91e0 Mon Sep 17 00:00:00 2001 From: jeff Date: Wed, 1 Oct 2014 00:04:18 -0400 Subject: fixed inner class renaming bug also added smarter sorting to class mappings --- src/cuchaz/enigma/mapping/Mappings.java | 26 +++----------------------- 1 file changed, 3 insertions(+), 23 deletions(-) (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index 45b41bc..3a39d10 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -24,7 +24,6 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import cuchaz.enigma.Util; -import cuchaz.enigma.analysis.TranslationIndex; import cuchaz.enigma.mapping.SignatureUpdater.ClassNameUpdater; public class Mappings implements Serializable @@ -125,35 +124,16 @@ public class Mappings implements Serializable return m_classesByDeobf.get( deobfName ); } - public Translator getTranslator( TranslationIndex index, TranslationDirection direction ) + public Translator getTranslator( TranslationDirection direction ) { switch( direction ) { case Deobfuscating: - return new Translator( direction, m_classesByObf, index ); + return new Translator( direction, m_classesByObf ); case Obfuscating: - // deobfuscate the index - index = new TranslationIndex( index ); - Map renames = Maps.newHashMap(); - for( ClassMapping classMapping : classes() ) - { - if( classMapping.getDeobfName() != null ) - { - renames.put( classMapping.getObfName(), classMapping.getDeobfName() ); - } - for( ClassMapping innerClassMapping : classMapping.innerClasses() ) - { - if( innerClassMapping.getDeobfName() != null ) - { - renames.put( innerClassMapping.getObfName(), innerClassMapping.getDeobfName() ); - } - } - } - index.renameClasses( renames ); - // fill in the missing deobf class entries with obf entries Map classes = Maps.newHashMap(); for( ClassMapping classMapping : classes() ) @@ -168,7 +148,7 @@ public class Mappings implements Serializable } } - return new Translator( direction, classes, index ); + return new Translator( direction, classes ); default: throw new Error( "Invalid translation direction!" ); -- cgit v1.2.3 From 035e73fba69ab06172ae9d784b9e0e4fffeb8388 Mon Sep 17 00:00:00 2001 From: jeff Date: Wed, 8 Oct 2014 23:54:08 -0400 Subject: relicense as LGPL --- src/cuchaz/enigma/mapping/Mappings.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index 3a39d10..dfe06dd 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -1,9 +1,9 @@ /******************************************************************************* * 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 + * are made available under the terms of the GNU Lesser General Public + * License v3.0 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html * * Contributors: * Jeff Martin - initial API and implementation -- cgit v1.2.3 From 812e2a4630ef01463ff153ba5ffae675e8ac24ac Mon Sep 17 00:00:00 2001 From: jeff Date: Thu, 9 Oct 2014 19:37:19 -0400 Subject: reverting to GPL license --- src/cuchaz/enigma/mapping/Mappings.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index dfe06dd..3a39d10 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -1,9 +1,9 @@ /******************************************************************************* * Copyright (c) 2014 Jeff Martin. * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Lesser General Public - * License v3.0 which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/lgpl.html + * 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 -- cgit v1.2.3 From 959cb5fd4f9586ec3bd265b452fe25fe1db82e3f Mon Sep 17 00:00:00 2001 From: jeff Date: Tue, 13 Jan 2015 23:25:04 -0500 Subject: source format change don't hate me too much if you were planning a big merge. =P --- src/cuchaz/enigma/mapping/Mappings.java | 230 +++++++++++++------------------- 1 file changed, 91 insertions(+), 139 deletions(-) (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index 3a39d10..c5e38f4 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -26,230 +26,182 @@ import com.google.common.collect.Sets; import cuchaz.enigma.Util; import cuchaz.enigma.mapping.SignatureUpdater.ClassNameUpdater; -public class Mappings implements Serializable -{ +public class Mappings implements Serializable { + private static final long serialVersionUID = 4649790259460259026L; protected Map m_classesByObf; protected Map m_classesByDeobf; - public Mappings( ) - { + public Mappings() { m_classesByObf = Maps.newHashMap(); m_classesByDeobf = Maps.newHashMap(); } - public Mappings( Iterable classes ) - { + public Mappings(Iterable classes) { this(); - for( ClassMapping classMapping : classes ) - { - m_classesByObf.put( classMapping.getObfName(), classMapping ); - if( classMapping.getDeobfName() != null ) - { - m_classesByDeobf.put( classMapping.getDeobfName(), classMapping ); + for (ClassMapping classMapping : classes) { + m_classesByObf.put(classMapping.getObfName(), classMapping); + if (classMapping.getDeobfName() != null) { + m_classesByDeobf.put(classMapping.getDeobfName(), classMapping); } } } - public static Mappings newFromResource( String resource ) - throws IOException - { + public static Mappings newFromResource(String resource) throws IOException { InputStream in = null; - try - { - in = Mappings.class.getResourceAsStream( resource ); - return newFromStream( in ); - } - finally - { - Util.closeQuietly( in ); + try { + in = Mappings.class.getResourceAsStream(resource); + return newFromStream(in); + } finally { + Util.closeQuietly(in); } } - public Collection classes( ) - { - assert( m_classesByObf.size() >= m_classesByDeobf.size() ); + public Collection classes() { + assert (m_classesByObf.size() >= m_classesByDeobf.size()); return m_classesByObf.values(); } - public void addClassMapping( ClassMapping classMapping ) - { - if( m_classesByObf.containsKey( classMapping.getObfName() ) ) - { - throw new Error( "Already have mapping for " + classMapping.getObfName() ); + public void addClassMapping(ClassMapping classMapping) { + if (m_classesByObf.containsKey(classMapping.getObfName())) { + throw new Error("Already have mapping for " + classMapping.getObfName()); } - boolean obfWasAdded = m_classesByObf.put( classMapping.getObfName(), classMapping ) == null; - assert( obfWasAdded ); - if( classMapping.getDeobfName() != null ) - { - if( m_classesByDeobf.containsKey( classMapping.getDeobfName() ) ) - { - throw new Error( "Already have mapping for " + classMapping.getDeobfName() ); + boolean obfWasAdded = m_classesByObf.put(classMapping.getObfName(), classMapping) == null; + assert (obfWasAdded); + if (classMapping.getDeobfName() != null) { + if (m_classesByDeobf.containsKey(classMapping.getDeobfName())) { + throw new Error("Already have mapping for " + classMapping.getDeobfName()); } - boolean deobfWasAdded = m_classesByDeobf.put( classMapping.getDeobfName(), classMapping ) == null; - assert( deobfWasAdded ); + boolean deobfWasAdded = m_classesByDeobf.put(classMapping.getDeobfName(), classMapping) == null; + assert (deobfWasAdded); } } - public void removeClassMapping( ClassMapping classMapping ) - { - boolean obfWasRemoved = m_classesByObf.remove( classMapping.getObfName() ) != null; - assert( obfWasRemoved ); - if( classMapping.getDeobfName() != null ) - { - boolean deobfWasRemoved = m_classesByDeobf.remove( classMapping.getDeobfName() ) != null; - assert( deobfWasRemoved ); + public void removeClassMapping(ClassMapping classMapping) { + boolean obfWasRemoved = m_classesByObf.remove(classMapping.getObfName()) != null; + assert (obfWasRemoved); + if (classMapping.getDeobfName() != null) { + boolean deobfWasRemoved = m_classesByDeobf.remove(classMapping.getDeobfName()) != null; + assert (deobfWasRemoved); } } - public ClassMapping getClassByObf( ClassEntry entry ) - { - return getClassByObf( entry.getName() ); + public ClassMapping getClassByObf(ClassEntry entry) { + return getClassByObf(entry.getName()); } - public ClassMapping getClassByObf( String obfName ) - { - return m_classesByObf.get( obfName ); + public ClassMapping getClassByObf(String obfName) { + return m_classesByObf.get(obfName); } - public ClassMapping getClassByDeobf( ClassEntry entry ) - { - return getClassByDeobf( entry.getName() ); + public ClassMapping getClassByDeobf(ClassEntry entry) { + return getClassByDeobf(entry.getName()); } - public ClassMapping getClassByDeobf( String deobfName ) - { - return m_classesByDeobf.get( deobfName ); + public ClassMapping getClassByDeobf(String deobfName) { + return m_classesByDeobf.get(deobfName); } - public Translator getTranslator( TranslationDirection direction ) - { - switch( direction ) - { + public Translator getTranslator(TranslationDirection direction) { + switch (direction) { case Deobfuscating: - return new Translator( direction, m_classesByObf ); + return new Translator(direction, m_classesByObf); case Obfuscating: // fill in the missing deobf class entries with obf entries Map classes = Maps.newHashMap(); - for( ClassMapping classMapping : classes() ) - { - if( classMapping.getDeobfName() != null ) - { - classes.put( classMapping.getDeobfName(), classMapping ); - } - else - { - classes.put( classMapping.getObfName(), classMapping ); + for (ClassMapping classMapping : classes()) { + if (classMapping.getDeobfName() != null) { + classes.put(classMapping.getDeobfName(), classMapping); + } else { + classes.put(classMapping.getObfName(), classMapping); } } - return new Translator( direction, classes ); + return new Translator(direction, classes); default: - throw new Error( "Invalid translation direction!" ); + throw new Error("Invalid translation direction!"); } } - public static Mappings newFromStream( InputStream in ) - throws IOException - { - try - { - return (Mappings)new ObjectInputStream( new GZIPInputStream( in ) ).readObject(); - } - catch( ClassNotFoundException ex ) - { - throw new Error( ex ); + public static Mappings newFromStream(InputStream in) throws IOException { + try { + return (Mappings)new ObjectInputStream(new GZIPInputStream(in)).readObject(); + } catch (ClassNotFoundException ex) { + throw new Error(ex); } } @Override - public String toString( ) - { + public String toString() { StringBuilder buf = new StringBuilder(); - for( ClassMapping classMapping : m_classesByObf.values() ) - { - buf.append( classMapping.toString() ); - buf.append( "\n" ); + for (ClassMapping classMapping : m_classesByObf.values()) { + buf.append(classMapping.toString()); + buf.append("\n"); } return buf.toString(); } - public void renameObfClass( String oldObfName, String newObfName ) - { - for( ClassMapping classMapping : new ArrayList( classes() ) ) - { - if( classMapping.renameObfClass( oldObfName, newObfName ) ) - { - boolean wasRemoved = m_classesByObf.remove( oldObfName ) != null; - assert( wasRemoved ); - boolean wasAdded = m_classesByObf.put( newObfName, classMapping ) == null; - assert( wasAdded ); + public void renameObfClass(String oldObfName, String newObfName) { + for (ClassMapping classMapping : new ArrayList(classes())) { + if (classMapping.renameObfClass(oldObfName, newObfName)) { + boolean wasRemoved = m_classesByObf.remove(oldObfName) != null; + assert (wasRemoved); + boolean wasAdded = m_classesByObf.put(newObfName, classMapping) == null; + assert (wasAdded); } } } - public Set getAllObfClassNames( ) - { + public Set getAllObfClassNames() { final Set classNames = Sets.newHashSet(); - for( ClassMapping classMapping : classes() ) - { + for (ClassMapping classMapping : classes()) { // add the class name - classNames.add( classMapping.getObfName() ); + classNames.add(classMapping.getObfName()); // add classes from method signatures - for( MethodMapping methodMapping : classMapping.methods() ) - { - SignatureUpdater.update( methodMapping.getObfSignature(), new ClassNameUpdater( ) - { + for (MethodMapping methodMapping : classMapping.methods()) { + SignatureUpdater.update(methodMapping.getObfSignature(), new ClassNameUpdater() { @Override - public String update( String className ) - { - classNames.add( className ); + public String update(String className) { + classNames.add(className); return className; } - } ); + }); } } return classNames; } - - public boolean containsDeobfClass( String deobfName ) - { - return m_classesByDeobf.containsKey( deobfName ); + + public boolean containsDeobfClass(String deobfName) { + return m_classesByDeobf.containsKey(deobfName); } - public boolean containsDeobfField( ClassEntry obfClassEntry, String deobfName ) - { - ClassMapping classMapping = m_classesByObf.get( obfClassEntry.getName() ); - if( classMapping != null ) - { - return classMapping.containsDeobfField( deobfName ); + public boolean containsDeobfField(ClassEntry obfClassEntry, String deobfName) { + ClassMapping classMapping = m_classesByObf.get(obfClassEntry.getName()); + if (classMapping != null) { + return classMapping.containsDeobfField(deobfName); } return false; } - - public boolean containsDeobfMethod( ClassEntry obfClassEntry, String deobfName, String deobfSignature ) - { - ClassMapping classMapping = m_classesByObf.get( obfClassEntry.getName() ); - if( classMapping != null ) - { - return classMapping.containsDeobfMethod( deobfName, deobfSignature ); + + public boolean containsDeobfMethod(ClassEntry obfClassEntry, String deobfName, String deobfSignature) { + ClassMapping classMapping = m_classesByObf.get(obfClassEntry.getName()); + if (classMapping != null) { + return classMapping.containsDeobfMethod(deobfName, deobfSignature); } return false; } - - public boolean containsArgument( BehaviorEntry obfBehaviorEntry, String name ) - { - ClassMapping classMapping = m_classesByObf.get( obfBehaviorEntry.getClassName() ); - if( classMapping != null ) - { - return classMapping.containsArgument( obfBehaviorEntry, name ); + + public boolean containsArgument(BehaviorEntry obfBehaviorEntry, String name) { + ClassMapping classMapping = m_classesByObf.get(obfBehaviorEntry.getClassName()); + if (classMapping != null) { + return classMapping.containsArgument(obfBehaviorEntry, name); } return false; } -- cgit v1.2.3 From 2fbcf8e5c4eec0aa4a4fc59c7cc8abac33b1429c Mon Sep 17 00:00:00 2001 From: jeff Date: Mon, 19 Jan 2015 22:22:57 -0500 Subject: solved tricky issue with incorrect translation of fields/methods referenced by a subclass instead of the declaring class --- src/cuchaz/enigma/mapping/Mappings.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index c5e38f4..cc560a8 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -24,6 +24,7 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import cuchaz.enigma.Util; +import cuchaz.enigma.analysis.TranslationIndex; import cuchaz.enigma.mapping.SignatureUpdater.ClassNameUpdater; public class Mappings implements Serializable { @@ -104,11 +105,11 @@ public class Mappings implements Serializable { return m_classesByDeobf.get(deobfName); } - public Translator getTranslator(TranslationDirection direction) { + public Translator getTranslator(TranslationDirection direction, TranslationIndex index) { switch (direction) { case Deobfuscating: - return new Translator(direction, m_classesByObf); + return new Translator(direction, m_classesByObf, index); case Obfuscating: @@ -122,7 +123,11 @@ public class Mappings implements Serializable { } } - return new Translator(direction, classes); + // translate the translation index + // NOTE: this isn't actually recursive + TranslationIndex deobfIndex = new TranslationIndex(index, getTranslator(TranslationDirection.Deobfuscating, index)); + + return new Translator(direction, classes, deobfIndex); default: throw new Error("Invalid translation direction!"); -- cgit v1.2.3 From cb22a55b241714a56f78b9c6ee863f0a37bbf005 Mon Sep 17 00:00:00 2001 From: jeff Date: Thu, 5 Feb 2015 23:53:41 -0500 Subject: start some translation tests --- src/cuchaz/enigma/mapping/Mappings.java | 23 ----------------------- 1 file changed, 23 deletions(-) (limited to 'src/cuchaz/enigma/mapping/Mappings.java') diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index cc560a8..92134ed 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -10,20 +10,15 @@ ******************************************************************************/ package cuchaz.enigma.mapping; -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Map; import java.util.Set; -import java.util.zip.GZIPInputStream; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import cuchaz.enigma.Util; import cuchaz.enigma.analysis.TranslationIndex; import cuchaz.enigma.mapping.SignatureUpdater.ClassNameUpdater; @@ -50,16 +45,6 @@ public class Mappings implements Serializable { } } - public static Mappings newFromResource(String resource) throws IOException { - InputStream in = null; - try { - in = Mappings.class.getResourceAsStream(resource); - return newFromStream(in); - } finally { - Util.closeQuietly(in); - } - } - public Collection classes() { assert (m_classesByObf.size() >= m_classesByDeobf.size()); return m_classesByObf.values(); @@ -134,14 +119,6 @@ public class Mappings implements Serializable { } } - public static Mappings newFromStream(InputStream in) throws IOException { - try { - return (Mappings)new ObjectInputStream(new GZIPInputStream(in)).readObject(); - } catch (ClassNotFoundException ex) { - throw new Error(ex); - } - } - @Override public String toString() { StringBuilder buf = new StringBuilder(); -- cgit v1.2.3