From faa25369b9c478c01e7741e632f20777132bf4be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Mon, 15 Feb 2021 19:37:39 +0100 Subject: [PATCH] Allow assing AS2 classes with obfuscated identifiiers --- .../action/model/GetMemberActionItem.java | 17 +++++++++++++++-- .../action/model/GetVariableActionItem.java | 19 +++++++++++++++++-- .../action/model/clauses/ClassActionItem.java | 9 +++++++++ .../flash/gui/tagtree/TagTreeContextMenu.java | 6 +++++- 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/GetMemberActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/GetMemberActionItem.java index de2ae72c3..5b4d345c8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/GetMemberActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/GetMemberActionItem.java @@ -12,13 +12,16 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.model; import com.jpexs.decompiler.flash.IdentifiersDeobfuscation; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.action.swf5.ActionGetMember; +import com.jpexs.decompiler.flash.helpers.CodeFormatting; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.flash.helpers.StringBuilderTextWriter; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphSourceItemPos; @@ -39,6 +42,8 @@ public class GetMemberActionItem extends ActionItem { public final GraphTargetItem memberName; + public boolean printObfuscatedMemberName = false; + @Override public void visit(GraphTargetVisitorInterface visitor) { visitor.visit(object); @@ -54,7 +59,15 @@ public class GetMemberActionItem extends ActionItem { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { object.toString(writer, localData); - if ((!(memberName instanceof DirectValueActionItem)) || (!((DirectValueActionItem) memberName).isString()) || (!IdentifiersDeobfuscation.isValidName(false, ((DirectValueActionItem) memberName).toStringNoQuotes(localData)))) { + if ((memberName instanceof DirectValueActionItem) && printObfuscatedMemberName) { + writer.append("."); + StringBuilder sb = new StringBuilder(); + StringBuilderTextWriter sbw = new StringBuilderTextWriter(new CodeFormatting(), sb); + stripQuotes(memberName, localData, sbw); + writer.append(IdentifiersDeobfuscation.printIdentifier(false, sb.toString())); + return writer; + } + if (((!(memberName instanceof DirectValueActionItem)) || (!((DirectValueActionItem) memberName).isString()) || (!printObfuscatedMemberName && !IdentifiersDeobfuscation.isValidName(false, ((DirectValueActionItem) memberName).toStringNoQuotes(localData))))) { writer.append("["); memberName.toString(writer, localData); return writer.append("]"); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/GetVariableActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/GetVariableActionItem.java index a4287b54f..0613877ae 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/GetVariableActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/GetVariableActionItem.java @@ -12,13 +12,16 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.model; import com.jpexs.decompiler.flash.IdentifiersDeobfuscation; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.action.swf4.ActionGetVariable; +import com.jpexs.decompiler.flash.helpers.CodeFormatting; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.flash.helpers.StringBuilderTextWriter; import com.jpexs.decompiler.flash.helpers.hilight.HighlightData; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -47,6 +50,8 @@ public class GetVariableActionItem extends ActionItem { private boolean computedVariableComputed = false; + public boolean printObfuscatedName = false; + @Override public String toString() { return name.toString(); @@ -64,7 +69,17 @@ public class GetVariableActionItem extends ActionItem { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - if ((name instanceof DirectValueActionItem) && (((DirectValueActionItem) name).isString()) && (IdentifiersDeobfuscation.isValidNameWithDot(false, ((DirectValueActionItem) name).toStringNoQuotes(localData), "this", "super") + if (name instanceof DirectValueActionItem && printObfuscatedName) { + HighlightData srcData = getSrcData(); + srcData.localName = name.toStringNoQuotes(localData); + + StringBuilder sb = new StringBuilder(); + StringBuilderTextWriter sbw = new StringBuilderTextWriter(new CodeFormatting(), sb); + stripQuotes(name, localData, sbw); + writer.append(IdentifiersDeobfuscation.printIdentifier(false, sb.toString())); + return writer; + } + if ((name instanceof DirectValueActionItem) && (((DirectValueActionItem) name).isString()) && (printObfuscatedName || IdentifiersDeobfuscation.isValidNameWithDot(false, ((DirectValueActionItem) name).toStringNoQuotes(localData), "this", "super") || IdentifiersDeobfuscation.isValidNameWithSlash(((DirectValueActionItem) name).toStringNoQuotes(localData), "this", "super"))) { HighlightData srcData = getSrcData(); srcData.localName = name.toStringNoQuotes(localData); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ClassActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ClassActionItem.java index 8fe844112..e75017ae0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ClassActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ClassActionItem.java @@ -21,6 +21,7 @@ import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.action.model.ActionItem; import com.jpexs.decompiler.flash.action.model.FunctionActionItem; import com.jpexs.decompiler.flash.action.model.GetMemberActionItem; +import com.jpexs.decompiler.flash.action.model.GetVariableActionItem; import com.jpexs.decompiler.flash.action.model.SetMemberActionItem; import com.jpexs.decompiler.flash.action.parser.script.ActionSourceGenerator; import com.jpexs.decompiler.flash.action.parser.script.VariableActionItem; @@ -147,6 +148,14 @@ public class ClassActionItem extends ActionItem implements Block { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + GraphTargetItem clsName = className; + while (clsName instanceof GetMemberActionItem) { + ((GetMemberActionItem) clsName).printObfuscatedMemberName = true; + clsName = ((GetMemberActionItem) clsName).object; + } + if (clsName instanceof GetVariableActionItem) { + ((GetVariableActionItem) clsName).printObfuscatedName = true; + } writer.startClass(className.toStringNoQuotes(localData)); writer.append("class "); className.toStringNoQuotes(writer, localData); diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java index 04e2091b3..b1e970f49 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java @@ -1129,8 +1129,12 @@ public class TagTreeContextMenu extends JPopupMenu { doInit.spriteId = characterId; ActionScript2Parser parser = new ActionScript2Parser(swf, doInit); + + String[] parts = className.contains(".") ? className.split("\\.") : new String[]{className}; + DottedChain dc = new DottedChain(parts, ""); + try { - List actions = parser.actionsFromString("class " + className + "{}"); + List actions = parser.actionsFromString("class " + dc.toPrintableString(false) + "{}"); doInit.setActions(actions); } catch (ActionParseException | IOException | CompilationException ex) { //ignore