diff options
| author | 2014-08-20 01:21:52 -0400 | |
|---|---|---|
| committer | 2014-08-20 01:21:52 -0400 | |
| commit | a85529d1ce6ec533809575ec84572de855464b36 (patch) | |
| tree | 8f1894c272edf0e7eb22aec2f3af41f6bd19c092 /src/cuchaz/enigma/Deobfuscator.java | |
| parent | started new reference navigation system (diff) | |
| download | enigma-fork-a85529d1ce6ec533809575ec84572de855464b36.tar.gz enigma-fork-a85529d1ce6ec533809575ec84572de855464b36.tar.xz enigma-fork-a85529d1ce6ec533809575ec84572de855464b36.zip | |
finished reference navigation system. Still need to debug and polish it, but the basic idea seems to work. =)
Diffstat (limited to 'src/cuchaz/enigma/Deobfuscator.java')
| -rw-r--r-- | src/cuchaz/enigma/Deobfuscator.java | 105 |
1 files changed, 50 insertions, 55 deletions
diff --git a/src/cuchaz/enigma/Deobfuscator.java b/src/cuchaz/enigma/Deobfuscator.java index 293e1c2..34e6033 100644 --- a/src/cuchaz/enigma/Deobfuscator.java +++ b/src/cuchaz/enigma/Deobfuscator.java | |||
| @@ -26,6 +26,7 @@ import com.strobel.decompiler.languages.java.ast.AstBuilder; | |||
| 26 | import com.strobel.decompiler.languages.java.ast.CompilationUnit; | 26 | import com.strobel.decompiler.languages.java.ast.CompilationUnit; |
| 27 | import com.strobel.decompiler.languages.java.ast.InsertParenthesesVisitor; | 27 | import com.strobel.decompiler.languages.java.ast.InsertParenthesesVisitor; |
| 28 | 28 | ||
| 29 | import cuchaz.enigma.analysis.EntryReference; | ||
| 29 | import cuchaz.enigma.analysis.JarIndex; | 30 | import cuchaz.enigma.analysis.JarIndex; |
| 30 | import cuchaz.enigma.analysis.SourceIndex; | 31 | import cuchaz.enigma.analysis.SourceIndex; |
| 31 | import cuchaz.enigma.analysis.SourceIndexVisitor; | 32 | import cuchaz.enigma.analysis.SourceIndexVisitor; |
| @@ -169,98 +170,92 @@ public class Deobfuscator | |||
| 169 | SourceIndex index = new SourceIndex( buf.toString() ); | 170 | SourceIndex index = new SourceIndex( buf.toString() ); |
| 170 | root.acceptVisitor( new SourceIndexVisitor(), index ); | 171 | root.acceptVisitor( new SourceIndexVisitor(), index ); |
| 171 | 172 | ||
| 172 | return index; | 173 | /* DEBUG |
| 173 | } | 174 | for( Token token : index.referenceTokens() ) |
| 174 | |||
| 175 | // NOTE: these methods are a bit messy... oh well | ||
| 176 | |||
| 177 | public void rename( Entry obfEntry, String newName ) | ||
| 178 | { | ||
| 179 | if( obfEntry instanceof ClassEntry ) | ||
| 180 | { | 175 | { |
| 181 | m_renamer.setClassName( (ClassEntry)obfEntry, newName ); | 176 | EntryReference<Entry,Entry> reference = index.getDeobfReference( token ); |
| 182 | } | 177 | System.out.println( token + " -> " + reference + " -> " + index.getReferenceToken( reference ) ); |
| 183 | else if( obfEntry instanceof FieldEntry ) | ||
| 184 | { | ||
| 185 | m_renamer.setFieldName( (FieldEntry)obfEntry, newName ); | ||
| 186 | } | ||
| 187 | else if( obfEntry instanceof MethodEntry ) | ||
| 188 | { | ||
| 189 | m_renamer.setMethodTreeName( (MethodEntry)obfEntry, newName ); | ||
| 190 | } | ||
| 191 | else if( obfEntry instanceof ConstructorEntry ) | ||
| 192 | { | ||
| 193 | m_renamer.setClassName( obfEntry.getClassEntry(), newName ); | ||
| 194 | } | ||
| 195 | else if( obfEntry instanceof ArgumentEntry ) | ||
| 196 | { | ||
| 197 | m_renamer.setArgumentName( (ArgumentEntry)obfEntry, newName ); | ||
| 198 | } | ||
| 199 | else | ||
| 200 | { | ||
| 201 | throw new Error( "Unknown entry type: " + obfEntry.getClass().getName() ); | ||
| 202 | } | 178 | } |
| 179 | */ | ||
| 203 | 180 | ||
| 204 | // clear the type loader cache | 181 | return index; |
| 205 | m_typeLoader.clearCache(); | ||
| 206 | } | 182 | } |
| 207 | 183 | ||
| 208 | public Entry obfuscateEntry( Entry deobfEntry ) | 184 | public Entry obfuscateEntry( Entry deobfEntry ) |
| 209 | { | 185 | { |
| 210 | Translator translator = getTranslator( TranslationDirection.Obfuscating ); | 186 | if( deobfEntry == null ) |
| 211 | if( deobfEntry instanceof ClassEntry ) | ||
| 212 | { | ||
| 213 | return translator.translateEntry( (ClassEntry)deobfEntry ); | ||
| 214 | } | ||
| 215 | else if( deobfEntry instanceof FieldEntry ) | ||
| 216 | { | ||
| 217 | return translator.translateEntry( (FieldEntry)deobfEntry ); | ||
| 218 | } | ||
| 219 | else if( deobfEntry instanceof MethodEntry ) | ||
| 220 | { | 187 | { |
| 221 | return translator.translateEntry( (MethodEntry)deobfEntry ); | 188 | return null; |
| 222 | } | 189 | } |
| 223 | else if( deobfEntry instanceof ConstructorEntry ) | 190 | return getTranslator( TranslationDirection.Obfuscating ).translateEntry( deobfEntry ); |
| 191 | } | ||
| 192 | |||
| 193 | public Entry deobfuscateEntry( Entry obfEntry ) | ||
| 194 | { | ||
| 195 | if( obfEntry == null ) | ||
| 224 | { | 196 | { |
| 225 | return translator.translateEntry( (ConstructorEntry)deobfEntry ); | 197 | return null; |
| 226 | } | 198 | } |
| 227 | else if( deobfEntry instanceof ArgumentEntry ) | 199 | return getTranslator( TranslationDirection.Deobfuscating ).translateEntry( obfEntry ); |
| 200 | } | ||
| 201 | |||
| 202 | public EntryReference<Entry,Entry> obfuscateReference( EntryReference<Entry,Entry> deobfReference ) | ||
| 203 | { | ||
| 204 | if( deobfReference == null ) | ||
| 228 | { | 205 | { |
| 229 | return translator.translateEntry( (ArgumentEntry)deobfEntry ); | 206 | return null; |
| 230 | } | 207 | } |
| 231 | else | 208 | return new EntryReference<Entry,Entry>( |
| 209 | obfuscateEntry( deobfReference.entry ), | ||
| 210 | obfuscateEntry( deobfReference.context ), | ||
| 211 | deobfReference.pos | ||
| 212 | ); | ||
| 213 | } | ||
| 214 | |||
| 215 | public EntryReference<Entry,Entry> deobfuscateReference( EntryReference<Entry,Entry> obfReference ) | ||
| 216 | { | ||
| 217 | if( obfReference == null ) | ||
| 232 | { | 218 | { |
| 233 | throw new Error( "Unknown entry type: " + deobfEntry.getClass().getName() ); | 219 | return null; |
| 234 | } | 220 | } |
| 221 | return new EntryReference<Entry,Entry>( | ||
| 222 | deobfuscateEntry( obfReference.entry ), | ||
| 223 | deobfuscateEntry( obfReference.context ), | ||
| 224 | obfReference.pos | ||
| 225 | ); | ||
| 235 | } | 226 | } |
| 236 | 227 | ||
| 237 | public Entry deobfuscateEntry( Entry obfEntry ) | 228 | // NOTE: these methods are a bit messy... oh well |
| 229 | |||
| 230 | public void rename( Entry obfEntry, String newName ) | ||
| 238 | { | 231 | { |
| 239 | Translator translator = getTranslator( TranslationDirection.Deobfuscating ); | ||
| 240 | if( obfEntry instanceof ClassEntry ) | 232 | if( obfEntry instanceof ClassEntry ) |
| 241 | { | 233 | { |
| 242 | return translator.translateEntry( (ClassEntry)obfEntry ); | 234 | m_renamer.setClassName( (ClassEntry)obfEntry, newName ); |
| 243 | } | 235 | } |
| 244 | else if( obfEntry instanceof FieldEntry ) | 236 | else if( obfEntry instanceof FieldEntry ) |
| 245 | { | 237 | { |
| 246 | return translator.translateEntry( (FieldEntry)obfEntry ); | 238 | m_renamer.setFieldName( (FieldEntry)obfEntry, newName ); |
| 247 | } | 239 | } |
| 248 | else if( obfEntry instanceof MethodEntry ) | 240 | else if( obfEntry instanceof MethodEntry ) |
| 249 | { | 241 | { |
| 250 | return translator.translateEntry( (MethodEntry)obfEntry ); | 242 | m_renamer.setMethodTreeName( (MethodEntry)obfEntry, newName ); |
| 251 | } | 243 | } |
| 252 | else if( obfEntry instanceof ConstructorEntry ) | 244 | else if( obfEntry instanceof ConstructorEntry ) |
| 253 | { | 245 | { |
| 254 | return translator.translateEntry( (ConstructorEntry)obfEntry ); | 246 | m_renamer.setClassName( obfEntry.getClassEntry(), newName ); |
| 255 | } | 247 | } |
| 256 | else if( obfEntry instanceof ArgumentEntry ) | 248 | else if( obfEntry instanceof ArgumentEntry ) |
| 257 | { | 249 | { |
| 258 | return translator.translateEntry( (ArgumentEntry)obfEntry ); | 250 | m_renamer.setArgumentName( (ArgumentEntry)obfEntry, newName ); |
| 259 | } | 251 | } |
| 260 | else | 252 | else |
| 261 | { | 253 | { |
| 262 | throw new Error( "Unknown entry type: " + obfEntry.getClass().getName() ); | 254 | throw new Error( "Unknown entry type: " + obfEntry.getClass().getName() ); |
| 263 | } | 255 | } |
| 256 | |||
| 257 | // clear the type loader cache | ||
| 258 | m_typeLoader.clearCache(); | ||
| 264 | } | 259 | } |
| 265 | 260 | ||
| 266 | public boolean hasMapping( Entry obfEntry ) | 261 | public boolean hasMapping( Entry obfEntry ) |