Add common deobfuscator interface

This commit is contained in:
Adam
2015-07-10 12:37:45 -04:00
parent df11cdaded
commit 26458e7280
10 changed files with 38 additions and 23 deletions

View File

@@ -0,0 +1,6 @@
package info.sigterm.deob;
public interface Deobfuscator
{
public void run(ClassGroup group);
}

View File

@@ -1,7 +1,10 @@
package info.sigterm.deob.deobfuscators; package info.sigterm.deob.deobfuscators;
import java.util.List;
import info.sigterm.deob.ClassFile; import info.sigterm.deob.ClassFile;
import info.sigterm.deob.ClassGroup; import info.sigterm.deob.ClassGroup;
import info.sigterm.deob.Deobfuscator;
import info.sigterm.deob.Method; import info.sigterm.deob.Method;
import info.sigterm.deob.attributes.Code; import info.sigterm.deob.attributes.Code;
import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.Instruction;
@@ -15,12 +18,7 @@ import info.sigterm.deob.execution.Execution;
import info.sigterm.deob.execution.Frame; import info.sigterm.deob.execution.Frame;
import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.InstructionContext;
import java.util.ArrayList; public class IllegalStateExceptions implements Deobfuscator
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class IllegalStateExceptions
{ {
/* find if, new, ..., athrow, replace with goto */ /* find if, new, ..., athrow, replace with goto */
private int checkOnce(Execution execution, ClassGroup group) private int checkOnce(Execution execution, ClassGroup group)
@@ -120,6 +118,7 @@ public class IllegalStateExceptions
return count; return count;
} }
@Override
public void run(ClassGroup group) public void run(ClassGroup group)
{ {
Execution execution = new Execution(group); Execution execution = new Execution(group);

View File

@@ -2,6 +2,7 @@ package info.sigterm.deob.deobfuscators;
import info.sigterm.deob.ClassFile; import info.sigterm.deob.ClassFile;
import info.sigterm.deob.ClassGroup; import info.sigterm.deob.ClassGroup;
import info.sigterm.deob.Deobfuscator;
import info.sigterm.deob.Method; import info.sigterm.deob.Method;
import info.sigterm.deob.attributes.code.Block; import info.sigterm.deob.attributes.code.Block;
import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.Instruction;
@@ -12,7 +13,7 @@ import info.sigterm.deob.attributes.code.instructions.GotoW;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class Jumps public class Jumps implements Deobfuscator
{ {
private int checkBlockGraphOnce(ClassGroup group) private int checkBlockGraphOnce(ClassGroup group)
{ {
@@ -83,6 +84,7 @@ public class Jumps
return count; return count;
} }
@Override
public void run(ClassGroup g) public void run(ClassGroup g)
{ {
int count = 0; int count = 0;

View File

@@ -6,21 +6,16 @@ import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import info.sigterm.deob.ClassFile; import info.sigterm.deob.ClassFile;
import info.sigterm.deob.ClassGroup; import info.sigterm.deob.ClassGroup;
import info.sigterm.deob.Deobfuscator;
import info.sigterm.deob.Field; import info.sigterm.deob.Field;
import info.sigterm.deob.Method;
import info.sigterm.deob.attributes.Code;
import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.Instruction;
import info.sigterm.deob.attributes.code.Instructions;
import info.sigterm.deob.attributes.code.instruction.types.ComparisonInstruction;
import info.sigterm.deob.attributes.code.instruction.types.FieldInstruction; import info.sigterm.deob.attributes.code.instruction.types.FieldInstruction;
import info.sigterm.deob.attributes.code.instruction.types.GetFieldInstruction; import info.sigterm.deob.attributes.code.instruction.types.GetFieldInstruction;
import info.sigterm.deob.attributes.code.instruction.types.InvokeInstruction; import info.sigterm.deob.attributes.code.instruction.types.InvokeInstruction;
import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction;
import info.sigterm.deob.attributes.code.instruction.types.PushConstantInstruction; import info.sigterm.deob.attributes.code.instruction.types.PushConstantInstruction;
import info.sigterm.deob.attributes.code.instruction.types.SetFieldInstruction; import info.sigterm.deob.attributes.code.instruction.types.SetFieldInstruction;
import info.sigterm.deob.attributes.code.instructions.IMul; import info.sigterm.deob.attributes.code.instructions.IMul;
@@ -29,7 +24,7 @@ import info.sigterm.deob.execution.Frame;
import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.InstructionContext;
import info.sigterm.deob.execution.StackContext; import info.sigterm.deob.execution.StackContext;
public class ModularArithmeticDeobfuscation public class ModularArithmeticDeobfuscation implements Deobfuscator
{ {
private Set<Field> obfuscatedFields; // reliability of these sucks private Set<Field> obfuscatedFields; // reliability of these sucks
@@ -676,6 +671,7 @@ public class ModularArithmeticDeobfuscation
return modInverse(BigInteger.valueOf(val), 64).longValue(); return modInverse(BigInteger.valueOf(val), 64).longValue();
} }
@Override
public void run(ClassGroup group) public void run(ClassGroup group)
{ {
Execution execution = new Execution(group); Execution execution = new Execution(group);

View File

@@ -4,6 +4,7 @@ import java.util.List;
import info.sigterm.deob.ClassFile; import info.sigterm.deob.ClassFile;
import info.sigterm.deob.ClassGroup; import info.sigterm.deob.ClassGroup;
import info.sigterm.deob.Deobfuscator;
import info.sigterm.deob.Field; import info.sigterm.deob.Field;
import info.sigterm.deob.Interfaces; import info.sigterm.deob.Interfaces;
import info.sigterm.deob.Method; import info.sigterm.deob.Method;
@@ -13,7 +14,7 @@ import info.sigterm.deob.pool.Class;
import info.sigterm.deob.signature.Signature; import info.sigterm.deob.signature.Signature;
import info.sigterm.deob.signature.Type; import info.sigterm.deob.signature.Type;
public class RenameUnique public class RenameUnique implements Deobfuscator
{ {
private void renameClass(ClassFile on, ClassFile old, String name) private void renameClass(ClassFile on, ClassFile old, String name)
{ {
@@ -93,6 +94,7 @@ public class RenameUnique
field.setName(name); field.setName(name);
} }
@Override
public void run(ClassGroup group) public void run(ClassGroup group)
{ {
int i = 0; int i = 0;

View File

@@ -2,13 +2,15 @@ package info.sigterm.deob.deobfuscators;
import info.sigterm.deob.ClassFile; import info.sigterm.deob.ClassFile;
import info.sigterm.deob.ClassGroup; import info.sigterm.deob.ClassGroup;
import info.sigterm.deob.Deobfuscator;
import info.sigterm.deob.Method; import info.sigterm.deob.Method;
import info.sigterm.deob.attributes.Code; import info.sigterm.deob.attributes.Code;
import java.util.ArrayList; import java.util.ArrayList;
public class RuntimeExceptions public class RuntimeExceptions implements Deobfuscator
{ {
@Override
public void run(ClassGroup group) public void run(ClassGroup group)
{ {
int i = 0; int i = 0;

View File

@@ -2,14 +2,16 @@ package info.sigterm.deob.deobfuscators;
import info.sigterm.deob.ClassFile; import info.sigterm.deob.ClassFile;
import info.sigterm.deob.ClassGroup; import info.sigterm.deob.ClassGroup;
import info.sigterm.deob.Deobfuscator;
import info.sigterm.deob.Method; import info.sigterm.deob.Method;
import info.sigterm.deob.attributes.code.Block; import info.sigterm.deob.attributes.code.Block;
import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.attributes.code.Instructions;
import java.util.ArrayList; import java.util.ArrayList;
public class UnusedBlocks public class UnusedBlocks implements Deobfuscator
{ {
@Override
public void run(ClassGroup group) public void run(ClassGroup group)
{ {
int i = 0; int i = 0;

View File

@@ -4,6 +4,7 @@ import java.util.ArrayList;
import info.sigterm.deob.ClassFile; import info.sigterm.deob.ClassFile;
import info.sigterm.deob.ClassGroup; import info.sigterm.deob.ClassGroup;
import info.sigterm.deob.Deobfuscator;
import info.sigterm.deob.Field; import info.sigterm.deob.Field;
import info.sigterm.deob.Method; import info.sigterm.deob.Method;
import info.sigterm.deob.attributes.Code; import info.sigterm.deob.attributes.Code;
@@ -12,7 +13,7 @@ import info.sigterm.deob.attributes.code.instruction.types.FieldInstruction;
import info.sigterm.deob.attributes.code.instruction.types.GetFieldInstruction; import info.sigterm.deob.attributes.code.instruction.types.GetFieldInstruction;
import info.sigterm.deob.attributes.code.instruction.types.SetFieldInstruction; import info.sigterm.deob.attributes.code.instruction.types.SetFieldInstruction;
public class UnusedFields public class UnusedFields implements Deobfuscator
{ {
private static boolean isUnused(ClassGroup group, Field field) private static boolean isUnused(ClassGroup group, Field field)
{ {
@@ -61,6 +62,7 @@ public class UnusedFields
return false; return false;
} }
@Override
public void run(ClassGroup group) public void run(ClassGroup group)
{ {
int count = 0; int count = 0;

View File

@@ -2,16 +2,18 @@ package info.sigterm.deob.deobfuscators;
import info.sigterm.deob.ClassFile; import info.sigterm.deob.ClassFile;
import info.sigterm.deob.ClassGroup; import info.sigterm.deob.ClassGroup;
import info.sigterm.deob.Deobfuscator;
import info.sigterm.deob.Method; import info.sigterm.deob.Method;
import info.sigterm.deob.execution.Execution; import info.sigterm.deob.execution.Execution;
import java.util.ArrayList; import java.util.ArrayList;
public class UnusedMethods public class UnusedMethods implements Deobfuscator
{ {
@Override
public void run(ClassGroup group) public void run(ClassGroup group)
{ {
group.buildClassGraph(); group.buildClassGraph(); // does this use this?
Execution execution = new Execution(group); Execution execution = new Execution(group);
execution.populateInitialMethods(); execution.populateInitialMethods();

View File

@@ -2,6 +2,7 @@ package info.sigterm.deob.deobfuscators;
import info.sigterm.deob.ClassFile; import info.sigterm.deob.ClassFile;
import info.sigterm.deob.ClassGroup; import info.sigterm.deob.ClassGroup;
import info.sigterm.deob.Deobfuscator;
import info.sigterm.deob.Method; import info.sigterm.deob.Method;
import info.sigterm.deob.attributes.Code; import info.sigterm.deob.attributes.Code;
import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.Instruction;
@@ -22,7 +23,7 @@ import java.util.Set;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
public class UnusedParameters public class UnusedParameters implements Deobfuscator
{ {
private static List<Method> findDependentMethods(NameAndType nat, Set<ClassFile> visited, ClassGroup group, ClassFile cf) private static List<Method> findDependentMethods(NameAndType nat, Set<ClassFile> visited, ClassGroup group, ClassFile cf)
{ {
@@ -238,8 +239,8 @@ public class UnusedParameters
for (Method m2 : methods) for (Method m2 : methods)
done.add(m2); done.add(m2);
/* removing the parameter can cause collision of overriden methods, /* removing the parameter can't cause collisions on other (overloaded) methods because prior to this we rename
* we should first rename all methods to be unique? * all classes/fields/methods to have unique names.
*/ */
removeParameter(methods, signature, execution, unusedParameter, lvtIndexes[unusedParameter]); removeParameter(methods, signature, execution, unusedParameter, lvtIndexes[unusedParameter]);
@@ -251,6 +252,7 @@ public class UnusedParameters
return new int[] { count }; return new int[] { count };
} }
@Override
public void run(ClassGroup group) public void run(ClassGroup group)
{ {
Execution execution = new Execution(group); Execution execution = new Execution(group);