summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/Deobfuscator.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/cuchaz/enigma/Deobfuscator.java')
-rw-r--r--src/cuchaz/enigma/Deobfuscator.java49
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;
17import java.util.List; 17import java.util.List;
18import java.util.jar.JarFile; 18import java.util.jar.JarFile;
19 19
20import javassist.bytecode.Descriptor;
21
20import com.strobel.assembler.metadata.MetadataSystem; 22import com.strobel.assembler.metadata.MetadataSystem;
21import com.strobel.assembler.metadata.TypeDefinition; 23import com.strobel.assembler.metadata.TypeDefinition;
22import com.strobel.decompiler.DecompilerContext; 24import 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