diff options
Diffstat (limited to 'src/cuchaz/enigma/Deobfuscator.java')
| -rw-r--r-- | src/cuchaz/enigma/Deobfuscator.java | 49 |
1 files changed, 25 insertions, 24 deletions
diff --git a/src/cuchaz/enigma/Deobfuscator.java b/src/cuchaz/enigma/Deobfuscator.java index 5d87ad0..ee414fa 100644 --- a/src/cuchaz/enigma/Deobfuscator.java +++ b/src/cuchaz/enigma/Deobfuscator.java | |||
| @@ -17,6 +17,8 @@ import java.io.StringWriter; | |||
| 17 | import java.util.List; | 17 | import java.util.List; |
| 18 | import java.util.jar.JarFile; | 18 | import java.util.jar.JarFile; |
| 19 | 19 | ||
| 20 | import javassist.bytecode.Descriptor; | ||
| 21 | |||
| 20 | import com.strobel.assembler.metadata.MetadataSystem; | 22 | import com.strobel.assembler.metadata.MetadataSystem; |
| 21 | import com.strobel.assembler.metadata.TypeDefinition; | 23 | import com.strobel.assembler.metadata.TypeDefinition; |
| 22 | import com.strobel.decompiler.DecompilerContext; | 24 | import com.strobel.decompiler.DecompilerContext; |
| @@ -118,28 +120,30 @@ public class Deobfuscator | |||
| 118 | 120 | ||
| 119 | public void getSeparatedClasses( List<String> obfClasses, List<String> deobfClasses ) | 121 | public void getSeparatedClasses( List<String> obfClasses, List<String> deobfClasses ) |
| 120 | { | 122 | { |
| 121 | for( String obfClassName : m_jarIndex.getObfClassNames() ) | 123 | for( ClassEntry obfClassEntry : m_jarIndex.getObfClassEntries() ) |
| 122 | { | 124 | { |
| 123 | // skip inner classes | 125 | // skip inner classes |
| 124 | if( m_jarIndex.getOuterClass( obfClassName ) != null ) | 126 | if( m_jarIndex.getOuterClass( obfClassEntry.getName() ) != null ) |
| 125 | { | 127 | { |
| 126 | continue; | 128 | continue; |
| 127 | } | 129 | } |
| 128 | 130 | ||
| 129 | // separate the classes | 131 | // separate the classes |
| 130 | ClassMapping classMapping = m_mappings.getClassByObf( obfClassName ); | 132 | ClassEntry deobfClassEntry = deobfuscateEntry( obfClassEntry ); |
| 131 | if( classMapping != null && !classMapping.getObfName().equals( classMapping.getDeobfName() ) ) | 133 | if( !deobfClassEntry.equals( obfClassEntry ) ) |
| 132 | { | 134 | { |
| 133 | deobfClasses.add( classMapping.getDeobfName() ); | 135 | // if the class has a mapping, clearly it's deobfuscated |
| 136 | deobfClasses.add( deobfClassEntry.getName() ); | ||
| 134 | } | 137 | } |
| 135 | else if( obfClassName.indexOf( '/' ) >= 0 ) | 138 | else if( !obfClassEntry.getPackageName().equals( "default" ) ) |
| 136 | { | 139 | { |
| 137 | // this class is in a package and therefore is not obfuscated | 140 | // also call it deobufscated if it's not in the "default" package |
| 138 | deobfClasses.add( obfClassName ); | 141 | deobfClasses.add( obfClassEntry.getName() ); |
| 139 | } | 142 | } |
| 140 | else | 143 | else |
| 141 | { | 144 | { |
| 142 | obfClasses.add( obfClassName ); | 145 | // otherwise, assume it's still obfuscated |
| 146 | obfClasses.add( obfClassEntry.getName() ); | ||
| 143 | } | 147 | } |
| 144 | } | 148 | } |
| 145 | } | 149 | } |
| @@ -198,7 +202,7 @@ public class Deobfuscator | |||
| 198 | public void writeSources( File dirOut, ProgressListener progress ) | 202 | public void writeSources( File dirOut, ProgressListener progress ) |
| 199 | throws IOException | 203 | throws IOException |
| 200 | { | 204 | { |
| 201 | int numClasses = m_jarIndex.getObfClassNames().size(); | 205 | int numClasses = m_jarIndex.getObfClassEntries().size(); |
| 202 | if( progress != null ) | 206 | if( progress != null ) |
| 203 | { | 207 | { |
| 204 | progress.init( numClasses ); | 208 | progress.init( numClasses ); |
| @@ -206,22 +210,22 @@ public class Deobfuscator | |||
| 206 | int i = 0; | 210 | int i = 0; |
| 207 | 211 | ||
| 208 | // DEOBFUSCATE ALL THE THINGS!! @_@ | 212 | // DEOBFUSCATE ALL THE THINGS!! @_@ |
| 209 | for( String obfClassName : m_jarIndex.getObfClassNames() ) | 213 | for( ClassEntry obfClassEntry : m_jarIndex.getObfClassEntries() ) |
| 210 | { | 214 | { |
| 211 | // skip inner classes | 215 | // skip inner classes |
| 212 | if( m_jarIndex.getOuterClass( obfClassName ) != null ) | 216 | if( obfClassEntry.isInnerClass() ) |
| 213 | { | 217 | { |
| 214 | continue; | 218 | continue; |
| 215 | } | 219 | } |
| 216 | 220 | ||
| 217 | ClassEntry deobfClassEntry = deobfuscateEntry( new ClassEntry( obfClassName ) ); | 221 | ClassEntry deobfClassEntry = deobfuscateEntry( new ClassEntry( obfClassEntry ) ); |
| 218 | if( progress != null ) | 222 | if( progress != null ) |
| 219 | { | 223 | { |
| 220 | progress.onProgress( i++, deobfClassEntry.toString() ); | 224 | progress.onProgress( i++, deobfClassEntry.toString() ); |
| 221 | } | 225 | } |
| 222 | 226 | ||
| 223 | // get the source | 227 | // get the source |
| 224 | String source = getSource( getSourceTree( obfClassName ) ); | 228 | String source = getSource( getSourceTree( obfClassEntry.getName() ) ); |
| 225 | 229 | ||
| 226 | // write the file | 230 | // write the file |
| 227 | File file = new File( dirOut, deobfClassEntry.getName().replace( '.', '/' ) + ".java" ); | 231 | File file = new File( dirOut, deobfClassEntry.getName().replace( '.', '/' ) + ".java" ); |
| @@ -284,7 +288,7 @@ public class Deobfuscator | |||
| 284 | { | 288 | { |
| 285 | if( obfEntry instanceof ClassEntry ) | 289 | if( obfEntry instanceof ClassEntry ) |
| 286 | { | 290 | { |
| 287 | m_renamer.setClassName( (ClassEntry)obfEntry, newName ); | 291 | m_renamer.setClassName( (ClassEntry)obfEntry, Descriptor.toJvmName( newName ) ); |
| 288 | } | 292 | } |
| 289 | else if( obfEntry instanceof FieldEntry ) | 293 | else if( obfEntry instanceof FieldEntry ) |
| 290 | { | 294 | { |
| @@ -348,21 +352,18 @@ public class Deobfuscator | |||
| 348 | { | 352 | { |
| 349 | if( obfEntry instanceof ClassEntry ) | 353 | if( obfEntry instanceof ClassEntry ) |
| 350 | { | 354 | { |
| 351 | if( obfEntry.getName().indexOf( '$' ) >= 0 ) | 355 | ClassEntry obfClassEntry = (ClassEntry)obfEntry; |
| 356 | if( obfClassEntry.isInnerClass() ) | ||
| 352 | { | 357 | { |
| 353 | String[] parts = obfEntry.getName().split( "\\$" ); | ||
| 354 | assert( parts.length == 2 ); // not supporting recursively-nested classes | ||
| 355 | String outerClassName = parts[0]; | ||
| 356 | String innerClassName = parts[1]; | ||
| 357 | |||
| 358 | // both classes must be in the list | 358 | // both classes must be in the list |
| 359 | return m_jarIndex.getObfClassNames().contains( outerClassName ) | 359 | return m_jarIndex.getObfClassEntries().contains( obfClassEntry.getOuterClassEntry() ) |
| 360 | && m_jarIndex.getObfClassNames().contains( innerClassName ); | 360 | && m_jarIndex.getObfClassEntries().contains( obfClassEntry.getInnerClassName() ); |
| 361 | // TODO: make sure this works for the inner class!! | ||
| 361 | } | 362 | } |
| 362 | else | 363 | else |
| 363 | { | 364 | { |
| 364 | // class must be in the list | 365 | // class must be in the list |
| 365 | return m_jarIndex.getObfClassNames().contains( obfEntry.getName() ); | 366 | return m_jarIndex.getObfClassEntries().contains( obfEntry ); |
| 366 | } | 367 | } |
| 367 | } | 368 | } |
| 368 | else | 369 | else |