Fix inliner

This commit is contained in:
Adam
2015-08-14 15:01:11 -04:00
parent f3bdcf954e
commit 09c4b108dd
2 changed files with 37 additions and 32 deletions

View File

@@ -2,10 +2,12 @@ package info.sigterm.deob;
import info.sigterm.deob.deobfuscators.ConstantParameter; import info.sigterm.deob.deobfuscators.ConstantParameter;
import info.sigterm.deob.deobfuscators.IllegalStateExceptions; import info.sigterm.deob.deobfuscators.IllegalStateExceptions;
import info.sigterm.deob.deobfuscators.RenameUnique; import info.sigterm.deob.deobfuscators.MethodInliner;
import info.sigterm.deob.deobfuscators.RuntimeExceptions; import info.sigterm.deob.deobfuscators.RuntimeExceptions;
import info.sigterm.deob.deobfuscators.UnreachedCode; import info.sigterm.deob.deobfuscators.UnreachedCode;
import info.sigterm.deob.deobfuscators.UnusedFields;
import info.sigterm.deob.deobfuscators.UnusedMethods; import info.sigterm.deob.deobfuscators.UnusedMethods;
import info.sigterm.deob.deobfuscators.UnusedParameters;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.DataInputStream; import java.io.DataInputStream;
@@ -62,37 +64,37 @@ public class Deob
bdur = System.currentTimeMillis() - bstart; bdur = System.currentTimeMillis() - bstart;
System.out.println("constant param took " + bdur/1000L + " seconds"); System.out.println("constant param took " + bdur/1000L + " seconds");
// // remove unhit blocks // remove unhit blocks
// bstart = System.currentTimeMillis(); bstart = System.currentTimeMillis();
// new UnreachedCode().run(group); new UnreachedCode().run(group);
// //new UnusedBlocks().run(group); //new UnusedBlocks().run(group);
// bdur = System.currentTimeMillis() - bstart; bdur = System.currentTimeMillis() - bstart;
// System.out.println("unused blocks took " + bdur/1000L + " seconds"); System.out.println("unused blocks took " + bdur/1000L + " seconds");
// remove unused parameters // remove unused parameters
// bstart = System.currentTimeMillis(); bstart = System.currentTimeMillis();
// new UnusedParameters().run(group); new UnusedParameters().run(group);
// bdur = System.currentTimeMillis() - bstart; bdur = System.currentTimeMillis() - bstart;
// System.out.println("unused params took " + bdur/1000L + " seconds"); System.out.println("unused params took " + bdur/1000L + " seconds");
// remove jump obfuscation // remove jump obfuscation
//new Jumps().run(group); //new Jumps().run(group);
// remove unused fields // remove unused fields
// bstart = System.currentTimeMillis(); bstart = System.currentTimeMillis();
// new UnusedFields().run(group); new UnusedFields().run(group);
// bdur = System.currentTimeMillis() - bstart; bdur = System.currentTimeMillis() - bstart;
// System.out.println("unused fields took " + bdur/1000L + " seconds"); System.out.println("unused fields took " + bdur/1000L + " seconds");
//
// // remove unused methods, again? // remove unused methods, again?
// bstart = System.currentTimeMillis(); bstart = System.currentTimeMillis();
// new UnusedMethods().run(group); new UnusedMethods().run(group);
// bdur = System.currentTimeMillis() - bstart; bdur = System.currentTimeMillis() - bstart;
// System.out.println("unused methods took " + bdur/1000L + " seconds"); System.out.println("unused methods took " + bdur/1000L + " seconds");
//new ModularArithmeticDeobfuscation().run(group); //new ModularArithmeticDeobfuscation().run(group);
//new MethodInliner().run(group); new MethodInliner().run(group);
saveJar(group, args[1]); saveJar(group, args[1]);

View File

@@ -186,6 +186,9 @@ public class MethodInliner implements Deobfuscator
methodInstructions.getInstructions().add(idx + 1, nop); methodInstructions.getInstructions().add(idx + 1, nop);
++idx; ++idx;
methodInstructions.buildJumpGraph();
invokeMethodInstructions.buildJumpGraph();
for (Instruction fromI : invokeIns.from) for (Instruction fromI : invokeIns.from)
{ {
assert fromI.jump.contains(invokeIns); assert fromI.jump.contains(invokeIns);
@@ -200,9 +203,6 @@ public class MethodInliner implements Deobfuscator
methodInstructions.remove(invokeIns); methodInstructions.remove(invokeIns);
methodInstructions.buildJumpGraph();
invokeMethodInstructions.buildJumpGraph();
for (Instruction i : invokeMethodInstructions.getInstructions()) for (Instruction i : invokeMethodInstructions.getInstructions())
{ {
// move instructions over. // move instructions over.
@@ -233,13 +233,16 @@ public class MethodInliner implements Deobfuscator
Instruction oldI = i; Instruction oldI = i;
i = lvt.setVariableIndex(newIndex); i = lvt.setVariableIndex(newIndex);
i.jump.addAll(oldI.jump); if (oldI != i)
i.from.addAll(oldI.from); {
i.jump.addAll(oldI.jump);
for (Instruction i2 : oldI.from) i.from.addAll(oldI.from);
i2.replace(oldI, i);
for (Instruction i2 : oldI.from)
oldI.from.clear(); i2.replace(oldI, i);
oldI.from.clear();
}
} }
methodInstructions.getInstructions().add(idx++, i); methodInstructions.getInstructions().add(idx++, i);