From c8208c0360a4d8fffb1d264d5eec36c42eac67f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 23 Aug 2014 20:47:00 +0200 Subject: [PATCH] AS1/2: using eval on invalid identifiers --- .../flash/action/Deobfuscation.java | 28 +- .../action/model/GetMemberActionItem.java | 215 +++++++------ .../action/model/GetVariableActionItem.java | 292 +++++++++--------- 3 files changed, 272 insertions(+), 263 deletions(-) diff --git a/src/com/jpexs/decompiler/flash/action/Deobfuscation.java b/src/com/jpexs/decompiler/flash/action/Deobfuscation.java index 330b8c67e..9e93af5ce 100644 --- a/src/com/jpexs/decompiler/flash/action/Deobfuscation.java +++ b/src/com/jpexs/decompiler/flash/action/Deobfuscation.java @@ -175,18 +175,8 @@ public class Deobfuscation { return null; } - public String deobfuscateName(String s, boolean firstUppercase, String usageType, HashMap namesMap, RenameType renameType, Map selected) { + public static boolean isValidName(String s){ boolean isValid = true; - if (usageType == null) { - usageType = "name"; - } - - if (selected != null) { - if (selected.containsKey(s)) { - return selected.get(s); - } - } - if (Action.isReservedWord(s)) { isValid = false; } @@ -206,6 +196,22 @@ public class Deobfuscation { isValid = false; } } + return isValid; + } + + public String deobfuscateName(String s, boolean firstUppercase, String usageType, HashMap namesMap, RenameType renameType, Map selected) { + boolean isValid = true; + if (usageType == null) { + usageType = "name"; + } + + if (selected != null) { + if (selected.containsKey(s)) { + return selected.get(s); + } + } + + isValid = isValidName(s); if (!isValid) { if (namesMap.containsKey(s)) { return namesMap.get(s); diff --git a/src/com/jpexs/decompiler/flash/action/model/GetMemberActionItem.java b/src/com/jpexs/decompiler/flash/action/model/GetMemberActionItem.java index 7cbd29f1c..3f0f569e7 100644 --- a/src/com/jpexs/decompiler/flash/action/model/GetMemberActionItem.java +++ b/src/com/jpexs/decompiler/flash/action/model/GetMemberActionItem.java @@ -1,109 +1,106 @@ -/* - * Copyright (C) 2010-2014 JPEXS - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.jpexs.decompiler.flash.action.model; - -import com.jpexs.decompiler.flash.SourceGeneratorLocalData; -import com.jpexs.decompiler.flash.action.Action; -import com.jpexs.decompiler.flash.action.swf5.ActionGetMember; -import com.jpexs.decompiler.flash.helpers.GraphTextWriter; -import com.jpexs.decompiler.graph.CompilationException; -import com.jpexs.decompiler.graph.GraphSourceItem; -import com.jpexs.decompiler.graph.GraphSourceItemPos; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.SourceGenerator; -import com.jpexs.decompiler.graph.model.LocalData; -import java.util.ArrayList; -import java.util.List; - -public class GetMemberActionItem extends ActionItem { - - public GraphTargetItem object; - public GraphTargetItem memberName; - - @Override - public List getAllSubItems() { - List ret = new ArrayList<>(); - ret.add(object); - return ret; - } - - public GetMemberActionItem(GraphSourceItem instruction, GraphTargetItem object, GraphTargetItem memberName) { - super(instruction, PRECEDENCE_PRIMARY); - this.object = object; - this.memberName = memberName; - } - - @Override - public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - object.toString(writer, localData); - if ((memberName instanceof DirectValueActionItem) && (((DirectValueActionItem) memberName).value instanceof String)) { - String memNameStr = (String) ((DirectValueActionItem) memberName).value; - if (!Action.isReservedWord(memNameStr)) { - writer.append("."); - return stripQuotes(memberName, localData, writer); - } - } - writer.append("["); - memberName.toString(writer, localData); - return writer.append("]"); - - } - - @Override - public List getNeededSources() { - List ret = super.getNeededSources(); - ret.addAll(object.getNeededSources()); - ret.addAll(memberName.getNeededSources()); - return ret; - } - - @Override - public int hashCode() { - int hash = 5; - hash = 47 * hash + (this.object != null ? this.object.hashCode() : 0); - hash = 47 * hash + (this.memberName != null ? this.memberName.hashCode() : 0); - return hash; - } - - @Override - public boolean equals(Object obj) { - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final GetMemberActionItem other = (GetMemberActionItem) obj; - if (this.object != other.object && (this.object == null || !this.object.equals(other.object))) { - return false; - } - if (this.memberName != other.memberName && (this.memberName == null || !this.memberName.equals(other.memberName))) { - return false; - } - return true; - } - - @Override - public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { - return toSourceMerge(localData, generator, object, memberName, new ActionGetMember()); - } - - @Override - public boolean hasReturnValue() { - return true; - } -} +/* + * Copyright (C) 2010-2014 JPEXS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.jpexs.decompiler.flash.action.model; + +import com.jpexs.decompiler.flash.SourceGeneratorLocalData; +import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.Deobfuscation; +import com.jpexs.decompiler.flash.action.swf5.ActionGetMember; +import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.CompilationException; +import com.jpexs.decompiler.graph.GraphSourceItem; +import com.jpexs.decompiler.graph.GraphSourceItemPos; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.model.LocalData; +import java.util.ArrayList; +import java.util.List; + +public class GetMemberActionItem extends ActionItem { + + public GraphTargetItem object; + public GraphTargetItem memberName; + + @Override + public List getAllSubItems() { + List ret = new ArrayList<>(); + ret.add(object); + return ret; + } + + public GetMemberActionItem(GraphSourceItem instruction, GraphTargetItem object, GraphTargetItem memberName) { + super(instruction, PRECEDENCE_PRIMARY); + this.object = object; + this.memberName = memberName; + } + + @Override + public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + object.toString(writer, localData); + if((!(memberName instanceof DirectValueActionItem)) || (!((DirectValueActionItem)memberName).isString()) ||(!Deobfuscation.isValidName(((DirectValueActionItem)memberName).toStringNoQuotes(localData)))){ + writer.append("["); + memberName.toString(writer, localData); + return writer.append("]"); + } + writer.append("."); + return stripQuotes(memberName, localData, writer); + } + + @Override + public List getNeededSources() { + List ret = super.getNeededSources(); + ret.addAll(object.getNeededSources()); + ret.addAll(memberName.getNeededSources()); + return ret; + } + + @Override + public int hashCode() { + int hash = 5; + hash = 47 * hash + (this.object != null ? this.object.hashCode() : 0); + hash = 47 * hash + (this.memberName != null ? this.memberName.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final GetMemberActionItem other = (GetMemberActionItem) obj; + if (this.object != other.object && (this.object == null || !this.object.equals(other.object))) { + return false; + } + if (this.memberName != other.memberName && (this.memberName == null || !this.memberName.equals(other.memberName))) { + return false; + } + return true; + } + + @Override + public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { + return toSourceMerge(localData, generator, object, memberName, new ActionGetMember()); + } + + @Override + public boolean hasReturnValue() { + return true; + } +} diff --git a/src/com/jpexs/decompiler/flash/action/model/GetVariableActionItem.java b/src/com/jpexs/decompiler/flash/action/model/GetVariableActionItem.java index faa619a7f..7f48e9362 100644 --- a/src/com/jpexs/decompiler/flash/action/model/GetVariableActionItem.java +++ b/src/com/jpexs/decompiler/flash/action/model/GetVariableActionItem.java @@ -1,143 +1,149 @@ -/* - * Copyright (C) 2010-2014 JPEXS - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.jpexs.decompiler.flash.action.model; - -import com.jpexs.decompiler.flash.SourceGeneratorLocalData; -import com.jpexs.decompiler.flash.action.swf4.ActionGetVariable; -import com.jpexs.decompiler.flash.ecma.Undefined; -import com.jpexs.decompiler.flash.helpers.GraphTextWriter; -import com.jpexs.decompiler.graph.CompilationException; -import com.jpexs.decompiler.graph.GraphSourceItem; -import com.jpexs.decompiler.graph.GraphSourceItemPos; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.SourceGenerator; -import com.jpexs.decompiler.graph.model.LocalData; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - -public class GetVariableActionItem extends ActionItem { - - public GraphTargetItem name; - private GraphTargetItem computedValue; - private Object computedResult; - private boolean computedCompiletime = false; - private boolean computedVariableComputed = false; - - @Override - public List getAllSubItems() { - List ret = new ArrayList<>(); - ret.add(name); - return ret; - } - - public GetVariableActionItem(GraphSourceItem instruction, GraphTargetItem value) { - super(instruction, PRECEDENCE_PRIMARY); - this.name = value; - } - - @Override - public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - return stripQuotes(name, localData, writer); - } - - @Override - public List getNeededSources() { - List ret = super.getNeededSources(); - ret.addAll(name.getNeededSources()); - return ret; - } - - @Override - public boolean isVariableComputed() { - return true; - } - - @Override - public boolean isCompileTime(Set dependencies) { - if (computedValue == null) { - return false; - } - return computedCompiletime; - } - - @Override - public Object getResult() { - if (computedValue == null) { - return new Undefined(); - } - return computedResult; - } - - public void setComputedValue(GraphTargetItem computedValue) { - this.computedValue = computedValue; - if (computedValue != null) { - computedCompiletime = computedValue.isCompileTime(); - if (computedCompiletime) { - computedResult = computedValue.getResult(); - } - computedVariableComputed = computedValue.isVariableComputed(); - } - } - - @Override - public int hashCode() { - int hash = 3; - hash = 13 * hash + (this.name != null ? this.name.hashCode() : 0); - return hash; - } - - @Override - public boolean equals(Object obj) { - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final GetVariableActionItem other = (GetVariableActionItem) obj; - if (this.name != other.name && (this.name == null || !this.name.equals(other.name))) { - return false; - } - return true; - } - - @Override - public boolean valueEquals(GraphTargetItem obj) { - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final GetVariableActionItem other = (GetVariableActionItem) obj; - if (this.name != other.name && (this.name == null || !this.name.valueEquals(other.name))) { - return false; - } - return true; - } - - @Override - public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { - return toSourceMerge(localData, generator, name, new ActionGetVariable()); - } - - @Override - public boolean hasReturnValue() { - return true; - } -} +/* + * Copyright (C) 2010-2014 JPEXS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.jpexs.decompiler.flash.action.model; + +import com.jpexs.decompiler.flash.SourceGeneratorLocalData; +import com.jpexs.decompiler.flash.action.Deobfuscation; +import com.jpexs.decompiler.flash.action.swf4.ActionGetVariable; +import com.jpexs.decompiler.flash.ecma.Undefined; +import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.CompilationException; +import com.jpexs.decompiler.graph.GraphSourceItem; +import com.jpexs.decompiler.graph.GraphSourceItemPos; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.model.LocalData; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class GetVariableActionItem extends ActionItem { + + public GraphTargetItem name; + private GraphTargetItem computedValue; + private Object computedResult; + private boolean computedCompiletime = false; + private boolean computedVariableComputed = false; + + @Override + public List getAllSubItems() { + List ret = new ArrayList<>(); + ret.add(name); + return ret; + } + + public GetVariableActionItem(GraphSourceItem instruction, GraphTargetItem value) { + super(instruction, PRECEDENCE_PRIMARY); + this.name = value; + } + + @Override + public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + if((!(name instanceof DirectValueActionItem)) || (!((DirectValueActionItem)name).isString()) ||(!Deobfuscation.isValidName(((DirectValueActionItem)name).toStringNoQuotes(localData)))){ + writer.append("eval("); + name.appendTo(writer, localData); + return writer.append(")"); + } + return stripQuotes(name, localData, writer); + } + + @Override + public List getNeededSources() { + List ret = super.getNeededSources(); + ret.addAll(name.getNeededSources()); + return ret; + } + + @Override + public boolean isVariableComputed() { + return true; + } + + @Override + public boolean isCompileTime(Set dependencies) { + if (computedValue == null) { + return false; + } + return computedCompiletime; + } + + @Override + public Object getResult() { + if (computedValue == null) { + return new Undefined(); + } + return computedResult; + } + + public void setComputedValue(GraphTargetItem computedValue) { + this.computedValue = computedValue; + if (computedValue != null) { + computedCompiletime = computedValue.isCompileTime(); + if (computedCompiletime) { + computedResult = computedValue.getResult(); + } + computedVariableComputed = computedValue.isVariableComputed(); + } + } + + @Override + public int hashCode() { + int hash = 3; + hash = 13 * hash + (this.name != null ? this.name.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final GetVariableActionItem other = (GetVariableActionItem) obj; + if (this.name != other.name && (this.name == null || !this.name.equals(other.name))) { + return false; + } + return true; + } + + @Override + public boolean valueEquals(GraphTargetItem obj) { + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final GetVariableActionItem other = (GetVariableActionItem) obj; + if (this.name != other.name && (this.name == null || !this.name.valueEquals(other.name))) { + return false; + } + return true; + } + + @Override + public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { + return toSourceMerge(localData, generator, name, new ActionGetVariable()); + } + + @Override + public boolean hasReturnValue() { + return true; + } +}