From 35b917eca12b6869b1a79f45a34ac82c545c5854 Mon Sep 17 00:00:00 2001 From: "honfika@gmail.com" Date: Wed, 2 Dec 2015 14:19:09 +0100 Subject: [PATCH] using a function which calculates the target address of the IfType instructions --- .../decompiler/flash/abc/avm2/AVM2Code.java | 16 ++++++++-------- .../deobfuscation/AVM2DeobfuscatorGetSet.java | 2 +- .../deobfuscation/AVM2DeobfuscatorJumps.java | 2 +- .../deobfuscation/AVM2DeobfuscatorRegisters.java | 2 +- .../AVM2DeobfuscatorRegistersOld.java | 2 +- .../deobfuscation/AVM2DeobfuscatorSimple.java | 4 ++-- .../deobfuscation/AVM2DeobfuscatorSimpleOld.java | 6 +++--- .../abc/avm2/instructions/AVM2Instruction.java | 6 +++++- .../decompiler/flash/action/swf4/ActionIf.java | 5 +++-- .../decompiler/flash/action/swf4/ActionJump.java | 7 ++++--- 10 files changed, 29 insertions(+), 23 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index b9baa6dce..2b816e015 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -733,14 +733,14 @@ public class AVM2Code implements Cloneable { } if (ins.definition instanceof JumpIns) { try { - pos = adr2pos(pos2adr(pos) + ins.getBytesLength() + ins.operands[0]); + pos = adr2pos(ins.getTargetAddress()); continue; } catch (ConvertException ex) { return false; } } else if (ins.definition instanceof IfTypeIns) { try { - int newpos = adr2pos(pos2adr(pos) + ins.getBytesLength() + ins.operands[0]); + int newpos = adr2pos(ins.getTargetAddress()); calculateDebugFileLine(debugFile, debugLine, newpos, abc, seen); } catch (ConvertException ex) { return false; @@ -1978,8 +1978,8 @@ public class AVM2Code implements Cloneable { } }*/ //Faster, but not so universal - if ((ins.definition instanceof JumpIns) || (ins.definition instanceof IfTypeIns)) { - long target = ins.getOffset() + ins.getBytesLength() + ins.operands[0]; + if (ins.definition instanceof IfTypeIns) { + long target = ins.getTargetAddress(); try { ins.operands[0] = updater.updateOperandOffset(ins.getOffset(), target, ins.operands[0]); } catch (ConvertException cex) { @@ -2322,14 +2322,14 @@ public class AVM2Code implements Cloneable { } if (ins.definition instanceof JumpIns) { try { - pos = adr2pos(pos2adr(pos) + ins.getBytesLength() + ins.operands[0]); + pos = adr2pos(ins.getTargetAddress()); continue; } catch (ConvertException ex) { return false; } } else if (ins.definition instanceof IfTypeIns) { try { - int newpos = adr2pos(pos2adr(pos) + ins.getBytesLength() + ins.operands[0]); + int newpos = adr2pos(ins.getTargetAddress()); walkCode(stats, newpos, stack, scope, abc); } catch (ConvertException ex) { return false; @@ -2459,14 +2459,14 @@ public class AVM2Code implements Cloneable { } if (ins.definition instanceof JumpIns) { try { - ip = adr2pos(pos2adr(ip) + ins.getBytesLength() + ins.operands[0]); + ip = adr2pos(ins.getTargetAddress()); continue; } catch (ConvertException ex) { logger.log(Level.FINE, null, ex); } } else if (ins.definition instanceof IfTypeIns) { try { - toVisit.add(adr2pos(pos2adr(ip) + ins.getBytesLength() + ins.operands[0])); + toVisit.add(adr2pos(ins.getTargetAddress())); toVisitLast.add(ip); } catch (ConvertException ex) { logger.log(Level.FINE, null, ex); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorGetSet.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorGetSet.java index 186571c2d..77570d080 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorGetSet.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorGetSet.java @@ -185,7 +185,7 @@ public class AVM2DeobfuscatorGetSet extends SWFDecompilerAdapter { boolean ifed = false; if (def instanceof JumpIns) { - long address = ins.getOffset() + ins.getBytesLength() + ins.operands[0]; + long address = ins.getTargetAddress(); idx = code.adr2pos(address); if (idx == -1) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorJumps.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorJumps.java index ffc18382b..5cce43766 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorJumps.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorJumps.java @@ -50,7 +50,7 @@ public class AVM2DeobfuscatorJumps extends SWFDecompilerAdapter { for (int i = 0; i < code.code.size(); i++) { AVM2Instruction ins = code.code.get(i); if (ins.definition instanceof JumpIns) { - long targetAddr = ins.getOffset() + ins.operands[0] + ins.getBytesLength(); + long targetAddr = ins.getTargetAddress(); { for (int r : refs.get(i)) { if (r >= 0) { //Not Exception start/end diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorRegisters.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorRegisters.java index 15eb875ca..c46c6170d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorRegisters.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorRegisters.java @@ -264,7 +264,7 @@ public class AVM2DeobfuscatorRegisters extends AVM2DeobfuscatorSimple { if (ins.definition instanceof JumpIns) { - long address = ins.getOffset() + ins.getBytesLength() + ins.operands[0]; + long address = ins.getTargetAddress(); idx = code.adr2pos(address);//code.indexOf(code.getByAddress(address)); if (idx == -1) { throw new TranslateException("Jump target not found: " + address); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorRegistersOld.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorRegistersOld.java index 7789dab9f..ed8747779 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorRegistersOld.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorRegistersOld.java @@ -228,7 +228,7 @@ public class AVM2DeobfuscatorRegistersOld extends AVM2DeobfuscatorSimpleOld { if (ins.definition instanceof JumpIns) { - long address = ins.getOffset() + ins.getBytesLength() + ins.operands[0]; + long address = ins.getTargetAddress(); idx = code.adr2pos(address);//code.indexOf(code.getByAddress(address)); if (idx == -1) { throw new TranslateException("Jump target not found: " + address); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorSimple.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorSimple.java index 8b72b57f6..a94a84efd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorSimple.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorSimple.java @@ -303,7 +303,7 @@ public class AVM2DeobfuscatorSimple extends SWFDecompilerAdapter { boolean ifed = false; if (def instanceof IfTypeIns && !(def instanceof JumpIns)) { - long address = ins.getOffset() + ins.getBytesLength() + ins.operands[0]; + long address = ins.getTargetAddress(); int nidx = code.adr2pos(address); AVM2Instruction tarIns = code.code.get(nidx); @@ -320,7 +320,7 @@ public class AVM2DeobfuscatorSimple extends SWFDecompilerAdapter { code.insertInstruction(idx, new AVM2Instruction(ins.getOffset(), DeobfuscatePopIns.getInstance(), null), true, body); } - idx = code.adr2pos(jumpIns.getOffset() + jumpIns.getBytesLength() + jumpIns.operands[0]); + idx = code.adr2pos(jumpIns.getTargetAddress()); } else { //System.err.println("replacing " + ins + " on " + idx + " with pop"); code.replaceInstruction(idx, new AVM2Instruction(ins.getOffset(), DeobfuscatePopIns.getInstance(), null), body); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorSimpleOld.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorSimpleOld.java index 57db7f911..92ddf22cd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorSimpleOld.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorSimpleOld.java @@ -342,7 +342,7 @@ public class AVM2DeobfuscatorSimpleOld extends SWFDecompilerAdapter { boolean ifed = false; if (def instanceof JumpIns) { - long address = ins.getOffset() + ins.getBytesLength() + ins.operands[0]; + long address = ins.getTargetAddress(); idx = code.adr2pos(address); if (idx == -1) { @@ -355,7 +355,7 @@ public class AVM2DeobfuscatorSimpleOld extends SWFDecompilerAdapter { GraphTargetItem top = stack.pop(); Object res = top.getResult(); - long address = ins.getOffset() + ins.getBytesLength() + ins.operands[0]; + long address = ins.getTargetAddress(); int nidx = code.adr2pos(address);//code.indexOf(code.getByAddress(address)); AVM2Instruction tarIns = code.code.get(nidx); @@ -372,7 +372,7 @@ public class AVM2DeobfuscatorSimpleOld extends SWFDecompilerAdapter { code.insertInstruction(idx, new AVM2Instruction(ins.getOffset(), DeobfuscatePopIns.getInstance(), null), true, body); } - idx = code.adr2pos(jumpIns.getOffset() + jumpIns.getBytesLength() + jumpIns.operands[0]); + idx = code.adr2pos(jumpIns.getTargetAddress()); } else { //System.err.println("replacing " + ins + " on " + idx + " with pop"); code.replaceInstruction(idx, new AVM2Instruction(ins.getOffset(), DeobfuscatePopIns.getInstance(), null), body); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java index c85124686..7f2177a88 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java @@ -379,12 +379,16 @@ public class AVM2Instruction implements Cloneable, GraphSourceItem { this.offset = offset; } + public long getTargetAddress() { + return offset + 4 /*getBytesLength()*/ + operands[0]; + } + @Override public List getBranches(GraphSource code) { List ret = new ArrayList<>(); if (definition instanceof IfTypeIns) { - ret.add(code.adr2pos(offset + getBytesLength() + operands[0])); + ret.add(code.adr2pos(getTargetAddress())); if (!(definition instanceof JumpIns)) { ret.add(code.adr2pos(offset + getBytesLength())); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionIf.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionIf.java index 4039f867b..7ee3b9fdb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionIf.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionIf.java @@ -126,10 +126,11 @@ public class ActionIf extends Action { public List getBranches(GraphSource code) { List ret = super.getBranches(code); int length = getTotalActionLength(); - int jmp = code.adr2pos(getAddress() + length + offset); + long targetAddress = getTargetAddress(); + int jmp = code.adr2pos(targetAddress); int after = code.adr2pos(getAddress() + length); if (jmp == -1) { - Logger.getLogger(ActionIf.class.getName()).log(Level.SEVERE, "Invalid IF jump to ofs" + Helper.formatAddress(getAddress() + length + offset)); + Logger.getLogger(ActionIf.class.getName()).log(Level.SEVERE, "Invalid IF jump to ofs" + Helper.formatAddress(targetAddress)); ret.add(after); } else { ret.add(jmp); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionJump.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionJump.java index 6079808f6..216b2903b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionJump.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionJump.java @@ -117,11 +117,12 @@ public class ActionJump extends Action { @Override public List getBranches(GraphSource code) { List ret = super.getBranches(code); - int length = getBytesLength(); - int ofs = code.adr2pos(getAddress() + length + offset); + long targetAddress = getTargetAddress(); + int ofs = code.adr2pos(targetAddress); if (ofs == -1) { + int length = getBytesLength(); ofs = code.adr2pos(getAddress() + length); - Logger.getLogger(ActionJump.class.getName()).log(Level.SEVERE, "Invalid jump to ofs" + Helper.formatAddress(getAddress() + length + offset) + " from ofs" + Helper.formatAddress(getAddress())); + Logger.getLogger(ActionJump.class.getName()).log(Level.SEVERE, "Invalid jump to ofs" + Helper.formatAddress(targetAddress) + " from ofs" + Helper.formatAddress(getAddress())); } ret.add(ofs); return ret;