diff --git a/src/main/java/info/sigterm/deob/attributes/Code.java b/src/main/java/info/sigterm/deob/attributes/Code.java index 988b199297..5bfaa67200 100644 --- a/src/main/java/info/sigterm/deob/attributes/Code.java +++ b/src/main/java/info/sigterm/deob/attributes/Code.java @@ -28,6 +28,9 @@ public class Code extends Attribute exceptions = new Exceptions(this); this.attributes = new Attributes(this); + + instructions.buildBlocks(); + instructions.buildJumpGraph(); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/Block.java b/src/main/java/info/sigterm/deob/attributes/code/Block.java index c590c911e3..f6496eb7ff 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/Block.java +++ b/src/main/java/info/sigterm/deob/attributes/code/Block.java @@ -7,4 +7,6 @@ public class Block { public Instruction begin, end; public List instructions = new ArrayList<>(); + public List exceptions = new ArrayList<>(); // is an instruction in the handlers try { } + public List handlers = new ArrayList<>(); // first ins is a handler for exception } diff --git a/src/main/java/info/sigterm/deob/attributes/code/Instructions.java b/src/main/java/info/sigterm/deob/attributes/code/Instructions.java index c4c77ffa08..d88ec776a9 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/Instructions.java +++ b/src/main/java/info/sigterm/deob/attributes/code/Instructions.java @@ -52,9 +52,6 @@ public class Instructions for (Instruction i : instructions) i.resolve(); - - buildJumpGraph(); - buildBlocks(); } public List getInstructions() @@ -84,6 +81,21 @@ public class Instructions } } + private void findExceptionInfo(Block block, Instruction i) + { + for (Exception e : code.getExceptions().getExceptions()) + { + if (i.getPc() >= e.getStart().getPc() && i.getPc() < e.getEnd().getPc()) + { + block.exceptions.add(e); + } + if (e.getHandler() == i) + { + block.handlers.add(e); + } + } + } + public void buildBlocks() { for (Instruction i : instructions) @@ -97,6 +109,7 @@ public class Instructions { current = new Block(); current.begin = i; + findExceptionInfo(current, i); } i.block = current; current.instructions.add(i); diff --git a/src/main/java/info/sigterm/deob/deobfuscators/Jumps.java b/src/main/java/info/sigterm/deob/deobfuscators/Jumps.java index f22e1dd7f0..c4a1864bfd 100644 --- a/src/main/java/info/sigterm/deob/deobfuscators/Jumps.java +++ b/src/main/java/info/sigterm/deob/deobfuscators/Jumps.java @@ -33,9 +33,12 @@ public class Jumps Block block = blocks.get(i); Block prev = i > 0 ? blocks.get(i - 1) : null; - // only one thing jumps here if (block.begin.from.size() == 1 && prev != null && prev.end.isTerminal()) { + // not sure if this is right, just don't mess with blocks in exception ranges or directly handling them + if (block.exceptions.isEmpty() == false || block.handlers.isEmpty() == false || prev.exceptions.isEmpty() == false || prev.handlers.isEmpty() == false) + continue; + Instruction from = block.begin.from.get(0); // this instruction jumps to block if (from.block == block)