From d4f40eaf037501675b442ed8f48d9200092085fc Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 23 Oct 2015 12:04:23 -0400 Subject: [PATCH] Trying to fine tune stuff, found a *1 not removed which is messing with some stuff, added test --- .../deobfuscators/arithmetic/ModArith.java | 31 +++++- .../MultiplyOneDeobfuscatorTest.java | 101 ++++++++++++++++++ 2 files changed, 131 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/runelite/deob/deobfuscators/arithmetic/ModArith.java b/src/main/java/net/runelite/deob/deobfuscators/arithmetic/ModArith.java index dbcc24d5d9..bc265e7710 100644 --- a/src/main/java/net/runelite/deob/deobfuscators/arithmetic/ModArith.java +++ b/src/main/java/net/runelite/deob/deobfuscators/arithmetic/ModArith.java @@ -93,6 +93,35 @@ public class ModArith implements Deobfuscator return true; } } + else if (pushedsfi.getInstruction() instanceof IMul) + { + Instruction one = pushedsfi.getPops().get(0).getPushed().getInstruction(); + Instruction two = pushedsfi.getPops().get(1).getPushed().getInstruction(); + + LDC_W pci = null; + Instruction other = null; + if (one instanceof LDC_W) + { + pci = (LDC_W) one; + other = two; + } + else if (two instanceof LDC_W) + { + pci = (LDC_W) two; + other = one; + } + + if (pci != null + && !(other instanceof GetFieldInstruction)) + { + if (pci.getConstant().getObject() instanceof Integer) + { + int i = pci.getConstantAsInt(); + if (DMath.isBig(i)) + return true; + } + } + } } } // field * imul @@ -515,7 +544,7 @@ public class ModArith implements Deobfuscator //getter -442113225 //setter -2129182073 - if (f.getName().equals("field606")) + if (f.getName().equals("field2130")) { //Collection col3 = col.stream().map(i -> i.value).collect(Collectors.toSet()); diff --git a/src/test/java/net/runelite/deob/deobfuscators/arithmetic/MultiplyOneDeobfuscatorTest.java b/src/test/java/net/runelite/deob/deobfuscators/arithmetic/MultiplyOneDeobfuscatorTest.java index 7658ebad30..3fbff8fad1 100644 --- a/src/test/java/net/runelite/deob/deobfuscators/arithmetic/MultiplyOneDeobfuscatorTest.java +++ b/src/test/java/net/runelite/deob/deobfuscators/arithmetic/MultiplyOneDeobfuscatorTest.java @@ -10,10 +10,14 @@ import net.runelite.deob.attributes.code.instructions.Goto; import net.runelite.deob.attributes.code.instructions.IConst_1; import net.runelite.deob.attributes.code.instructions.IConst_2; import net.runelite.deob.attributes.code.instructions.IConst_3; +import net.runelite.deob.attributes.code.instructions.IConst_M1; import net.runelite.deob.attributes.code.instructions.ILoad; import net.runelite.deob.attributes.code.instructions.IMul; import net.runelite.deob.attributes.code.instructions.IStore_0; +import net.runelite.deob.attributes.code.instructions.IStore_1; +import net.runelite.deob.attributes.code.instructions.If; import net.runelite.deob.attributes.code.instructions.If0; +import net.runelite.deob.attributes.code.instructions.LDC_W; import net.runelite.deob.attributes.code.instructions.NOP; import net.runelite.deob.attributes.code.instructions.SiPush; import net.runelite.deob.attributes.code.instructions.VReturn; @@ -131,4 +135,101 @@ public class MultiplyOneDeobfuscatorTest Assert.assertTrue(one.getInstructions() == null); Assert.assertTrue(mul.getInstructions() == null); } + + // iconst_1 + // iconst_m1 + // iload 5 + // if_icmpeq LABEL0x56d1 + // iload 5 + // iconst_1 + // if_icmpne LABEL0x56e8 + // goto LABEL0x56d1 + //LABEL0x56d1: + // getstatic class139/field2130 I + // ldc_w -1440517609 + // imul + // goto LABEL0x5708 + //LABEL0x56e8: + // getstatic class139/field2130 I + // ldc_w -1440517609 + // imul + // getstatic client/field377 I + // iadd + // iconst_2 + // idiv + //LABEL0x5708: + // imul + // putstatic client/field377 I + // + // client.field377 = 1 * (-1 != var5 && var5 != 1?(class139.field2130 + client.field377) / 2:class139.field2130); + @Test + public void test2() + { + ClassGroup group = ClassGroupFactory.generateGroup(); + Code code = group.findClass("test").findMethod("func").getCode(); + Instructions ins = code.getInstructions(); + + code.setMaxStack(2); + + // vars[0] = 3 + Instruction[] prepareVariables = { + new IConst_3(ins), + new IStore_0(ins), + new IConst_2(ins), + new IStore_1(ins) + }; + + for (Instruction i : prepareVariables) + ins.addInstruction(i); + + NOP label = new NOP(ins), + label2 = new NOP(ins), + label3 = new NOP(ins); + + IConst_1 one = new IConst_1(ins); + IMul mul = new IMul(ins); + + Instruction body[] = { + one, + + new IConst_M1(ins), + new ILoad(ins, 0), + new If(ins, label), + + new ILoad(ins, 0), + new IConst_1(ins), + new If(ins, label2), + + label, + new ILoad(ins, 1), + new LDC_W(ins, -1440517609), + new IMul(ins), + new Goto(ins, label3), + + label2, + new ILoad(ins, 1), + new LDC_W(ins, -1440517609), + new IMul(ins), + + label3, + mul, + + + new VReturn(ins) + }; + + for (Instruction i : body) + ins.addInstruction(i); + + // check execution runs ok + Execution e = new Execution(group); + e.populateInitialMethods(); + e.run(); + + Deobfuscator d = new MultiplyOneDeobfuscator(); + d.run(group); + + Assert.assertTrue(one.getInstructions() == null); + Assert.assertTrue(mul.getInstructions() == null); + } }