dynamic variable names fixed

This commit is contained in:
honfika@gmail.com
2015-09-23 16:39:13 +02:00
parent 01e92310cb
commit de66ba86e5
3 changed files with 39 additions and 2 deletions

View File

@@ -370,6 +370,28 @@ public class ActionDeobfuscator extends ActionDeobfuscatorSimple {
break;
}
if (action instanceof ActionGetVariable) {
if (stack.isEmpty()) {
return;
}
if (stack.peek() instanceof DirectValueActionItem) {
// avoid dynamic variable names, for example: eval("item" add i);
break;
}
}
if (action instanceof ActionSetVariable) {
if (stack.size() < 2) {
return;
}
if (stack.peek(2) instanceof DirectValueActionItem) {
// avoid dynamic variable names, for example: set("item" add i, 1);
break;
}
}
if (action instanceof ActionPush) {
ActionPush push = (ActionPush) action;
boolean ok = true;

View File

@@ -22,6 +22,7 @@ import com.jpexs.decompiler.flash.action.model.DirectValueActionItem;
import com.jpexs.decompiler.flash.action.model.EvalActionItem;
import com.jpexs.decompiler.flash.action.model.GetVariableActionItem;
import com.jpexs.decompiler.flash.action.model.GetVersionActionItem;
import com.jpexs.decompiler.flash.ecma.EcmaScript;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.TranslateStack;
import com.jpexs.decompiler.graph.model.LocalData;
@@ -42,7 +43,13 @@ public class ActionGetVariable extends Action {
@Override
public void translate(TranslateStack stack, List<GraphTargetItem> output, HashMap<Integer, String> regNames, HashMap<String, GraphTargetItem> variables, HashMap<String, GraphTargetItem> functions, int staticOperation, String path) {
GraphTargetItem name = stack.pop();
GraphTargetItem computedVal = variables.get(name.toStringNoQuotes(LocalData.empty));
String nameStr;
if (name instanceof DirectValueActionItem) {
nameStr = name.toStringNoQuotes(LocalData.empty);
} else {
nameStr = EcmaScript.toString(name.getResult());
}
GraphTargetItem computedVal = variables.get(nameStr);
if (name instanceof DirectValueActionItem && ((DirectValueActionItem) name).value.equals("/:$version")) {
stack.push(new GetVersionActionItem(this));
} else if (!(name instanceof DirectValueActionItem) && !(name instanceof GetVariableActionItem)) {

View File

@@ -21,6 +21,7 @@ import com.jpexs.decompiler.flash.action.Action;
import com.jpexs.decompiler.flash.action.StoreTypeAction;
import com.jpexs.decompiler.flash.action.model.ConstantPool;
import com.jpexs.decompiler.flash.action.model.DecrementActionItem;
import com.jpexs.decompiler.flash.action.model.DirectValueActionItem;
import com.jpexs.decompiler.flash.action.model.GetVariableActionItem;
import com.jpexs.decompiler.flash.action.model.IncrementActionItem;
import com.jpexs.decompiler.flash.action.model.PostDecrementActionItem;
@@ -30,6 +31,7 @@ import com.jpexs.decompiler.flash.action.model.StoreRegisterActionItem;
import com.jpexs.decompiler.flash.action.model.TemporaryRegister;
import com.jpexs.decompiler.flash.action.model.operations.PreDecrementActionItem;
import com.jpexs.decompiler.flash.action.model.operations.PreIncrementActionItem;
import com.jpexs.decompiler.flash.ecma.EcmaScript;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.TranslateStack;
import com.jpexs.decompiler.graph.model.LocalData;
@@ -51,7 +53,13 @@ public class ActionSetVariable extends Action implements StoreTypeAction {
public void translate(TranslateStack stack, List<GraphTargetItem> output, HashMap<Integer, String> regNames, HashMap<String, GraphTargetItem> variables, HashMap<String, GraphTargetItem> functions, int staticOperation, String path) {
GraphTargetItem value = stack.pop().getThroughDuplicate();
GraphTargetItem name = stack.pop();
variables.put(name.toStringNoQuotes(LocalData.empty), value);
String nameStr;
if (name instanceof DirectValueActionItem) {
nameStr = name.toStringNoQuotes(LocalData.empty);
} else {
nameStr = EcmaScript.toString(name.getResult());
}
variables.put(nameStr, value);
if (value instanceof IncrementActionItem) {
GraphTargetItem obj = ((IncrementActionItem) value).object;
if (!stack.isEmpty() && stack.peek().valueEquals(obj)) {