diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index b1a9573ab..27bcf2fcb 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -2411,11 +2411,22 @@ public class AVM2Code implements Serializable { public boolean skipUsed = false; } - private static int removeTraps(boolean secondPass, boolean useVisited, List localData, Stack stack, List output, AVM2GraphSource code, int ip, int lastIp, List visited, HashMap decisions) { + private static int removeTraps(boolean secondPass, boolean useVisited, List localData, Stack stack, List output, AVM2GraphSource code, int ip, int lastIp, List visited, HashMap> visitedStates, HashMap decisions) { boolean debugMode = false; int ret = 0; iploop: while ((ip > -1) && ip < code.size()) { + + + + HashMap currentState = (HashMap) localData.get(2); + if (visitedStates.containsKey(ip)) { + HashMap lastState = visitedStates.get(ip); + if (lastState.equals(currentState)) { + break; + } + } + visitedStates.put(ip, (HashMap) currentState.clone()); if (useVisited && visited.contains(ip)) { break; } @@ -2536,7 +2547,7 @@ public class AVM2Code implements Serializable { } } - ret += removeTraps(secondPass, useVisited, localData, stack, output, code, condition ? branches.get(0) : branches.get(1), ip, visited, decisions); + ret += removeTraps(secondPass, useVisited, localData, stack, output, code, condition ? branches.get(0) : branches.get(1), ip, visited, visitedStates, decisions); } else { if (ins.isBranch() && (!ins.isJump())) { stack.pop(); @@ -2545,7 +2556,7 @@ public class AVM2Code implements Serializable { for (int b : branches) { Stack brStack = (Stack) stack.clone(); if (b >= 0) { - ret += removeTraps(secondPass, useVisited || (!ins.isJump()), localData, brStack, output, code, b, ip, visited, decisions); + ret += removeTraps(secondPass, useVisited || (!ins.isJump()), localData, brStack, output, code, b, ip, visited, visitedStates, decisions); } else { if (debugMode) { System.out.println("Negative branch:" + b); @@ -2565,7 +2576,7 @@ public class AVM2Code implements Serializable { public static int removeTraps(List localData, AVM2GraphSource code, int addr) { HashMap decisions = new HashMap(); - removeTraps(false, false, localData, new Stack(), new ArrayList(), code, code.adr2pos(addr), 0, new ArrayList(), decisions); - return removeTraps(true, false, localData, new Stack(), new ArrayList(), code, code.adr2pos(addr), 0, new ArrayList(), decisions); + removeTraps(false, false, localData, new Stack(), new ArrayList(), code, code.adr2pos(addr), 0, new ArrayList(), new HashMap>(), decisions); + return removeTraps(true, false, localData, new Stack(), new ArrayList(), code, code.adr2pos(addr), 0, new ArrayList(), new HashMap>(), decisions); } } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java index db5d92f7c..7fdf48898 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java @@ -16,6 +16,7 @@ */ package com.jpexs.decompiler.flash.abc.types; +import com.jpexs.decompiler.flash.Configuration; import com.jpexs.decompiler.flash.Main; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; @@ -42,6 +43,7 @@ public class MethodBody implements Cloneable, Serializable { public AVM2Code code; public ABCException exceptions[] = new ABCException[0]; public Traits traits = new Traits(); + private static boolean AUTO_DEOBFUSCATE = (Boolean) Configuration.getConfig("autoDeobfuscate", true); public List getExceptionEntries() { List ret = new ArrayList(); @@ -115,7 +117,9 @@ public class MethodBody implements Cloneable, Serializable { MethodBody b = (MethodBody) Helper.deepCopy(this); deobfuscated = b.code; deobfuscated.markMappedOffsets(); - deobfuscated.removeTraps(constants, b, abc); + if (AUTO_DEOBFUSCATE) { + deobfuscated.removeTraps(constants, b, abc); + } //deobfuscated.restoreControlFlow(constants, b); try { s += deobfuscated.toSource(path, isStatic, classIndex, abc, constants, method_info, b, hilight, getLocalRegNames(abc), scopeStack, isStaticInitializer, fullyQualifiedNames, initTraits);