diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscatorSimpleFast.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscatorSimpleFast.java index 126737e34..bd55ed00a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscatorSimpleFast.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscatorSimpleFast.java @@ -120,7 +120,7 @@ public class ActionDeobfuscatorSimpleFast implements SWFDecompilerListener { if (isGetTime && a2 instanceof ActionIf) { ActionJump jump = new ActionJump(0); ActionItem jumpItem = new ActionItem(jump); - jumpItem.jumpTarget = a2Item.jumpTarget; + jumpItem.setJumpTarget(a2Item.getJumpTarget()); iterator.remove(); // GetTime iterator.next(); iterator.remove(); // If @@ -142,7 +142,7 @@ public class ActionDeobfuscatorSimpleFast implements SWFDecompilerListener { if (a instanceof ActionGetTime && a1 instanceof ActionIncrement && a2 instanceof ActionIf) { ActionJump jump = new ActionJump(0); ActionItem jumpItem = new ActionItem(jump); - jumpItem.jumpTarget = a2Item.jumpTarget; + jumpItem.setJumpTarget(a2Item.getJumpTarget()); iterator.remove(); // GetTime iterator.next(); iterator.remove(); // Increment @@ -159,14 +159,14 @@ public class ActionDeobfuscatorSimpleFast implements SWFDecompilerListener { return false; } -// private boolean removeObfuscationIfs(FastActionList actions) throws InterruptedException { -// if (actions.isEmpty()) { -// return false; -// } -// -// actions.removeUnreachableActions(); -// actions.removeZeroJumps(); -// + private boolean removeObfuscationIfs(FastActionList actions) throws InterruptedException { + if (actions.isEmpty()) { + return false; + } + + actions.removeUnreachableActions(); + actions.removeZeroJumps(); + // FastActionListIterator iterator = actions.iterator(); // while (iterator.hasNext()) { // ActionItem actionItem = iterator.next(); @@ -217,9 +217,9 @@ public class ActionDeobfuscatorSimpleFast implements SWFDecompilerListener { // } // } // } -// -// return false; -// } + return false; + } + protected boolean isFakeName(String name) { for (char ch : name.toCharArray()) { if (ch > 31) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/fastactionlist/ActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/fastactionlist/ActionItem.java index b7d05ba64..040a3a92b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/fastactionlist/ActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/fastactionlist/ActionItem.java @@ -17,7 +17,9 @@ package com.jpexs.decompiler.flash.action.fastactionlist; import com.jpexs.decompiler.flash.action.Action; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * @@ -31,9 +33,13 @@ public class ActionItem { public ActionItem next; - public ActionItem jumpTarget; + private ActionItem jumpTarget; - public List containerLastActions; + public Set jumpsHere; + + public Set lastActionOf; + + private List containerLastActions; // 1 means reachable, 2 means reachable and processed int reachable; @@ -41,4 +47,100 @@ public class ActionItem { public ActionItem(Action action) { this.action = action; } + + public boolean isJumpTarget() { + return jumpsHere != null && !jumpsHere.isEmpty(); + } + + public boolean isContainerLastAction() { + return lastActionOf != null && !lastActionOf.isEmpty(); + } + + public void removeJumpTarget() { + if (jumpTarget == null) { + return; + } + + if (jumpTarget.jumpsHere != null) { + jumpTarget.jumpsHere.remove(this); + } + + jumpTarget = null; + } + + public ActionItem getJumpTarget() { + return jumpTarget; + } + + public Action getJumpTargetAction() { + return jumpTarget == null ? null : jumpTarget.action; + } + + public void setJumpTarget(ActionItem item) { + removeJumpTarget(); + + if (item == null) { + return; + } + + if (item.jumpsHere == null) { + item.jumpsHere = new HashSet<>(); + } + + item.jumpsHere.add(this); + jumpTarget = item; + } + + public List getContainerLastActions() { + return containerLastActions; + } + + public void removeContainerLastActions() { + if (containerLastActions == null) { + return; + } + + for (ActionItem lastAction : containerLastActions) { + if (lastAction.lastActionOf != null) { + lastAction.lastActionOf.remove(this); + } + } + + containerLastActions = null; + } + + public void replaceContainerLastAction(ActionItem oldItem, ActionItem newItem) { + if (containerLastActions == null) { + return; + } + + for (int i = 0; i < containerLastActions.size(); i++) { + if (containerLastActions.get(i) == oldItem) { + containerLastActions.set(i, newItem); + if (oldItem.lastActionOf != null) { + oldItem.lastActionOf.remove(this); + } + + newItem.ensureLastActionOf().add(this); + } + } + } + + public void setContainerLastActions(List lastActions) { + removeContainerLastActions(); + + for (ActionItem lastAction : lastActions) { + lastAction.ensureLastActionOf().add(this); + } + + containerLastActions = lastActions; + } + + private Set ensureLastActionOf() { + if (lastActionOf == null) { + lastActionOf = new HashSet<>(); + } + + return lastActionOf; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/fastactionlist/FastActionList.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/fastactionlist/FastActionList.java index 17d09313b..1568d5469 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/fastactionlist/FastActionList.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/fastactionlist/FastActionList.java @@ -108,7 +108,20 @@ public class FastActionList implements Collection { actionItemMap.remove(item.action); actionItemSet.remove(item); - replaceJumpTargets(item, next); + item.removeJumpTarget(); + item.removeContainerLastActions(); + + if (item.jumpsHere != null) { + for (ActionItem item1 : item.jumpsHere) { + item1.setJumpTarget(item.next); + } + } + + if (item.lastActionOf != null) { + for (ActionItem item1 : item.lastActionOf) { + item1.replaceContainerLastAction(item, item.prev); + } + } return next; } @@ -120,8 +133,8 @@ public class FastActionList implements Collection { } do { - if (item.jumpTarget == target) { - item.jumpTarget = newTarget; + if (item.getJumpTarget() == target) { + item.setJumpTarget(newTarget); } item = item.next; @@ -137,7 +150,7 @@ public class FastActionList implements Collection { do { Action action = item.action; if (action instanceof GraphSourceItemContainer) { - item.containerLastActions = getContainerLastActions(actions, action, actionItemMap); + item.setContainerLastActions(getContainerLastActions(actions, action, actionItemMap)); } item = item.next; @@ -213,11 +226,11 @@ public class FastActionList implements Collection { } } - item.jumpTarget = actionItemMap.get(targetAction); + item.setJumpTarget(actionItemMap.get(targetAction)); } if (target >= 0) { Action targetAction = actions.getByAddress(target); - item.jumpTarget = actionItemMap.get(targetAction); + item.setJumpTarget(actionItemMap.get(targetAction)); } item = item.next; @@ -251,7 +264,7 @@ public class FastActionList implements Collection { Action action = item.action; if (action instanceof ActionIf) { ActionIf aIf = (ActionIf) action; - Action target = item.jumpTarget == null ? null : item.jumpTarget.action; + Action target = item.getJumpTargetAction(); long offset; if (target != null) { offset = target.getAddress() - action.getAddress() - action.getTotalActionLength(); @@ -261,7 +274,7 @@ public class FastActionList implements Collection { aIf.setJumpOffset((int) offset); } else if (action instanceof ActionJump) { ActionJump aJump = (ActionJump) action; - Action target = item.jumpTarget == null ? null : item.jumpTarget.action; + Action target = item.getJumpTargetAction(); long offset; if (target != null) { offset = target.getAddress() - action.getAddress() - action.getTotalActionLength(); @@ -275,7 +288,7 @@ public class FastActionList implements Collection { } while (item != firstAction); } - private void updateActionStores(ActionList actionList) { + private void updateActionStores() { ActionItem item = firstAction; if (item == null) { return; @@ -285,17 +298,18 @@ public class FastActionList implements Collection { Action action = item.action; if (action instanceof ActionStore) { ActionStore aStore = (ActionStore) action; - Action nextActionAfterStore = item.jumpTarget == null ? null : item.jumpTarget.action; - Action a1 = action; + Action nextActionAfterStore = item.getJumpTargetAction(); + ActionItem item1 = item; List store = new ArrayList<>(); while (true) { - long address = a1.getAddress() + a1.getTotalActionLength(); - a1 = actionList.getByAddress(address); - if (a1 == null || a1 == nextActionAfterStore) { + item1 = item1.next; + if (item1 == firstAction || item1.action == nextActionAfterStore) { break; } - store.add(a1); + + store.add(item1.action); } + aStore.setStore(store); } @@ -313,7 +327,7 @@ public class FastActionList implements Collection { Action action = item.action; if (action instanceof GraphSourceItemContainer) { GraphSourceItemContainer container = (GraphSourceItemContainer) action; - List lastActions = item.containerLastActions; + List lastActions = item.getContainerLastActions(); long startAddress = action.getAddress() + container.getHeaderSize(); for (int j = 0; j < lastActions.size(); j++) { Action lastAction = lastActions.get(j).action; @@ -365,7 +379,7 @@ public class FastActionList implements Collection { do { Action action = item.action; if (action instanceof ActionJump) { - if (item.jumpTarget == item.next && item.jumpTarget != firstAction) { + if (item.getJumpTarget() == item.next && item.getJumpTarget() != firstAction) { item = removeItem(item); continue; } @@ -439,7 +453,7 @@ public class FastActionList implements Collection { } } - ActionItem target = item.jumpTarget; + ActionItem target = item.getJumpTarget(); if (target != null) { if (target.reachable == 0) { target.reachable = 1; @@ -447,7 +461,7 @@ public class FastActionList implements Collection { } if (action instanceof GraphSourceItemContainer) { - for (ActionItem lastActionItem : item.containerLastActions) { + for (ActionItem lastActionItem : item.getContainerLastActions()) { if (lastActionItem != null && lastActionItem.next != null && lastActionItem.next.reachable == 0) { lastActionItem.next.reachable = 1; } @@ -473,7 +487,7 @@ public class FastActionList implements Collection { ActionList result = new ActionList(resultList); updateActionAddressesAndLengths(); updateJumps(); - updateActionStores(result); + updateActionStores(); updateContainerSizes(); return result; }