diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/BaseLocalData.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/BaseLocalData.java index 92639e5a0..2a0bd7814 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/BaseLocalData.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/BaseLocalData.java @@ -20,6 +20,7 @@ import com.jpexs.decompiler.graph.GraphPart; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.SecondPassData; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Set; /** @@ -48,6 +49,11 @@ public abstract class BaseLocalData { * SWF version */ public int swfVersion = -1; + + /** + * Used deobfuscations + */ + public Set usedDeobfuscations = new LinkedHashSet<>(); /** * Constructor. diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/IdentifiersDeobfuscation.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/IdentifiersDeobfuscation.java index 08af9b616..c31359eb5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/IdentifiersDeobfuscation.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/IdentifiersDeobfuscation.java @@ -31,6 +31,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Random; +import java.util.Set; import java.util.regex.Pattern; /** @@ -539,13 +540,15 @@ public class IdentifiersDeobfuscation { /** * Ensures identifier is valid and if not, uses paragraph syntax. * + * @param swf SWF + * @param used Set of used obfuscated identifiers in this script - the method will add to it * @param as3 Is ActionScript3 * @param s Identifier * @param validExceptions Exceptions which are valid (e.g. some reserved * words) * @return Printable identifier */ - public static String printIdentifier(SWF swf, boolean as3, String s, String... validExceptions) { + public static String printIdentifier(SWF swf, Set used, boolean as3, String s, String... validExceptions) { if (s == null || s.isEmpty()) { return ""; } @@ -553,6 +556,7 @@ public class IdentifiersDeobfuscation { if (Configuration.useSafeStr.get() && as3) { Map map = swf.getAs3ObfuscatedIdentifiers(); if (map.containsKey(s)) { + used.add(s); return map.get(s); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java index 9867fee50..2b3cf64e9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -3367,7 +3367,7 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { } return String.join(File.separator, parts); } - return DottedChain.parseNoSuffix(pkg.getName()).toPrintableString(this, false); + return DottedChain.parseNoSuffix(pkg.getName()).toPrintableString(new LinkedHashSet<>(), this, false); } } @@ -3378,7 +3378,7 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { String expName = tag.getSwf().getExportName(tag.getCharacterId()); if (expName != null && !expName.isEmpty()) { String[] pathParts = expName.contains(".") ? expName.split("\\.") : new String[]{expName}; - return IdentifiersDeobfuscation.printIdentifier(this, false, pathParts[pathParts.length - 1]); + return IdentifiersDeobfuscation.printIdentifier(this, new LinkedHashSet<>(), false, pathParts[pathParts.length - 1]); } } @@ -3717,7 +3717,7 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { GraphSourceItem ins = code.get(ip); if (debugMode) { - System.err.println("Visit " + ip + ": ofs" + Helper.formatAddress(((Action) ins).getAddress()) + ":" + ((Action) ins).getASMSource(new ActionList(code.getCharset()), new HashSet<>(), ScriptExportMode.PCODE) + " stack:" + Helper.stackToString(stack, LocalData.create(new ConstantPool(), swf))); + System.err.println("Visit " + ip + ": ofs" + Helper.formatAddress(((Action) ins).getAddress()) + ":" + ((Action) ins).getASMSource(new ActionList(code.getCharset()), new HashSet<>(), ScriptExportMode.PCODE) + " stack:" + Helper.stackToString(stack, LocalData.create(new ConstantPool(), swf, new LinkedHashSet<>()))); } if (ins.isExit()) { break; @@ -3881,7 +3881,7 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { * @throws InterruptedException On interrupt */ private static void getVariables(SWF swf, boolean insideDoInitAction, List> variables, List functions, HashMap strings, HashMap usageTypes, ActionGraphSource code, int addr, String path) throws InterruptedException { - ActionLocalData localData = new ActionLocalData(null, insideDoInitAction, new HashMap<>() /*??*/); + ActionLocalData localData = new ActionLocalData(null, insideDoInitAction, new HashMap<>() /*??*/, new LinkedHashSet<>()); getVariables(swf, null, localData, new TranslateStack(path), new ArrayList<>(), code, code.adr2pos(addr), variables, functions, strings, new ArrayList<>(), usageTypes, path); } @@ -4176,7 +4176,7 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { int staticOperation = 0; List dec; try { - dec = Action.actionsToTree(false, new HashMap<>() /*??*/, true /*Yes, inside doInitAction*/, false, dia.getActions(), version, staticOperation, ""/*FIXME*/, getCharset()); + dec = Action.actionsToTree(new LinkedHashSet<>(), false, new HashMap<>() /*??*/, true /*Yes, inside doInitAction*/, false, dia.getActions(), version, staticOperation, ""/*FIXME*/, getCharset()); } catch (EmptyStackException ex) { continue; } @@ -5982,10 +5982,10 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { if (firstTrait instanceof TraitClass) { int cindex = ((TraitClass) firstTrait).class_info; Multiname superName = documentPack.abc.constants.getMultiname(documentPack.abc.instance_info.get(cindex).super_index); - String parentClass = superName.getNameWithNamespace(documentPack.abc, documentPack.abc.constants, true).toRawString(); + String parentClass = superName.getNameWithNamespace(new LinkedHashSet<>(), documentPack.abc, documentPack.abc.constants, true).toRawString(); if ("mx.managers.SystemManager".equals(parentClass)) { for (Trait t : documentPack.abc.instance_info.get(cindex).instance_traits.traits) { - if ((t instanceof TraitMethodGetterSetter) && "info".equals(t.getName(documentPack.abc).getName(documentPack.abc, documentPack.abc.constants, new ArrayList<>(), true, true))) { + if ((t instanceof TraitMethodGetterSetter) && "info".equals(t.getName(documentPack.abc).getName(new LinkedHashSet<>(), documentPack.abc, documentPack.abc.constants, new ArrayList<>(), true, true))) { int mi = ((TraitMethodGetterSetter) t).method_info; try { @@ -5995,7 +5995,7 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { if (documentPack.getOpenable() instanceof SWF) { swfVersion = ((SWF) documentPack.getOpenable()).version; } - documentPack.abc.findBody(mi).convert(swfVersion, callStack, getAbcIndex(), new ConvertData(), "??", ScriptExportMode.AS, true, mi, documentPack.scriptIndex, cindex, documentPack.abc, t, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>()); + documentPack.abc.findBody(mi).convert(swfVersion, callStack, getAbcIndex(), new ConvertData(), "??", ScriptExportMode.AS, true, mi, documentPack.scriptIndex, cindex, documentPack.abc, t, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>(), new LinkedHashSet<>()); List infos = documentPack.abc.findBody(mi).convertedItems; if (!infos.isEmpty()) { if (infos.get(0) instanceof IfItem) { @@ -6073,13 +6073,13 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { int cinit = p.abc.class_info.get(ci).cinit_index; callStack = new ArrayList<>(); callStack.add(p.abc.findBody(cinit)); - p.abc.findBody(cinit).convert(swfVersion, callStack, getAbcIndex(), new ConvertData(), "??", ScriptExportMode.AS, true, cinit, p.scriptIndex, cindex, p.abc, t, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>()); + p.abc.findBody(cinit).convert(swfVersion, callStack, getAbcIndex(), new ConvertData(), "??", ScriptExportMode.AS, true, cinit, p.scriptIndex, cindex, p.abc, t, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>(), new LinkedHashSet<>()); List cinitBody = p.abc.findBody(cinit).convertedItems; for (GraphTargetItem cit : cinitBody) { if (cit instanceof SetPropertyAVM2Item) { if (cit.value instanceof GetLexAVM2Item) { GetLexAVM2Item gl = (GetLexAVM2Item) cit.value; - ignoredClasses.add(gl.propertyName.getNameWithNamespace(p.abc, p.abc.constants, true).toRawString()); + ignoredClasses.add(gl.propertyName.getNameWithNamespace(new LinkedHashSet<>(), p.abc, p.abc.constants, true).toRawString()); } } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java index 7d6d7f5ce..35eab0bca 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java @@ -782,7 +782,7 @@ public class ABC implements Openable { int mIndex = body.getCode().code.get(ip).operands[0]; if (mIndex > 0 && mIndex < constants.getMultinameCount()) { Multiname m = constants.getMultiname(mIndex); - if (m.getNameWithNamespace(this, constants, true).toRawString().equals("flash.utils.getDefinitionByName")) { + if (m.getNameWithNamespace(new LinkedHashSet<>(), this, constants, true).toRawString().equals("flash.utils.getDefinitionByName")) { if (ip > 0) { if (body.getCode().code.get(ip - 1).definition instanceof PushStringIns) { int strIndex = body.getCode().code.get(ip - 1).operands[0]; @@ -1352,7 +1352,7 @@ public class ABC implements Openable { */ public MethodBody findBodyClassInitializerByClass(String classNameWithSuffix) { for (int i = 0; i < instance_info.size(); i++) { - if (classNameWithSuffix.equals(constants.getMultiname(instance_info.get(i).name_index).getName(this, constants, null, true, true))) { + if (classNameWithSuffix.equals(constants.getMultiname(instance_info.get(i).name_index).getName(new LinkedHashSet<>(), this, constants, null, true, true))) { MethodBody body = findBody(class_info.get(i).cinit_index); if (body != null) { return body; @@ -1371,7 +1371,7 @@ public class ABC implements Openable { */ public MethodBody findBodyInstanceInitializerByClass(String classNameWithSuffix) { for (int i = 0; i < instance_info.size(); i++) { - if (classNameWithSuffix.equals(constants.getMultiname(instance_info.get(i).name_index).getName(this, constants, null, true, true))) { + if (classNameWithSuffix.equals(constants.getMultiname(instance_info.get(i).name_index).getName(new LinkedHashSet<>(), this, constants, null, true, true))) { MethodBody body = findBody(instance_info.get(i).iinit_index); if (body != null) { return body; @@ -1391,11 +1391,11 @@ public class ABC implements Openable { */ public MethodBody findBodyByClassAndName(String classNameWithSuffix, String methodNameWithSuffix) { for (int i = 0; i < instance_info.size(); i++) { - if (classNameWithSuffix.equals(constants.getMultiname(instance_info.get(i).name_index).getName(this, constants, null, true, true))) { + if (classNameWithSuffix.equals(constants.getMultiname(instance_info.get(i).name_index).getName(new LinkedHashSet<>(), this, constants, null, true, true))) { for (Trait t : instance_info.get(i).instance_traits.traits) { if (t instanceof TraitMethodGetterSetter) { TraitMethodGetterSetter t2 = (TraitMethodGetterSetter) t; - if (methodNameWithSuffix.equals(t2.getName(this).getName(this, constants, null, true, true))) { + if (methodNameWithSuffix.equals(t2.getName(this).getName(new LinkedHashSet<>(), this, constants, null, true, true))) { MethodBody body = findBody(t2.method_info); if (body != null) { return body; @@ -1407,7 +1407,7 @@ public class ABC implements Openable { for (Trait t : class_info.get(i).static_traits.traits) { if (t instanceof TraitMethodGetterSetter) { TraitMethodGetterSetter t2 = (TraitMethodGetterSetter) t; - if (methodNameWithSuffix.equals(t2.getName(this).getName(this, constants, null, true, true))) { + if (methodNameWithSuffix.equals(t2.getName(this).getName(new LinkedHashSet<>(), this, constants, null, true, true))) { MethodBody body = findBody(t2.method_info); if (body != null) { return body; @@ -1520,7 +1520,7 @@ public class ABC implements Openable { TraitSlotConst s = ((TraitSlotConst) t); if (s.isNamespace()) { String key = constants.getNamespace(s.value_index).getName(constants).toRawString(); // assume not null - DottedChain val = constants.getMultiname(s.name_index).getNameWithNamespace(this, constants, true); + DottedChain val = constants.getMultiname(s.name_index).getNameWithNamespace(new LinkedHashSet<>(), this, constants, true); map.put(key, val); } } @@ -1701,7 +1701,7 @@ public class ABC implements Openable { for (int multinameIndex = 1; multinameIndex < constants.getMultinameCount(); multinameIndex++) { Multiname m = constants.getMultiname(multinameIndex); if (m.kind == Multiname.QNAME || m.kind == Multiname.QNAMEA) { - String name = m.getName(this, constants, new ArrayList<>(), true, false); + String name = m.getName(new LinkedHashSet<>(), this, constants, new ArrayList<>(), true, false); List indices = nameToQNameIndices.get(name); if (indices == null) { indices = new ArrayList<>(); @@ -1772,7 +1772,7 @@ public class ABC implements Openable { if (classId > -1) { for (Trait t : instance_info.get(classId).instance_traits.traits) { if (t instanceof TraitMethodGetterSetter) { - if (t.getName(this).getName(this, constants, null, true, true).equals(methodNameWithSuffix)) { + if (t.getName(this).getName(new LinkedHashSet<>(), this, constants, null, true, true).equals(methodNameWithSuffix)) { return ((TraitMethodGetterSetter) t).method_info; } } @@ -1792,7 +1792,7 @@ public class ABC implements Openable { if (classId > -1) { for (Trait t : instance_info.get(classId).instance_traits.traits) { if (t instanceof TraitMethodGetterSetter) { - if (t.getName(this).getName(this, constants, null, true, true).equals(methodNameWithSuffix)) { + if (t.getName(this).getName(new LinkedHashSet<>(), this, constants, null, true, true).equals(methodNameWithSuffix)) { return findBodyIndex(((TraitMethodGetterSetter) t).method_info); } } @@ -1835,7 +1835,7 @@ public class ABC implements Openable { if (instance_info.get(c).deleted) { continue; } - DottedChain s = constants.getMultiname(instance_info.get(c).name_index).getNameWithNamespace(this, constants, true); + DottedChain s = constants.getMultiname(instance_info.get(c).name_index).getNameWithNamespace(new LinkedHashSet<>(), this, constants, true); if (nameWithSuffix.equals(s.toRawString())) { return c; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java index 9be676cd6..24d93ca7d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java @@ -297,6 +297,7 @@ public class AVM2LocalData extends BaseLocalData { seenMethods = localData.seenMethods; bottomSetLocals = localData.bottomSetLocals; swfVersion = localData.swfVersion; + usedDeobfuscations = localData.usedDeobfuscations; } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ClassPath.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ClassPath.java index c9680e21d..aaf62200b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ClassPath.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ClassPath.java @@ -19,6 +19,7 @@ package com.jpexs.decompiler.flash.abc; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.graph.DottedChain; import java.io.Serializable; +import java.util.LinkedHashSet; import java.util.Objects; /** @@ -70,7 +71,7 @@ public class ClassPath implements Serializable { */ @Override public String toString() { - return packageStr.add(className, namespaceSuffix).toPrintableString(swf, true); + return packageStr.add(className, namespaceSuffix).toPrintableString(new LinkedHashSet<>() /*???*/, swf, true); } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java index e138525e6..d49fa84e2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java @@ -50,6 +50,8 @@ import com.jpexs.decompiler.flash.treeitems.AS3ClassTreeItem; import com.jpexs.decompiler.flash.treeitems.Openable; import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.ScopeStack; +import com.jpexs.decompiler.graph.model.CommentItem; +import com.jpexs.decompiler.graph.model.LocalData; import com.jpexs.helpers.CancellableWorker; import com.jpexs.helpers.Helper; import com.jpexs.helpers.Path; @@ -61,6 +63,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -73,6 +76,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.logging.Level; import java.util.logging.Logger; +import natorder.NaturalOrderComparator; /** * Script pack class. A script pack is a collection of traits that are in the @@ -207,7 +211,7 @@ public class ScriptPack extends AS3ClassTreeItem { Multiname name = abc.script_info.get(scriptIndex).traits.traits.get(t).getName(abc); int nskind = name.getSimpleNamespaceKind(abc.constants); if ((nskind == Namespace.KIND_PACKAGE) || (nskind == Namespace.KIND_PACKAGE_INTERNAL)) { - scriptName = name.getName(abc, abc.constants, null, false, true); + scriptName = name.getName(new LinkedHashSet<>(), abc, abc.constants, null, false, true); } } return scriptName; @@ -247,6 +251,7 @@ public class ScriptPack extends AS3ClassTreeItem { /** * Converts the script pack. * + * @param usedDeobfuscations Used deobfuscations * @param abcIndex Abc indexing * @param writer Writer * @param traits Traits @@ -255,7 +260,7 @@ public class ScriptPack extends AS3ClassTreeItem { * @param parallel Parallel * @throws InterruptedException On interrupt */ - public void convert(AbcIndexing abcIndex, final NulWriter writer, final List traits, final ConvertData convertData, final ScriptExportMode exportMode, final boolean parallel) throws InterruptedException { + public void convert(Set usedDeobfuscations, AbcIndexing abcIndex, final NulWriter writer, final List traits, final ConvertData convertData, final ScriptExportMode exportMode, final boolean parallel) throws InterruptedException { int swfVersion = -1; if (getOpenable() instanceof SWF) { @@ -274,7 +279,7 @@ public class ScriptPack extends AS3ClassTreeItem { writer.mark(); List callStack = new ArrayList<>(); callStack.add(abc.bodies.get(sinit_bodyIndex)); - abc.bodies.get(sinit_bodyIndex).convert(swfVersion, callStack, abcIndex, convertData, path + "/.scriptinitializer", exportMode, true, sinit_index, scriptIndex, -1, abc, null, new ScopeStack(), GraphTextWriter.TRAIT_SCRIPT_INITIALIZER, writer, new ArrayList<>(), abc.script_info.get(scriptIndex).traits, true, new HashSet<>(), initClasses); + abc.bodies.get(sinit_bodyIndex).convert(swfVersion, callStack, abcIndex, convertData, path + "/.scriptinitializer", exportMode, true, sinit_index, scriptIndex, -1, abc, null, new ScopeStack(), GraphTextWriter.TRAIT_SCRIPT_INITIALIZER, writer, new ArrayList<>(), abc.script_info.get(scriptIndex).traits, true, new HashSet<>(), initClasses, usedDeobfuscations); scriptInitializerIsEmpty = !writer.getMark(); } @@ -286,9 +291,9 @@ public class ScriptPack extends AS3ClassTreeItem { Multiname name = trait.getName(abc); int nskind = name.getSimpleNamespaceKind(abc.constants); if ((nskind == Namespace.KIND_PACKAGE) || (nskind == Namespace.KIND_PACKAGE_INTERNAL)) { - trait.convertPackaged(swfVersion, abcIndex, null, convertData, "", abc, false, exportMode, scriptIndex, -1, writer, new ArrayList<>(), parallel, scopeStack); + trait.convertPackaged(usedDeobfuscations, swfVersion, abcIndex, null, convertData, "", abc, false, exportMode, scriptIndex, -1, writer, new ArrayList<>(), parallel, scopeStack); } else { - trait.convert(swfVersion, abcIndex, null, convertData, "", abc, false, exportMode, scriptIndex, -1, writer, new ArrayList<>(), parallel, scopeStack); + trait.convert(usedDeobfuscations, swfVersion, abcIndex, null, convertData, "", abc, false, exportMode, scriptIndex, -1, writer, new ArrayList<>(), parallel, scopeStack); } } } @@ -296,6 +301,7 @@ public class ScriptPack extends AS3ClassTreeItem { /** * Append script to writer. * + * @param usedDeobfuscations Used deobfuscations * @param abcIndex Abc indexing * @param writer Writer * @param traits Traits @@ -306,7 +312,8 @@ public class ScriptPack extends AS3ClassTreeItem { * class * @throws InterruptedException On interrupt */ - private void appendTo(AbcIndexing abcIndex, GraphTextWriter writer, List traits, ConvertData convertData, ScriptExportMode exportMode, boolean parallel, boolean exportAllClasses) throws InterruptedException { + @SuppressWarnings("unchecked") + private void appendTo(Set usedDeobfuscations, AbcIndexing abcIndex, GraphTextWriter writer, List traits, ConvertData convertData, ScriptExportMode exportMode, boolean parallel, boolean exportAllClasses) throws InterruptedException { int swfVersion = -1; if (getOpenable() instanceof SWF) { @@ -325,7 +332,7 @@ public class ScriptPack extends AS3ClassTreeItem { continue; } - String fullName = t.getName(abc).getNameWithNamespace(abc, abc.constants, false).toPrintableString(abc.getSwf(), true); + String fullName = t.getName(abc).getNameWithNamespace(usedDeobfuscations, abc, abc.constants, false).toPrintableString(usedDeobfuscations, abc.getSwf(), true); writer.appendNoHilight("include \"" + fullName.replace(".", "/") + ".as\";").newLine(); } writer.newLine(); @@ -355,7 +362,7 @@ public class ScriptPack extends AS3ClassTreeItem { writer.newLine(); } writer.startTrait(traitIndicesList.get(t)); - trait.toStringPackaged(swfVersion, abcIndex, null, convertData, "", abc, false, exportMode, scriptIndex, -1, writer, fullyQualifiedNames, parallel, false); + trait.toStringPackaged(usedDeobfuscations, swfVersion, abcIndex, null, convertData, "", abc, false, exportMode, scriptIndex, -1, writer, fullyQualifiedNames, parallel, false); if (!(trait instanceof TraitClass)) { writer.endTrait(); @@ -374,7 +381,7 @@ public class ScriptPack extends AS3ClassTreeItem { if (isSimple) { ignorePackage = getPathPackage(); } - Trait.writeImports(traitList, script_init, abcIndex, scriptIndex, -1, true, abc, writer, ignorePackage, fullyQualifiedNames); + Trait.writeImports(usedDeobfuscations, traitList, script_init, abcIndex, scriptIndex, -1, true, abc, writer, ignorePackage, fullyQualifiedNames); first = true; for (int t = 0; t < traitList.size(); t++) { @@ -386,7 +393,7 @@ public class ScriptPack extends AS3ClassTreeItem { writer.newLine(); } writer.startTrait(traitIndicesList.get(t)); - trait.toString(swfVersion, abcIndex, pkg, null, convertData, "", abc, false, exportMode, scriptIndex, -1, writer, new ArrayList<>(), parallel, false); + trait.toString(usedDeobfuscations, swfVersion, abcIndex, pkg, null, convertData, "", abc, false, exportMode, scriptIndex, -1, writer, new ArrayList<>(), parallel, false); if (!(trait instanceof TraitClass)) { writer.endTrait(); @@ -417,9 +424,9 @@ public class ScriptPack extends AS3ClassTreeItem { Multiname name = trait.getName(abc); int nskind = name.getSimpleNamespaceKind(abc.constants); if ((nskind == Namespace.KIND_PACKAGE) || (nskind == Namespace.KIND_PACKAGE_INTERNAL)) { - trait.toStringPackaged(swfVersion, abcIndex, null, convertData, "", abc, false, exportMode, scriptIndex, -1, writer, new ArrayList<>(), parallel, false); + trait.toStringPackaged(usedDeobfuscations, swfVersion, abcIndex, null, convertData, "", abc, false, exportMode, scriptIndex, -1, writer, new ArrayList<>(), parallel, false); } else { - trait.toString(swfVersion, abcIndex, pkg, null, convertData, "", abc, false, exportMode, scriptIndex, -1, writer, new ArrayList<>(), parallel, false); + trait.toString(usedDeobfuscations, swfVersion, abcIndex, pkg, null, convertData, "", abc, false, exportMode, scriptIndex, -1, writer, new ArrayList<>(), parallel, false); } writer.endTrait(); first = false; @@ -436,7 +443,7 @@ public class ScriptPack extends AS3ClassTreeItem { if (!first) { writer.newLine(); } - abc.bodies.get(bodyIndex).toString(swfVersion, callStack, abcIndex, path + "/.scriptinitializer", exportMode, abc, null, writer, fullyQualifiedNames, new HashSet<>()); + abc.bodies.get(bodyIndex).toString(usedDeobfuscations, swfVersion, callStack, abcIndex, path + "/.scriptinitializer", exportMode, abc, null, writer, fullyQualifiedNames, new HashSet<>()); } else { writer.append(""); } @@ -458,6 +465,22 @@ public class ScriptPack extends AS3ClassTreeItem { } } } + if (!usedDeobfuscations.isEmpty()) { + writer.newLine(); + List commentLines = new ArrayList<>(); + commentLines.add("@deobfuscated"); + Map fullMap = abc.getSwf().getAs3ObfuscatedIdentifiers(); + int i = 0; + for (String obfuscated : usedDeobfuscations) { + String deobfuscated = fullMap.get(obfuscated); + commentLines.add(deobfuscated + " = \"" + Helper.escapeActionScriptString(obfuscated) + "\""); + i++; + } + commentLines.sort(new NaturalOrderComparator()); + commentLines.add(""); + String[] commentLinesArr = commentLines.toArray(new String[commentLines.size()]); + new CommentItem(commentLinesArr).appendTo(writer, LocalData.empty); + } } /** @@ -475,12 +498,13 @@ public class ScriptPack extends AS3ClassTreeItem { */ public void toSource(AbcIndexing abcIndex, GraphTextWriter writer, final List traits, final ConvertData convertData, final ScriptExportMode exportMode, final boolean parallel, boolean ignoreFrameScripts, boolean exportAllClasses) throws InterruptedException { writer.suspendMeasure(); + Set usedDeobfuscations = Collections.synchronizedSet(new LinkedHashSet<>()); int timeout = Configuration.decompilationTimeoutFile.get(); try { CancellableWorker.call("script.scriptPack.toSource", new Callable() { @Override public Void call() throws Exception { - convert(abcIndex, new NulWriter(), traits, convertData, exportMode, parallel); + convert(usedDeobfuscations, abcIndex, new NulWriter(), traits, convertData, exportMode, parallel); return null; } }, timeout, TimeUnit.SECONDS); @@ -511,7 +535,7 @@ public class ScriptPack extends AS3ClassTreeItem { } writer.continueMeasure(); - appendTo(abcIndex, writer, traits, convertData, exportMode, parallel, exportAllClasses); + appendTo(usedDeobfuscations, abcIndex, writer, traits, convertData, exportMode, parallel, exportAllClasses); } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index 2bbfcb4bb..3955d698d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -1857,7 +1857,7 @@ public class AVM2Code implements Cloneable { * @throws ConvertException On convert error * @throws InterruptedException On interrupt */ - public void toSourceOutput(List output, int swfVersion, Set switchParts, List callStack, AbcIndexing abcIndex, Map> setLocalPosToGetLocalPos, boolean thisHasDefaultToPrimitive, Reference lineStartItem, String path, GraphPart part, boolean processJumps, boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, ScopeStack localScopeStack, ABC abc, MethodBody body, int start, int end, HashMap localRegNames, HashMap localRegTypes, List fullyQualifiedNames, boolean[] visited, HashMap localRegAssignmentIps, LinkedIdentityHashSet bottomStackSetLocals) throws ConvertException, InterruptedException { + public void toSourceOutput(List output, int swfVersion, Set switchParts, List callStack, AbcIndexing abcIndex, Map> setLocalPosToGetLocalPos, boolean thisHasDefaultToPrimitive, Reference lineStartItem, String path, GraphPart part, boolean processJumps, boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, ScopeStack localScopeStack, ABC abc, MethodBody body, int start, int end, HashMap localRegNames, HashMap localRegTypes, List fullyQualifiedNames, boolean[] visited, HashMap localRegAssignmentIps, LinkedIdentityHashSet bottomStackSetLocals, Set usedDeobfuscations) throws ConvertException, InterruptedException { boolean debugMode = DEBUG_MODE; if (debugMode) { System.err.println("OPEN SubSource:" + start + "-" + end + " " + code.get(start).toString() + " to " + code.get(end).toString()); @@ -1976,7 +1976,7 @@ public class AVM2Code implements Cloneable { } else */ if ((ins.definition instanceof ReturnValueIns) || (ins.definition instanceof ReturnVoidIns) || (ins.definition instanceof ThrowIns)) { - ins.definition.translate(swfVersion, switchParts, callStack, abcIndex, setLocalPosToGetLocalPos, lineStartItem, isStatic, scriptIndex, classIndex, localRegs, stack, scopeStack, localScopeStack, ins, output, body, abc, localRegNames, localRegTypes, fullyQualifiedNames, path, localRegAssignmentIps, ip, this, thisHasDefaultToPrimitive, bottomStackSetLocals); + ins.definition.translate(usedDeobfuscations, swfVersion, switchParts, callStack, abcIndex, setLocalPosToGetLocalPos, lineStartItem, isStatic, scriptIndex, classIndex, localRegs, stack, scopeStack, localScopeStack, ins, output, body, abc, localRegNames, localRegTypes, fullyQualifiedNames, path, localRegAssignmentIps, ip, this, thisHasDefaultToPrimitive, bottomStackSetLocals); //ip = end + 1; break; } else if (ins.definition instanceof NewFunctionIns) { @@ -1998,7 +1998,7 @@ public class AVM2Code implements Cloneable { if (code.get(ip + plus + 2).definition instanceof SwapIns) { if (code.get(ip + plus + 4).definition instanceof PopScopeIns) { if (code.get(ip + plus + 3).definition instanceof SetPropertyIns) { - functionName = abc.constants.getMultiname(code.get(ip + plus + 3).operands[0]).getName(abc, abc.constants, fullyQualifiedNames, true, true); + functionName = abc.constants.getMultiname(code.get(ip + plus + 3).operands[0]).getName(usedDeobfuscations, abc, abc.constants, fullyQualifiedNames, true, true); localScopeStack.pop(); // with output.remove(output.size() - 1); // with ip = ip + plus + 4; // +1 below @@ -2012,13 +2012,13 @@ public class AVM2Code implements Cloneable { } } // What to do when hasDup is false? - ins.definition.translate(swfVersion, switchParts, callStack, abcIndex, setLocalPosToGetLocalPos, lineStartItem, isStatic, scriptIndex, classIndex, localRegs, stack, scopeStack, localScopeStack, ins, output, body, abc, localRegNames, localRegTypes, fullyQualifiedNames, path, localRegAssignmentIps, ip, this, thisHasDefaultToPrimitive, bottomStackSetLocals); + ins.definition.translate(usedDeobfuscations, swfVersion, switchParts, callStack, abcIndex, setLocalPosToGetLocalPos, lineStartItem, isStatic, scriptIndex, classIndex, localRegs, stack, scopeStack, localScopeStack, ins, output, body, abc, localRegNames, localRegTypes, fullyQualifiedNames, path, localRegAssignmentIps, ip, this, thisHasDefaultToPrimitive, bottomStackSetLocals); NewFunctionAVM2Item nft = (NewFunctionAVM2Item) stack.peek(); nft.functionName = functionName; ip++; } else { try { - ins.definition.translate(swfVersion, switchParts, callStack, abcIndex, setLocalPosToGetLocalPos, lineStartItem, isStatic, scriptIndex, classIndex, localRegs, stack, scopeStack, localScopeStack, ins, output, body, abc, localRegNames, localRegTypes, fullyQualifiedNames, path, localRegAssignmentIps, ip, this, thisHasDefaultToPrimitive, bottomStackSetLocals); + ins.definition.translate(usedDeobfuscations, swfVersion, switchParts, callStack, abcIndex, setLocalPosToGetLocalPos, lineStartItem, isStatic, scriptIndex, classIndex, localRegs, stack, scopeStack, localScopeStack, ins, output, body, abc, localRegNames, localRegTypes, fullyQualifiedNames, path, localRegAssignmentIps, ip, this, thisHasDefaultToPrimitive, bottomStackSetLocals); if (stack.size() == 1 && (stack.peek() instanceof SetLocalAVM2Item)) { bottomStackSetLocals.add((SetLocalAVM2Item) stack.peek()); @@ -2070,19 +2070,20 @@ public class AVM2Code implements Cloneable { /** * Gets types of local registers. * + * @param usedDeobfuscations Used deobfuscations * @param abc ABC * @param constants Constant pool * @param fullyQualifiedNames Fully qualified names * @return Map from register id to type */ - public HashMap getLocalRegTypes(ABC abc, AVM2ConstantPool constants, List fullyQualifiedNames) { + public HashMap getLocalRegTypes(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, List fullyQualifiedNames) { HashMap ret = new HashMap<>(); AVM2Instruction prev = null; for (AVM2Instruction ins : code) { if (ins.definition instanceof SetLocalTypeIns) { if (prev != null) { if (prev.definition instanceof CoerceOrConvertTypeIns) { - ret.put(((SetLocalTypeIns) ins.definition).getRegisterId(ins), ((CoerceOrConvertTypeIns) prev.definition).getTargetType(abc, constants, prev)); + ret.put(((SetLocalTypeIns) ins.definition).getRegisterId(ins), ((CoerceOrConvertTypeIns) prev.definition).getTargetType(usedDeobfuscations,abc, constants, prev)); } } } @@ -2239,6 +2240,7 @@ public class AVM2Code implements Cloneable { /** * Injects declarations of registers/slots/properties etc. * + * @param usedDeobfuscations Used deobfuscations * @param level Level * @param paramNames Parameter names * @param items Items @@ -2251,14 +2253,14 @@ public class AVM2Code implements Cloneable { * @param abc ABC * @param body Method body */ - private void injectDeclarations(int level, List paramNames, List items, int minreg, DeclarationAVM2Item[] declaredRegisters, List declaredSlots, List declaredSlotsDec, List declaredProperties, List declaredPropsDec, ABC abc, MethodBody body) { + private void injectDeclarations(Set usedDeobfuscations, int level, List paramNames, List items, int minreg, DeclarationAVM2Item[] declaredRegisters, List declaredSlots, List declaredSlotsDec, List declaredProperties, List declaredPropsDec, ABC abc, MethodBody body) { //boolean hasActivation = abc.method_info.get(body.method_info).flagNeed_activation(); Map traits = new LinkedHashMap<>(); for (Trait t : body.traits.traits) { if (t instanceof TraitSlotConst) { TraitSlotConst tsc = (TraitSlotConst) t; Multiname tratMultiname = abc.constants.getMultiname(tsc.name_index); - String bodyTraitName = tratMultiname.getName(abc, abc.constants, new ArrayList<>(), true, true); + String bodyTraitName = tratMultiname.getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), true, true); traits.put(bodyTraitName, tsc); } } @@ -2276,7 +2278,7 @@ public class AVM2Code implements Cloneable { if (ss.slotName == null) { break; } - propNameStr = ss.slotName.getName(abc, abc.constants, new ArrayList<>(), true, true); + propNameStr = ss.slotName.getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), true, true); value = ss.value; } else if (item instanceof SetPropertyAVM2Item) { SetPropertyAVM2Item sp = (SetPropertyAVM2Item) item; @@ -2324,7 +2326,7 @@ public class AVM2Code implements Cloneable { } else { return; } - propertyName = propertyMultiName.getName(abc, abc.constants, new ArrayList<>(), true, true); + propertyName = propertyMultiName.getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), true, true); if (traits.containsKey(propertyName)) { Slot sl = new Slot(new NewActivationAVM2Item(null, null), propertyMultiName); @@ -2349,8 +2351,8 @@ public class AVM2Code implements Cloneable { if (!beginDeclaredSlotsNames.contains(traitName)) { Slot sl = new Slot(new NewActivationAVM2Item(null, null), abc.constants.getMultiname(traits.get(traitName).name_index)); TraitSlotConst tsc = (TraitSlotConst) traits.get(traitName); - GraphTargetItem type = AbcIndexing.multinameToType(tsc.type_index, abc, abc.constants); - DeclarationAVM2Item d = new DeclarationAVM2Item(new GetLexAVM2Item(null, null, sl.multiname, abc, abc.constants, type, TypeItem.UNBOUNDED /*?*/, false), type); + GraphTargetItem type = AbcIndexing.multinameToType(usedDeobfuscations, tsc.type_index, abc, abc.constants); + DeclarationAVM2Item d = new DeclarationAVM2Item(new GetLexAVM2Item(null, null, sl.multiname, abc, abc.constants, type, TypeItem.UNBOUNDED /*?*/, false, usedDeobfuscations), type); declaredSlotsDec.add(d); declaredSlots.add(sl); @@ -2416,7 +2418,7 @@ public class AVM2Code implements Cloneable { if (!declaredProperties.contains(propName.resolvedMultinameName)) { if (traits.containsKey(propName.resolvedMultinameName)) { TraitSlotConst tsc = traits.get(propName.resolvedMultinameName); - GraphTargetItem type = AbcIndexing.multinameToType(tsc.type_index, abc, abc.constants); + GraphTargetItem type = AbcIndexing.multinameToType(usedDeobfuscations, tsc.type_index, abc, abc.constants); DeclarationAVM2Item d = new DeclarationAVM2Item(subItem, type); sp.setDeclaration(d); declaredPropsDec.add(d); @@ -2446,14 +2448,14 @@ public class AVM2Code implements Cloneable { SetSlotAVM2Item ssti = (SetSlotAVM2Item) subItem; if (ssti.scope instanceof NewActivationAVM2Item) { Slot sl = new Slot(ssti.scope, ssti.slotName); - String slotPropertyName = sl.multiname.getName(abc, abc.constants, new ArrayList<>(), true, false); + String slotPropertyName = sl.multiname.getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), true, false); if (!paramNames.contains(slotPropertyName)) { int index = slotListIndexOf(declaredSlots, slotPropertyName, abc); if (index == -1) { GraphTargetItem type = TypeItem.UNBOUNDED; if (traits.containsKey(slotPropertyName)) { - type = AbcIndexing.multinameToType(traits.get(slotPropertyName).type_index, abc, abc.constants); + type = AbcIndexing.multinameToType(usedDeobfuscations, traits.get(slotPropertyName).type_index, abc, abc.constants); } DeclarationAVM2Item d = new DeclarationAVM2Item(subItem, type); ssti.setDeclaration(d); @@ -2482,7 +2484,7 @@ public class AVM2Code implements Cloneable { if (currentItem instanceof Block) { Block blk = (Block) currentItem; for (List sub : blk.getSubs()) { - injectDeclarations(level + 1, paramNames, sub, minreg, declaredRegisters, declaredSlots, declaredSlotsDec, declaredProperties, declaredPropsDec, abc, body); + injectDeclarations(usedDeobfuscations, level + 1, paramNames, sub, minreg, declaredRegisters, declaredSlots, declaredSlotsDec, declaredProperties, declaredPropsDec, abc, body); } } } @@ -2516,6 +2518,7 @@ public class AVM2Code implements Cloneable { /** * Converts code to source - list of GraphTargetItems. * + * @param usedDeobfuscations Used deobfuscations * @param swfVersion SWF version * @param callStack Call stack * @param abcIndex ABC indexing @@ -2539,7 +2542,7 @@ public class AVM2Code implements Cloneable { * @return List of GraphTargetItems * @throws InterruptedException On interrupt */ - public List toGraphTargetItems(int swfVersion, List callStack, AbcIndexing abcIndex, boolean thisHasDefaultToPrimitive, ConvertData convertData, String path, int methodIndex, boolean isStatic, int scriptIndex, int classIndex, ABC abc, MethodBody body, HashMap localRegNames, ScopeStack scopeStack, int initializerType, List fullyQualifiedNames, Traits initTraits, int staticOperation, HashMap localRegAssignmentIps, List initTraitClasses) throws InterruptedException { + public List toGraphTargetItems(Set usedDeobfuscations, int swfVersion, List callStack, AbcIndexing abcIndex, boolean thisHasDefaultToPrimitive, ConvertData convertData, String path, int methodIndex, boolean isStatic, int scriptIndex, int classIndex, ABC abc, MethodBody body, HashMap localRegNames, ScopeStack scopeStack, int initializerType, List fullyQualifiedNames, Traits initTraits, int staticOperation, HashMap localRegAssignmentIps, List initTraitClasses) throws InterruptedException { initToSource(); List list; HashMap localRegs = new HashMap<>(); @@ -2550,13 +2553,13 @@ public class AVM2Code implements Cloneable { } HashMap localRegTypes = new HashMap<>(); for (int i = 0; i < abc.method_info.get(methodIndex).param_types.length; i++) { - localRegTypes.put(i + 1, AbcIndexing.multinameToType(abc.method_info.get(methodIndex).param_types[i], abc, abc.constants)); + localRegTypes.put(i + 1, AbcIndexing.multinameToType(usedDeobfuscations, abc.method_info.get(methodIndex).param_types[i], abc, abc.constants)); } try { - list = AVM2Graph.translateViaGraph(swfVersion, null, callStack, abcIndex, path, this, abc, body, isStatic, scriptIndex, classIndex, localRegs, scopeStack, localRegNames, localRegTypes, fullyQualifiedNames, staticOperation, localRegAssignmentIps, thisHasDefaultToPrimitive); + list = AVM2Graph.translateViaGraph(usedDeobfuscations, swfVersion, null, callStack, abcIndex, path, this, abc, body, isStatic, scriptIndex, classIndex, localRegs, scopeStack, localRegNames, localRegTypes, fullyQualifiedNames, staticOperation, localRegAssignmentIps, thisHasDefaultToPrimitive); } catch (SecondPassException spe) { - list = AVM2Graph.translateViaGraph(swfVersion, spe.getData(), callStack, abcIndex, path, this, abc, body, isStatic, scriptIndex, classIndex, localRegs, scopeStack, localRegNames, localRegTypes, fullyQualifiedNames, staticOperation, localRegAssignmentIps, thisHasDefaultToPrimitive); + list = AVM2Graph.translateViaGraph(usedDeobfuscations, swfVersion, spe.getData(), callStack, abcIndex, path, this, abc, body, isStatic, scriptIndex, classIndex, localRegs, scopeStack, localRegNames, localRegTypes, fullyQualifiedNames, staticOperation, localRegAssignmentIps, thisHasDefaultToPrimitive); } if (initTraits != null) { @@ -2582,7 +2585,7 @@ public class AVM2Code implements Cloneable { if (value != null && !convertData.assignedValues.containsKey(tsc)) { if (value instanceof NewFunctionAVM2Item) { NewFunctionAVM2Item f = (NewFunctionAVM2Item) value; - f.functionName = tsc.getName(abc).getName(abc, abc.constants, fullyQualifiedNames, true, true); + f.functionName = tsc.getName(abc).getName(usedDeobfuscations, abc, abc.constants, fullyQualifiedNames, true, true); } AssignedValue av = new AssignedValue(ti, value, initializerType, methodIndex); convertData.assignedValues.put(tsc, av); @@ -2671,7 +2674,7 @@ public class AVM2Code implements Cloneable { } if (value instanceof NewFunctionAVM2Item) { NewFunctionAVM2Item f = (NewFunctionAVM2Item) value; - f.functionName = tsc.getName(abc).getName(abc, abc.constants, fullyQualifiedNames, true, true); + f.functionName = tsc.getName(abc).getName(usedDeobfuscations, abc, abc.constants, fullyQualifiedNames, true, true); } AssignedValue av = new AssignedValue(classMultiname == -1 ? ti : null, value, initializerType, methodIndex); convertData.assignedValues.put(tsc, av); @@ -2889,7 +2892,7 @@ public class AVM2Code implements Cloneable { if (param_types[i] == 0) { type = TypeItem.UNBOUNDED; } else { - type = new TypeItem(abc.constants.getMultiname(param_types[i]).getNameWithNamespace(abc, abc.constants, true)); + type = new TypeItem(abc.constants.getMultiname(param_types[i]).getNameWithNamespace(usedDeobfuscations, abc, abc.constants, true)); } if (d.length > r) { d[r] = new DeclarationAVM2Item(new SetLocalAVM2Item(null, null, r, new NullAVM2Item(null, null), type), type); @@ -2914,9 +2917,9 @@ public class AVM2Code implements Cloneable { HashMap registerNames = body.getLocalRegNames(abc); List paramNamesList = new ArrayList<>(); for (int ir = 0; ir < r; ir++) { - paramNamesList.add(AVM2Item.localRegName(abc.getSwf(), localRegNames, ir)); + paramNamesList.add(AVM2Item.localRegName(abc.getSwf(), localRegNames, ir, usedDeobfuscations)); } - injectDeclarations(0, paramNamesList, list, 1, d, new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), abc, body); + injectDeclarations(usedDeobfuscations, 0, paramNamesList, list, 1, d, new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), abc, body); return list; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2ConstantPool.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2ConstantPool.java index eddd8e93f..8d4234fb7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2ConstantPool.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2ConstantPool.java @@ -34,6 +34,7 @@ import com.jpexs.helpers.HashArrayList; import com.jpexs.helpers.utf8.Utf8PrintWriter; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.logging.Logger; @@ -1216,7 +1217,7 @@ public class AVM2ConstantPool implements Cloneable { writer.println("String[" + i + "]=" + constant_string.get(i)); } for (int i = 1; i < constant_namespace.size(); i++) { - writer.println("Namespace[" + i + "]=" + constant_namespace.get(i).toString(abc, this)); + writer.println("Namespace[" + i + "]=" + constant_namespace.get(i).toString(new LinkedHashSet<>(), abc, this)); } for (int i = 1; i < constant_namespace_set.size(); i++) { writer.println("NamespaceSet[" + i + "]=" + constant_namespace_set.get(i).toString(this)); @@ -1251,7 +1252,7 @@ public class AVM2ConstantPool implements Cloneable { if (index == 0) { return "null"; } - return constant_namespace.get(index).toString(abc, this); + return constant_namespace.get(index).toString(new LinkedHashSet<>(), abc, this); } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/CodeStats.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/CodeStats.java index 213bbf0a1..67251c964 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/CodeStats.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/CodeStats.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.model.LocalData; import java.util.ArrayList; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; /** @@ -84,7 +85,7 @@ public class CodeStats { if (stats.stackpos > ms) { ms = stats.stackpos; } - writer.appendNoHilight(i + ":" + stats.stackpos + (deltastack >= 0 ? "+" + deltastack : deltastack) + "," + stats.scopepos + " " + stats.ins.toString(writer, LocalData.create(new ArrayList<>(), null, abc, null, fullyQualifiedNames, new HashSet<>(), ScriptExportMode.AS, -1))).newLine(); + writer.appendNoHilight(i + ":" + stats.stackpos + (deltastack >= 0 ? "+" + deltastack : deltastack) + "," + stats.scopepos + " " + stats.ins.toString(writer, LocalData.create(new ArrayList<>(), null, abc, null, fullyQualifiedNames, new HashSet<>(), ScriptExportMode.AS, -1, new LinkedHashSet<>()))).newLine(); i++; } return writer; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorGetSet.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorGetSet.java index 3943f65e3..f7a74f500 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorGetSet.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorGetSet.java @@ -43,8 +43,10 @@ import com.jpexs.decompiler.graph.TranslateException; import com.jpexs.helpers.CancellableWorker; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; /** * AVM2 Deobfuscator removing single get / set registers. @@ -164,7 +166,7 @@ public class AVM2DeobfuscatorGetSet extends SWFDecompilerAdapter { localData.localRegTypes = new HashMap<>(); localData.scriptIndex = scriptIndex; localData.ip = 0; - localData.code = body.getCode(); + localData.code = body.getCode(); return localData; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java index b429d299b..9a6305de6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java @@ -743,6 +743,7 @@ public class AVM2Graph extends Graph { /** * Translates via Graph - decompiles. * + * @param usedDeobfuscations Used deobfuscations * @param swfVersion SWF version * @param secondPassData Second pass data * @param callStack Call stack @@ -765,7 +766,7 @@ public class AVM2Graph extends Graph { * @return List of graph target items * @throws InterruptedException On interrupt */ - public static List translateViaGraph(int swfVersion, SecondPassData secondPassData, List callStack, AbcIndexing abcIndex, String path, AVM2Code code, ABC abc, MethodBody body, boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, ScopeStack scopeStack, HashMap localRegNames, HashMap localRegTypes, List fullyQualifiedNames, int staticOperation, HashMap localRegAssignmentIps, boolean thisHasDefaultToPrimitive) throws InterruptedException { + public static List translateViaGraph(Set usedDeobfuscations, int swfVersion, SecondPassData secondPassData, List callStack, AbcIndexing abcIndex, String path, AVM2Code code, ABC abc, MethodBody body, boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, ScopeStack scopeStack, HashMap localRegNames, HashMap localRegTypes, List fullyQualifiedNames, int staticOperation, HashMap localRegAssignmentIps, boolean thisHasDefaultToPrimitive) throws InterruptedException { ScopeStack localScopeStack = new ScopeStack(); AVM2Graph g = new AVM2Graph(swfVersion, abcIndex, code, abc, body, isStatic, scriptIndex, classIndex, localRegs, scopeStack, localScopeStack, localRegNames, fullyQualifiedNames, localRegAssignmentIps); @@ -788,6 +789,7 @@ public class AVM2Graph extends Graph { localData.ip = 0; localData.code = code; localData.swfVersion = swfVersion; + localData.usedDeobfuscations = usedDeobfuscations; g.init(localData); Set allParts = new HashSet<>(); for (GraphPart head : g.heads) { @@ -2190,7 +2192,7 @@ public class AVM2Graph extends Graph { } if (construct.object instanceof GetLexAVM2Item) { GetLexAVM2Item glt = (GetLexAVM2Item) construct.object; - isXMLList = glt.propertyName.getName(aLocalData.abc, aLocalData.getConstants(), aLocalData.fullyQualifiedNames, true, true).equals("XMLList"); + isXMLList = glt.propertyName.getName(new LinkedHashSet<>(), aLocalData.abc, aLocalData.getConstants(), aLocalData.fullyQualifiedNames, true, true).equals("XMLList"); } if (isXMLList) { @@ -2733,7 +2735,7 @@ public class AVM2Graph extends Graph { if (sp.value instanceof LocalRegAVM2Item) { LocalRegAVM2Item lr = (LocalRegAVM2Item) sp.value; AVM2FinalProcessLocalData aLocalData = (AVM2FinalProcessLocalData) localData; - if (Objects.equals(propName.resolvedMultinameName, AVM2Item.localRegName(abc.getSwf(), aLocalData.localRegNames, lr.regIndex))) { + if (Objects.equals(propName.resolvedMultinameName, AVM2Item.localRegName(abc.getSwf(), aLocalData.localRegNames, lr.regIndex, new LinkedHashSet<>()))) { list.remove(i); i--; continue loopi; @@ -2746,7 +2748,7 @@ public class AVM2Graph extends Graph { if (list.get(i) instanceof SetSlotAVM2Item) { SetSlotAVM2Item sslot = (SetSlotAVM2Item) list.get(i); if (sslot.slotObject instanceof NewActivationAVM2Item) { - String slotName = sslot.slotName.getName(abc, abc.constants, new ArrayList<>(), true, true); + String slotName = sslot.slotName.getName(new LinkedHashSet<>()/*???*/, abc, abc.constants, new ArrayList<>(), true, true); if (sslot.value.getNotCoercedNoDup() instanceof LocalRegAVM2Item) { LocalRegAVM2Item locReg = (LocalRegAVM2Item) sslot.value.getNotCoercedNoDup(); if (localRegNames.containsValue(slotName)) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2GraphSource.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2GraphSource.java index 0c36b58b6..eba55c733 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2GraphSource.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2GraphSource.java @@ -202,7 +202,7 @@ public class AVM2GraphSource extends GraphSource { @Override public void translatePart(List output, Graph graph, GraphPart part, BaseLocalData localData, TranslateStack stack, int start, int end, int staticOperation, String path) throws InterruptedException { Reference lineStartItem = new Reference<>(localData.lineStartInstruction); - code.toSourceOutput(output, localData.swfVersion, localData.allSwitchParts, ((AVM2LocalData) localData).callStack, ((AVM2LocalData) localData).abcIndex, ((AVM2LocalData) localData).setLocalPosToGetLocalPos, ((AVM2LocalData) localData).thisHasDefaultToPrimitive, lineStartItem, path, part, false, isStatic, scriptIndex, classIndex, localRegs, stack, ((AVM2LocalData) localData).scopeStack, ((AVM2LocalData) localData).localScopeStack, abc, body, start, end, localRegNames, ((AVM2LocalData) localData).localRegTypes, fullyQualifiedNames, new boolean[size()], localRegAssignmentIps, ((AVM2LocalData) localData).bottomSetLocals); + code.toSourceOutput(output, localData.swfVersion, localData.allSwitchParts, ((AVM2LocalData) localData).callStack, ((AVM2LocalData) localData).abcIndex, ((AVM2LocalData) localData).setLocalPosToGetLocalPos, ((AVM2LocalData) localData).thisHasDefaultToPrimitive, lineStartItem, path, part, false, isStatic, scriptIndex, classIndex, localRegs, stack, ((AVM2LocalData) localData).scopeStack, ((AVM2LocalData) localData).localScopeStack, abc, body, start, end, localRegNames, ((AVM2LocalData) localData).localRegTypes, fullyQualifiedNames, new boolean[size()], localRegAssignmentIps, ((AVM2LocalData) localData).bottomSetLocals, localData.usedDeobfuscations); localData.lineStartInstruction = lineStartItem.getVal(); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java index b66e2bd9c..d34437939 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java @@ -267,6 +267,7 @@ public abstract class InstructionDefinition implements Serializable { /** * Translates instruction to high level code. * + * @param usedDeobfuscations Used deobfuscations * @param swfVersion SWF version * @param switchParts Switch parts * @param callStack Call stack @@ -295,7 +296,7 @@ public abstract class InstructionDefinition implements Serializable { * @param bottomSetLocals Bottom set locals * @throws InterruptedException On interrupt */ - public void translate(int swfVersion, Set switchParts, List callStack, AbcIndexing abcIndex, Map> setLocalPosToGetLocalPos, Reference lineStartItem, boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, ScopeStack localScopeStack, AVM2Instruction ins, List output, MethodBody body, ABC abc, HashMap localRegNames, HashMap localRegTypes, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, AVM2Code code, boolean thisHasDefaultToPrimitive, LinkedIdentityHashSet bottomSetLocals) throws InterruptedException { + public void translate(Set usedDeobfuscations, int swfVersion, Set switchParts, List callStack, AbcIndexing abcIndex, Map> setLocalPosToGetLocalPos, Reference lineStartItem, boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, TranslateStack stack, ScopeStack scopeStack, ScopeStack localScopeStack, AVM2Instruction ins, List output, MethodBody body, ABC abc, HashMap localRegNames, HashMap localRegTypes, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, AVM2Code code, boolean thisHasDefaultToPrimitive, LinkedIdentityHashSet bottomSetLocals) throws InterruptedException { AVM2LocalData localData = new AVM2LocalData(); localData.allSwitchParts = switchParts; localData.isStatic = isStatic; @@ -319,6 +320,7 @@ public abstract class InstructionDefinition implements Serializable { localData.setLocalPosToGetLocalPos = setLocalPosToGetLocalPos; localData.bottomSetLocals = bottomSetLocals; localData.swfVersion = swfVersion; + localData.usedDeobfuscations = usedDeobfuscations; translate(localData, stack, ins, output, path); lineStartItem.setVal(localData.lineStartInstruction); } @@ -388,7 +390,7 @@ public abstract class InstructionDefinition implements Serializable { } } - return new FullMultinameAVM2Item(property, ins, localData.lineStartInstruction, multinameIndex, localData.abc.constants.getMultiname(multinameIndex).getName(localData.abc, localData.getConstants(), new ArrayList<>(), true, true), name, ns); + return new FullMultinameAVM2Item(property, ins, localData.lineStartInstruction, multinameIndex, localData.abc.constants.getMultiname(multinameIndex).getName(localData.usedDeobfuscations, localData.abc, localData.getConstants(), new ArrayList<>(), true, true), name, ns); } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/ConstructIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/ConstructIns.java index 902d76fee..a3142f0ba 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/ConstructIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/ConstructIns.java @@ -129,7 +129,7 @@ public class ConstructIns extends InstructionDefinition { } if (obj instanceof GetLexAVM2Item) { GetLexAVM2Item glt = (GetLexAVM2Item) obj; - isXML = glt.propertyName.getName(localData.abc, localData.getConstants(), localData.fullyQualifiedNames, true, true).equals("XML"); + isXML = glt.propertyName.getName(localData.usedDeobfuscations, localData.abc, localData.getConstants(), localData.fullyQualifiedNames, true, true).equals("XML"); } if (isXML) { @@ -157,7 +157,7 @@ public class ConstructIns extends InstructionDefinition { } if (obj instanceof GetLexAVM2Item) { GetLexAVM2Item glt = (GetLexAVM2Item) obj; - isRegExp = glt.propertyName.getName(localData.abc, localData.getConstants(), localData.fullyQualifiedNames, true, true).equals("RegExp"); + isRegExp = glt.propertyName.getName(localData.usedDeobfuscations, localData.abc, localData.getConstants(), localData.fullyQualifiedNames, true, true).equals("RegExp"); } if (isRegExp && (args.size() >= 1) && (args.get(0) instanceof StringAVM2Item) && (args.size() == 1 || (args.size() == 2 && args.get(1) instanceof StringAVM2Item))) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewClassIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewClassIns.java index 175c42a76..809bdaef4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewClassIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewClassIns.java @@ -49,11 +49,11 @@ public class NewClassIns extends InstructionDefinition { public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) throws InterruptedException { int clsIndex = ins.operands[0]; HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), false); - stack.pop().toString(writer, LocalData.create(localData.callStack /*??*/, localData.abcIndex, localData.abc, localData.localRegNames, localData.fullyQualifiedNames, new HashSet<>(), ScriptExportMode.AS, localData.swfVersion)); + stack.pop().toString(writer, LocalData.create(localData.callStack /*??*/, localData.abcIndex, localData.abc, localData.localRegNames, localData.fullyQualifiedNames, new HashSet<>(), ScriptExportMode.AS, localData.swfVersion, localData.usedDeobfuscations)); writer.finishHilights(); String baseType = writer.toString(); ABC abc = localData.abc; - stack.push(new UnparsedAVM2Item(ins, localData.lineStartInstruction, "§§newclass(" + abc.constants.getMultiname(abc.instance_info.get(clsIndex).name_index).getName(localData.abc, localData.getConstants(), localData.fullyQualifiedNames, false, true) + "," + baseType + ")")); + stack.push(new UnparsedAVM2Item(ins, localData.lineStartInstruction, "§§newclass(" + abc.constants.getMultiname(abc.instance_info.get(clsIndex).name_index).getName(localData.usedDeobfuscations, localData.abc, localData.getConstants(), localData.fullyQualifiedNames, false, true) + "," + baseType + ")")); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/GetLocalTypeIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/GetLocalTypeIns.java index 7bd53f23c..5fd2d615a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/GetLocalTypeIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/localregs/GetLocalTypeIns.java @@ -93,7 +93,7 @@ public abstract class GetLocalTypeIns extends InstructionDefinition { List ts = localData.getInstanceInfo().get(localData.classIndex).instance_traits.traits; boolean isBasicObject = localData.thisHasDefaultToPrimitive; Multiname m = localData.getInstanceInfo().get(localData.classIndex).getName(localData.getConstants()); - stack.push(new ThisAVM2Item(ins, localData.lineStartInstruction, m.getNameWithNamespace(localData.abc, localData.getConstants(), true), isBasicObject, false)); + stack.push(new ThisAVM2Item(ins, localData.lineStartInstruction, m.getNameWithNamespace(localData.usedDeobfuscations, localData.abc, localData.getConstants(), true), isBasicObject, false)); } return; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetGlobalSlotIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetGlobalSlotIns.java index 9f023e5ac..11d9e5ea2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetGlobalSlotIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetGlobalSlotIns.java @@ -60,7 +60,7 @@ public class GetGlobalSlotIns extends InstructionDefinition { if (t instanceof TraitSlotConst) { TraitSlotConst tsc = (TraitSlotConst) t; if (tsc.slot_id == slotIndex) { - slotType = AbcIndexing.multinameToType(tsc.type_index, localData.abc, localData.abc.constants); + slotType = AbcIndexing.multinameToType(localData.usedDeobfuscations, tsc.type_index, localData.abc, localData.abc.constants); break; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetLexIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetLexIns.java index 5b8d80b35..9db5dd6d1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetLexIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetLexIns.java @@ -58,17 +58,17 @@ public class GetLexIns extends InstructionDefinition { Reference isStatic, Reference type, Reference callType) { type.setVal(TypeItem.UNKNOWN); callType.setVal(TypeItem.UNKNOWN); - String multinameStr = localData.abc.constants.getMultiname(multinameIndex).getName(localData.abc, localData.abc.constants, new ArrayList<>(), true, true); + String multinameStr = localData.abc.constants.getMultiname(multinameIndex).getName(localData.usedDeobfuscations, localData.abc, localData.abc.constants, new ArrayList<>(), true, true); for (int b = localData.callStack.size() - 1; b >= 0; b--) { MethodBody body = localData.callStack.get(b); for (Trait t : body.traits.traits) { if (t instanceof TraitSlotConst) { TraitSlotConst tsc = (TraitSlotConst) t; if (Objects.equals( - tsc.getName(localData.abc).getName(localData.abc, localData.abc.constants, new ArrayList<>(), true, true), + tsc.getName(localData.abc).getName(localData.usedDeobfuscations, localData.abc, localData.abc.constants, new ArrayList<>(), true, true), multinameStr )) { - GraphTargetItem ty = AbcIndexing.multinameToType(tsc.type_index, localData.abc, localData.abc.constants); + GraphTargetItem ty = AbcIndexing.multinameToType(localData.usedDeobfuscations, tsc.type_index, localData.abc, localData.abc.constants); type.setVal(ty); callType.setVal(ty); return; @@ -78,7 +78,7 @@ public class GetLexIns extends InstructionDefinition { } if (localData.abcIndex != null) { - String currentClassName = localData.classIndex == -1 ? null : localData.abc.instance_info.get(localData.classIndex).getName(localData.abc.constants).getNameWithNamespace(localData.abc, localData.abc.constants, true).toRawString(); + String currentClassName = localData.classIndex == -1 ? null : localData.abc.instance_info.get(localData.classIndex).getName(localData.abc.constants).getNameWithNamespace(localData.usedDeobfuscations, localData.abc, localData.abc.constants, true).toRawString(); if (currentClassName != null) { Reference foundStatic = new Reference<>(null); localData.abcIndex.findPropertyTypeOrCallType(localData.abc, new TypeItem(currentClassName), multinameStr, localData.abc.constants.getMultiname(multinameIndex).namespace_index, true, true, true, type, callType, foundStatic); @@ -86,7 +86,7 @@ public class GetLexIns extends InstructionDefinition { if (type.getVal().equals(TypeItem.UNKNOWN)) { //TypeItem ti = new TypeItem(localData.abc.constants.getMultiname(multinameIndex).getNameWithNamespace(localData.abc.constants, true)); - GraphTargetItem ti = AbcIndexing.multinameToType(multinameIndex, localData.abc, localData.abc.constants); + GraphTargetItem ti = AbcIndexing.multinameToType(localData.usedDeobfuscations, multinameIndex, localData.abc, localData.abc.constants); if (localData.abcIndex.findClass(ti, localData.abc, localData.scriptIndex) != null) { type.setVal(ti); callType.setVal(TypeItem.UNBOUNDED); @@ -116,7 +116,7 @@ public class GetLexIns extends InstructionDefinition { Reference type = new Reference<>(null); Reference callType = new Reference<>(null); GetLexIns.resolveLexType(localData, null, multinameIndex, isStatic, type, callType); - stack.push(new GetLexAVM2Item(ins, localData.lineStartInstruction, multiname, localData.abc, localData.getConstants(), type.getVal(), callType.getVal(), isStatic.getVal())); + stack.push(new GetLexAVM2Item(ins, localData.lineStartInstruction, multiname, localData.abc, localData.getConstants(), type.getVal(), callType.getVal(), isStatic.getVal(), localData.usedDeobfuscations)); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetPropertyIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetPropertyIns.java index 415858a79..da29cb667 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetPropertyIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetPropertyIns.java @@ -152,7 +152,7 @@ public class GetPropertyIns extends InstructionDefinition { Reference isStatic, Reference type, Reference callType) { type.setVal(TypeItem.UNKNOWN); callType.setVal(TypeItem.UNKNOWN); - String multinameStr = localData.abc.constants.getMultiname(multiname.multinameIndex).getName(localData.abc, localData.abc.constants, new ArrayList<>(), true, true); + String multinameStr = localData.abc.constants.getMultiname(multiname.multinameIndex).getName(localData.usedDeobfuscations, localData.abc, localData.abc.constants, new ArrayList<>(), true, true); if (obj instanceof FindPropertyAVM2Item) { FindPropertyAVM2Item fprop = (FindPropertyAVM2Item) obj; if (fprop.propertyName.equals(multiname)) { @@ -162,10 +162,10 @@ public class GetPropertyIns extends InstructionDefinition { if (t instanceof TraitSlotConst) { TraitSlotConst tsc = (TraitSlotConst) t; if (Objects.equals( - tsc.getName(localData.abc).getName(localData.abc, localData.abc.constants, new ArrayList<>(), true, true), + tsc.getName(localData.abc).getName(localData.usedDeobfuscations, localData.abc, localData.abc.constants, new ArrayList<>(), true, true), multinameStr )) { - GraphTargetItem ty = AbcIndexing.multinameToType(tsc.type_index, localData.abc, localData.abc.constants); + GraphTargetItem ty = AbcIndexing.multinameToType(localData.usedDeobfuscations, tsc.type_index, localData.abc, localData.abc.constants); type.setVal(ty); callType.setVal(ty); return; @@ -176,13 +176,13 @@ public class GetPropertyIns extends InstructionDefinition { if (type.getVal().equals(TypeItem.UNKNOWN)) { if (localData.abcIndex != null) { - String currentClassName = localData.classIndex == -1 ? null : localData.abc.instance_info.get(localData.classIndex).getName(localData.abc.constants).getNameWithNamespace(localData.abc, localData.abc.constants, true).toRawString(); + String currentClassName = localData.classIndex == -1 ? null : localData.abc.instance_info.get(localData.classIndex).getName(localData.abc.constants).getNameWithNamespace(localData.usedDeobfuscations, localData.abc, localData.abc.constants, true).toRawString(); if (currentClassName != null) { Reference foundStatic = new Reference<>(null); localData.abcIndex.findPropertyTypeOrCallType(localData.abc, new TypeItem(currentClassName), multinameStr, localData.abc.constants.getMultiname(multiname.multinameIndex).namespace_index, true, true, true, type, callType, foundStatic); } if (type.getVal().equals(TypeItem.UNKNOWN)) { - GraphTargetItem ti = AbcIndexing.multinameToType(multiname.multinameIndex, localData.abc, localData.abc.constants); + GraphTargetItem ti = AbcIndexing.multinameToType(localData.usedDeobfuscations, multiname.multinameIndex, localData.abc, localData.abc.constants); if (localData.abcIndex.findClass(ti, localData.abc, localData.scriptIndex) != null) { type.setVal(ti); callType.setVal(ti); //coercion i = int(xx); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetSlotIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetSlotIns.java index be58f242e..1450f8d92 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetSlotIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetSlotIns.java @@ -63,7 +63,7 @@ public class GetSlotIns extends InstructionDefinition { if (t instanceof TraitSlotConst) { TraitSlotConst tsc = (TraitSlotConst) t; if (tsc.slot_id == slotIndex) { - slotType = AbcIndexing.multinameToType(tsc.type_index, localData.abc, localData.abc.constants); + slotType = AbcIndexing.multinameToType(localData.usedDeobfuscations, tsc.type_index, localData.abc, localData.abc.constants); break; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSlotIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSlotIns.java index d9452451f..afd4cf7e7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSlotIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSlotIns.java @@ -85,7 +85,7 @@ public class SetSlotIns extends InstructionDefinition implements SetTypeIns { if (slotname != null) { if (value instanceof LocalRegAVM2Item) { LocalRegAVM2Item lr = (LocalRegAVM2Item) value; - String slotNameStr = slotname.getName(localData.abc, localData.getConstants(), localData.fullyQualifiedNames, true, true); + String slotNameStr = slotname.getName(localData.usedDeobfuscations, localData.abc, localData.getConstants(), localData.fullyQualifiedNames, true, true); if (localData.localRegNames.containsKey(lr.regIndex)) { if (localData.localRegNames.get(lr.regIndex).equals(slotNameStr)) { return; //Register with same name to slot @@ -150,7 +150,7 @@ public class SetSlotIns extends InstructionDefinition implements SetTypeIns { if (t instanceof TraitSlotConst) { TraitSlotConst tsc = (TraitSlotConst) t; if (tsc.slot_id == slotIndex) { - slotType = AbcIndexing.multinameToType(tsc.type_index, localData.abc, localData.abc.constants); + slotType = AbcIndexing.multinameToType(localData.usedDeobfuscations, tsc.type_index, localData.abc, localData.abc.constants); break; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/decimalsupport/ConvertMIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/decimalsupport/ConvertMIns.java index 7bd998826..2876e89c6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/decimalsupport/ConvertMIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/decimalsupport/ConvertMIns.java @@ -32,6 +32,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.TypeItem; import java.util.List; +import java.util.Set; /** * convert_m instruction - convert to decimal. @@ -68,11 +69,11 @@ public class ConvertMIns extends InstructionDefinition implements CoerceOrConver @Override public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { - stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.abc, localData.getConstants(), ins))); + stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.usedDeobfuscations, localData.abc, localData.getConstants(), ins))); } @Override - public GraphTargetItem getTargetType(ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { + public GraphTargetItem getTargetType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { return new TypeItem(DottedChain.DECIMAL); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/decimalsupport/ConvertMPIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/decimalsupport/ConvertMPIns.java index 2e1961fe5..9b22d981d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/decimalsupport/ConvertMPIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/decimalsupport/ConvertMPIns.java @@ -33,6 +33,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.TypeItem; import java.util.List; +import java.util.Set; /** * convert_m_p instruction - convert to decimal with number context. @@ -69,11 +70,11 @@ public class ConvertMPIns extends InstructionDefinition implements CoerceOrConve @Override public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { - stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.abc, localData.getConstants(), ins))); + stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.usedDeobfuscations, localData.abc, localData.getConstants(), ins))); } @Override - public GraphTargetItem getTargetType(ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { + public GraphTargetItem getTargetType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { return new TypeItem(DottedChain.DECIMAL); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/deprecated/CoerceBIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/deprecated/CoerceBIns.java index 69c88c4dc..18b4c23d6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/deprecated/CoerceBIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/deprecated/CoerceBIns.java @@ -27,6 +27,7 @@ import com.jpexs.decompiler.flash.ecma.EcmaScript; import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TypeItem; +import java.util.Set; /** * coerce_b instruction - coerce to boolean. @@ -60,7 +61,7 @@ public class CoerceBIns extends InstructionDefinition implements CoerceOrConvert } @Override - public GraphTargetItem getTargetType(ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { + public GraphTargetItem getTargetType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { return new TypeItem(DottedChain.BOOLEAN); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/deprecated/CoerceDIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/deprecated/CoerceDIns.java index 03065995e..62bc128ee 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/deprecated/CoerceDIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/deprecated/CoerceDIns.java @@ -27,6 +27,7 @@ import com.jpexs.decompiler.flash.ecma.EcmaScript; import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TypeItem; +import java.util.Set; /** * coerce_d instruction - coerce to double. @@ -60,7 +61,7 @@ public class CoerceDIns extends InstructionDefinition implements CoerceOrConvert } @Override - public GraphTargetItem getTargetType(ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { + public GraphTargetItem getTargetType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { return new TypeItem(DottedChain.NUMBER); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/deprecated/CoerceIIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/deprecated/CoerceIIns.java index a19156f04..c20075286 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/deprecated/CoerceIIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/deprecated/CoerceIIns.java @@ -27,6 +27,7 @@ import com.jpexs.decompiler.flash.ecma.EcmaScript; import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TypeItem; +import java.util.Set; /** * coerce_i instruction - coerce to int. @@ -60,7 +61,7 @@ public class CoerceIIns extends InstructionDefinition implements CoerceOrConvert } @Override - public GraphTargetItem getTargetType(ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { + public GraphTargetItem getTargetType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { return new TypeItem(DottedChain.INT); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/deprecated/CoerceUIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/deprecated/CoerceUIns.java index de2bf4b30..49971985c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/deprecated/CoerceUIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/deprecated/CoerceUIns.java @@ -27,6 +27,7 @@ import com.jpexs.decompiler.flash.ecma.EcmaScript; import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TypeItem; +import java.util.Set; /** * coerce_u instruction - coerce to uint. @@ -60,7 +61,7 @@ public class CoerceUIns extends InstructionDefinition implements CoerceOrConvert } @Override - public GraphTargetItem getTargetType(ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { + public GraphTargetItem getTargetType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { return new TypeItem(DottedChain.UINT); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/floatsupport/ConvertF4Ins.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/floatsupport/ConvertF4Ins.java index 8f616cade..38c6c9716 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/floatsupport/ConvertF4Ins.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/floatsupport/ConvertF4Ins.java @@ -33,6 +33,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.TypeItem; import java.util.List; +import java.util.Set; /** * convert_f4 - Convert a value to a float4. @@ -78,11 +79,11 @@ public class ConvertF4Ins extends InstructionDefinition implements CoerceOrConve @Override public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { - stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.abc, localData.getConstants(), ins))); + stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.usedDeobfuscations, localData.abc, localData.getConstants(), ins))); } @Override - public GraphTargetItem getTargetType(ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { + public GraphTargetItem getTargetType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { return new TypeItem("float4"); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/floatsupport/ConvertFIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/floatsupport/ConvertFIns.java index 03dfbab80..fb65b393a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/floatsupport/ConvertFIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/floatsupport/ConvertFIns.java @@ -32,6 +32,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.TypeItem; import java.util.List; +import java.util.Set; /** * convert_f - Convert a value to a float. @@ -77,11 +78,11 @@ public class ConvertFIns extends InstructionDefinition implements CoerceOrConver @Override public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { - stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.abc, localData.getConstants(), ins))); + stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.usedDeobfuscations, localData.abc, localData.getConstants(), ins))); } @Override - public GraphTargetItem getTargetType(ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { + public GraphTargetItem getTargetType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { return new TypeItem("float"); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/AsTypeIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/AsTypeIns.java index 53531d49a..af919d406 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/AsTypeIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/AsTypeIns.java @@ -65,7 +65,7 @@ public class AsTypeIns extends InstructionDefinition { public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { GraphTargetItem val = stack.pop(); - stack.push(new AsTypeAVM2Item(ins, localData.lineStartInstruction, val, new FullMultinameAVM2Item(false, ins, localData.lineStartInstruction, ins.operands[0], localData.abc.constants.getMultiname(ins.operands[0]).getName(localData.abc, localData.getConstants(), new ArrayList<>(), true, true)))); + stack.push(new AsTypeAVM2Item(ins, localData.lineStartInstruction, val, new FullMultinameAVM2Item(false, ins, localData.lineStartInstruction, ins.operands[0], localData.abc.constants.getMultiname(ins.operands[0]).getName(localData.usedDeobfuscations, localData.abc, localData.getConstants(), new ArrayList<>(), true, true)))); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceAIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceAIns.java index 6b1e395cd..ab32235c3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceAIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceAIns.java @@ -27,6 +27,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.TypeItem; import java.util.List; +import java.util.Set; /** * coerce_a instruction - Coerce any type. @@ -50,7 +51,7 @@ public class CoerceAIns extends InstructionDefinition implements CoerceOrConvert @Override public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { - stack.push(new CoerceAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.abc, localData.getConstants(), ins))); + stack.push(new CoerceAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.usedDeobfuscations, localData.abc, localData.getConstants(), ins))); } @@ -73,7 +74,7 @@ public class CoerceAIns extends InstructionDefinition implements CoerceOrConvert } @Override - public GraphTargetItem getTargetType(ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { + public GraphTargetItem getTargetType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { return TypeItem.UNBOUNDED; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceIns.java index f10ef3ac2..2108f3031 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceIns.java @@ -35,6 +35,7 @@ import com.jpexs.decompiler.flash.ecma.Undefined; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; import java.util.List; +import java.util.Set; /** * coerce instruction - Coerce value to specified type. @@ -84,7 +85,7 @@ public class CoerceIns extends InstructionDefinition implements CoerceOrConvertT @Override public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { int multinameIndex = ins.operands[0]; - stack.push(new CoerceAVM2Item(ins, localData.lineStartInstruction, stack.pop(), AbcIndexing.multinameToType(multinameIndex, localData.abc, localData.getConstants()))); + stack.push(new CoerceAVM2Item(ins, localData.lineStartInstruction, stack.pop(), AbcIndexing.multinameToType(localData.usedDeobfuscations, multinameIndex, localData.abc, localData.getConstants()))); } @Override @@ -98,8 +99,8 @@ public class CoerceIns extends InstructionDefinition implements CoerceOrConvertT } @Override - public GraphTargetItem getTargetType(ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { + public GraphTargetItem getTargetType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { int multinameIndex = ins.operands[0]; - return AbcIndexing.multinameToType(multinameIndex, abc, constants); + return AbcIndexing.multinameToType(usedDeobfuscations, multinameIndex, abc, constants); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceOIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceOIns.java index 41fcdf1ec..4f45ba64d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceOIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceOIns.java @@ -26,6 +26,7 @@ import com.jpexs.decompiler.flash.ecma.Undefined; import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TypeItem; +import java.util.Set; /** * coerce_o instruction - Coerce to object type. @@ -64,7 +65,7 @@ public class CoerceOIns extends InstructionDefinition implements CoerceOrConvert } @Override - public GraphTargetItem getTargetType(ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { + public GraphTargetItem getTargetType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { return new TypeItem(DottedChain.OBJECT); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceOrConvertTypeIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceOrConvertTypeIns.java index c887bbbfb..32203309b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceOrConvertTypeIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceOrConvertTypeIns.java @@ -20,6 +20,7 @@ import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.graph.GraphTargetItem; +import java.util.Set; /** * Coerce or convert type instruction interface. @@ -31,10 +32,11 @@ public interface CoerceOrConvertTypeIns { /** * Get target type of coercing or converting. * + * @param usedDeobfuscations Used deobfuscations * @param abc ABC * @param constants Constants * @param ins Instruction * @return Target type */ - public GraphTargetItem getTargetType(ABC abc, AVM2ConstantPool constants, AVM2Instruction ins); + public GraphTargetItem getTargetType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Instruction ins); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceSIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceSIns.java index c62afd93f..d89513db1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceSIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/CoerceSIns.java @@ -31,6 +31,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.TypeItem; import java.util.List; +import java.util.Set; /** * coerce_s instruction - Coerce value to string. @@ -64,7 +65,7 @@ public class CoerceSIns extends InstructionDefinition implements CoerceOrConvert @Override public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { - stack.push(new CoerceAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.abc, localData.getConstants(), ins))); + stack.push(new CoerceAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.usedDeobfuscations, localData.abc, localData.getConstants(), ins))); } @Override @@ -78,7 +79,7 @@ public class CoerceSIns extends InstructionDefinition implements CoerceOrConvert } @Override - public GraphTargetItem getTargetType(ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { + public GraphTargetItem getTargetType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { return new TypeItem(DottedChain.STRING); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertBIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertBIns.java index 00a195e49..3c5dceafb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertBIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertBIns.java @@ -29,6 +29,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.TypeItem; import java.util.List; +import java.util.Set; /** * convert_b instruction - Convert to boolean. @@ -53,7 +54,7 @@ public class ConvertBIns extends InstructionDefinition implements CoerceOrConver @Override public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { - stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.abc, localData.getConstants(), ins))); + stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.usedDeobfuscations, localData.abc, localData.getConstants(), ins))); } @Override @@ -67,7 +68,7 @@ public class ConvertBIns extends InstructionDefinition implements CoerceOrConver } @Override - public GraphTargetItem getTargetType(ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { + public GraphTargetItem getTargetType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { return new TypeItem(DottedChain.BOOLEAN); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertDIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertDIns.java index 7744283b5..05b6b3c1c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertDIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertDIns.java @@ -29,6 +29,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.TypeItem; import java.util.List; +import java.util.Set; /** * convert_d instruction - Convert to number. @@ -53,7 +54,7 @@ public class ConvertDIns extends InstructionDefinition implements CoerceOrConver @Override public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { - stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.abc, localData.getConstants(), ins))); + stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.usedDeobfuscations, localData.abc, localData.getConstants(), ins))); } @Override @@ -67,7 +68,7 @@ public class ConvertDIns extends InstructionDefinition implements CoerceOrConver } @Override - public GraphTargetItem getTargetType(ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { + public GraphTargetItem getTargetType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { return new TypeItem(DottedChain.NUMBER); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertIIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertIIns.java index 0457652f6..c3e98475f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertIIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertIIns.java @@ -29,6 +29,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.TypeItem; import java.util.List; +import java.util.Set; /** * convert_i instruction - Convert to integer. @@ -53,7 +54,7 @@ public class ConvertIIns extends InstructionDefinition implements CoerceOrConver @Override public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { - stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.abc, localData.getConstants(), ins))); + stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.usedDeobfuscations, localData.abc, localData.getConstants(), ins))); } @Override @@ -67,7 +68,7 @@ public class ConvertIIns extends InstructionDefinition implements CoerceOrConver } @Override - public GraphTargetItem getTargetType(ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { + public GraphTargetItem getTargetType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { return new TypeItem(DottedChain.INT); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertOIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertOIns.java index da7b562a8..46c86b48f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertOIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertOIns.java @@ -31,6 +31,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.TypeItem; import java.util.List; +import java.util.Set; /** * convert_o instruction - Convert to object. @@ -63,7 +64,7 @@ public class ConvertOIns extends InstructionDefinition implements CoerceOrConver @Override public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { - stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.abc, localData.getConstants(), ins))); + stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.usedDeobfuscations, localData.abc, localData.getConstants(), ins))); } @Override @@ -77,7 +78,7 @@ public class ConvertOIns extends InstructionDefinition implements CoerceOrConver } @Override - public GraphTargetItem getTargetType(ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { + public GraphTargetItem getTargetType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { return new TypeItem(DottedChain.OBJECT); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertSIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertSIns.java index ecb4a63e4..4b3188963 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertSIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertSIns.java @@ -29,6 +29,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.TypeItem; import java.util.List; +import java.util.Set; /** * convert_s instruction - Convert to string. @@ -53,7 +54,7 @@ public class ConvertSIns extends InstructionDefinition implements CoerceOrConver @Override public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { - stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.abc, localData.getConstants(), ins))); + stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.usedDeobfuscations, localData.abc, localData.getConstants(), ins))); } @Override @@ -67,7 +68,7 @@ public class ConvertSIns extends InstructionDefinition implements CoerceOrConver } @Override - public GraphTargetItem getTargetType(ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { + public GraphTargetItem getTargetType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { return new TypeItem(DottedChain.STRING); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertUIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertUIns.java index 7b2576de1..403d6e35e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertUIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/ConvertUIns.java @@ -29,6 +29,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.TypeItem; import java.util.List; +import java.util.Set; /** * convert_u instruction - Convert to unsigned integer. @@ -53,7 +54,7 @@ public class ConvertUIns extends InstructionDefinition implements CoerceOrConver @Override public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { - stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.abc, localData.getConstants(), ins))); + stack.push(new ConvertAVM2Item(ins, localData.lineStartInstruction, stack.pop(), getTargetType(localData.usedDeobfuscations, localData.abc, localData.getConstants(), ins))); } @Override @@ -67,7 +68,7 @@ public class ConvertUIns extends InstructionDefinition implements CoerceOrConver } @Override - public GraphTargetItem getTargetType(ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { + public GraphTargetItem getTargetType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Instruction ins) { return new TypeItem(DottedChain.UINT); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/IsTypeIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/IsTypeIns.java index ff280537c..f1b601c43 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/IsTypeIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/types/IsTypeIns.java @@ -46,7 +46,7 @@ public class IsTypeIns extends InstructionDefinition { public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { int multinameIndex = ins.operands[0]; GraphTargetItem value = stack.pop(); - stack.push(new IsTypeAVM2Item(ins, localData.lineStartInstruction, value, new FullMultinameAVM2Item(false, ins, localData.lineStartInstruction, multinameIndex, localData.abc.constants.getMultiname(multinameIndex).getName(localData.abc, localData.getConstants(), new ArrayList<>(), true, true)))); + stack.push(new IsTypeAVM2Item(ins, localData.lineStartInstruction, value, new FullMultinameAVM2Item(false, ins, localData.lineStartInstruction, multinameIndex, localData.abc.constants.getMultiname(multinameIndex).getName(localData.usedDeobfuscations, localData.abc, localData.getConstants(), new ArrayList<>(), true, true)))); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/AVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/AVM2Item.java index 716526d74..963e22985 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/AVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/AVM2Item.java @@ -37,7 +37,9 @@ import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.model.LocalData; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; /** * AVM2 item base class. @@ -197,11 +199,12 @@ public abstract class AVM2Item extends GraphTargetItem { * @param swf SWF * @param localRegNames Local register names * @param reg Register + * @param usedDeobfuscations Used deobfuscations * @return Local register name */ - public static String localRegName(SWF swf, HashMap localRegNames, int reg) { + public static String localRegName(SWF swf, HashMap localRegNames, int reg, Set usedDeobfuscations) { if (localRegNames.containsKey(reg)) { - return IdentifiersDeobfuscation.printIdentifier(swf, true, localRegNames.get(reg)); + return IdentifiersDeobfuscation.printIdentifier(swf, usedDeobfuscations, true, localRegNames.get(reg)); } else { if (reg == 0) { return "this"; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ClassAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ClassAVM2Item.java index 73d5b03eb..295ba2a83 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ClassAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ClassAVM2Item.java @@ -65,11 +65,11 @@ public class ClassAVM2Item extends AVM2Item { public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) { if (classNameAsStr != null) { if (localData.fullyQualifiedNames != null && localData.fullyQualifiedNames.contains(classNameAsStr)) { - return writer.append(classNameAsStr.toPrintableString(localData.swf, true)); + return writer.append(classNameAsStr.toPrintableString(localData.usedDeobfuscations, localData.swf, true)); } - return writer.append(IdentifiersDeobfuscation.printIdentifier(localData.abc.getSwf(), true, classNameAsStr.getLast())); + return writer.append(IdentifiersDeobfuscation.printIdentifier(localData.abc.getSwf(), localData.usedDeobfuscations, true, classNameAsStr.getLast())); } - return writer.append(className.getName(localData.abc, localData.constantsAvm2, localData.fullyQualifiedNames, false, true)); + return writer.append(className.getName(localData.usedDeobfuscations, localData.abc, localData.constantsAvm2, localData.fullyQualifiedNames, false, true)); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/DecLocalAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/DecLocalAVM2Item.java index 74beafa3e..bb6c80f95 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/DecLocalAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/DecLocalAVM2Item.java @@ -47,7 +47,7 @@ public class DecLocalAVM2Item extends AVM2Item { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) { - writer.append(localRegName(localData.abc.getSwf(), localData.localRegNames, regIndex)); + writer.append(localRegName(localData.abc.getSwf(), localData.localRegNames, regIndex, localData.usedDeobfuscations)); return writer.append("--"); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FindDefAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FindDefAVM2Item.java index 62132e902..2a21cf7aa 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FindDefAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FindDefAVM2Item.java @@ -50,7 +50,7 @@ public class FindDefAVM2Item extends AVM2Item { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) { - return writer.append(propertyName.getNamespace(localData.constantsAvm2).getName(localData.constantsAvm2).toPrintableString(localData.swf, true)); //assume not null name + return writer.append(propertyName.getNamespace(localData.constantsAvm2).getName(localData.constantsAvm2).toPrintableString(localData.usedDeobfuscations, localData.swf, true)); //assume not null name } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java index 8650747a7..c514c26be 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FullMultinameAVM2Item.java @@ -32,6 +32,7 @@ import com.jpexs.decompiler.graph.model.LocalData; import com.jpexs.helpers.Reference; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; import java.util.Set; @@ -154,17 +155,17 @@ public class FullMultinameAVM2Item extends AVM2Item { public boolean isTopLevel(String tname, ABC abc, HashMap localRegNames, List fullyQualifiedNames, Set seenMethods) throws InterruptedException { String cname; if (name != null) { - cname = name.toString(LocalData.create(new ArrayList<>(), null, abc, localRegNames, fullyQualifiedNames, seenMethods, ScriptExportMode.AS, -1)); + cname = name.toString(LocalData.create(new ArrayList<>(), null, abc, localRegNames, fullyQualifiedNames, seenMethods, ScriptExportMode.AS, -1, new LinkedHashSet<>())); } else { - cname = (abc.constants.getMultiname(multinameIndex).getName(abc, abc.constants, fullyQualifiedNames, true, true)); + cname = (abc.constants.getMultiname(multinameIndex).getName(new LinkedHashSet<>(), abc, abc.constants, fullyQualifiedNames, true, true)); } String cns = ""; if (namespace != null) { - cns = namespace.toString(LocalData.create(new ArrayList<>(), null, abc, localRegNames, fullyQualifiedNames, seenMethods, ScriptExportMode.AS, -1)); + cns = namespace.toString(LocalData.create(new ArrayList<>(), null, abc, localRegNames, fullyQualifiedNames, seenMethods, ScriptExportMode.AS, -1, new LinkedHashSet<>())); } else { Namespace ns = abc.constants.getMultiname(multinameIndex).getNamespace(abc.constants); if ((ns != null) && (ns.name_index != 0)) { - cns = ns.getName(abc.constants).toPrintableString(abc.getSwf(), true); + cns = ns.getName(abc.constants).toPrintableString(new LinkedHashSet<>(), abc.getSwf(), true); } } return cname.equals(tname) && cns.isEmpty(); @@ -206,16 +207,16 @@ public class FullMultinameAVM2Item extends AVM2Item { AVM2ConstantPool constants = localData.constantsAvm2; List fullyQualifiedNames = property ? new ArrayList<>() : localData.fullyQualifiedNames; if (multinameIndex > 0 && multinameIndex < constants.getMultinameCount()) { - String simpleName = constants.getMultiname(multinameIndex).getName(localData.abc, constants, fullyQualifiedNames, true, false); + String simpleName = constants.getMultiname(multinameIndex).getName(localData.usedDeobfuscations, localData.abc, constants, fullyQualifiedNames, true, false); if ("*".equals(simpleName)) { writer.append("*"); } else { Reference customNsRef = new Reference<>(null); - String localName = constants.getMultiname(multinameIndex).getNameAndCustomNamespace(localData.abc, localData.fullyQualifiedNames, false, true, customNsRef); + String localName = constants.getMultiname(multinameIndex).getNameAndCustomNamespace(localData.usedDeobfuscations, localData.abc, localData.fullyQualifiedNames, false, true, customNsRef); DottedChain customNs = customNsRef.getVal(); if (customNs != null) { String nsname = customNs.getLast(); - String identifier = IdentifiersDeobfuscation.printIdentifier(localData.abc.getSwf(), true, nsname); + String identifier = IdentifiersDeobfuscation.printIdentifier(localData.abc.getSwf(), localData.usedDeobfuscations, true, nsname); writer.hilightSpecial(identifier, HighlightSpecialType.TYPE_NAME, customNs.toRawString()); writer.appendNoHilight("::"); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetLexAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetLexAVM2Item.java index 992788bf2..bee1c2ccb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetLexAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetLexAVM2Item.java @@ -28,6 +28,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.model.LocalData; import com.jpexs.helpers.Reference; import java.util.Objects; +import java.util.Set; /** * Find and get property. @@ -72,12 +73,12 @@ public class GetLexAVM2Item extends AVM2Item { * @param callType Call type * @param isStatic Is static */ - public GetLexAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, Multiname propertyName, ABC abc, AVM2ConstantPool constants, GraphTargetItem type, GraphTargetItem callType, boolean isStatic) { + public GetLexAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, Multiname propertyName, ABC abc, AVM2ConstantPool constants, GraphTargetItem type, GraphTargetItem callType, boolean isStatic, Set usedDeobfuscations) { super(instruction, lineStartIns, PRECEDENCE_PRIMARY); this.propertyName = propertyName; this.type = type; this.callType = callType; - this.fullPropertyName = propertyName.getNameWithNamespace(abc, constants, true); + this.fullPropertyName = propertyName.getNameWithNamespace(usedDeobfuscations, abc, constants, true); this.isStatic = isStatic; } @@ -92,11 +93,11 @@ public class GetLexAVM2Item extends AVM2Item { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) { Reference customNsRef = new Reference<>(null); - String localName = propertyName.getNameAndCustomNamespace(localData.abc, localData.fullyQualifiedNames, false, true, customNsRef); + String localName = propertyName.getNameAndCustomNamespace(localData.usedDeobfuscations, localData.abc, localData.fullyQualifiedNames, false, true, customNsRef); DottedChain customNs = customNsRef.getVal(); if (customNs != null) { String nsname = customNs.getLast(); - String identifier = IdentifiersDeobfuscation.printIdentifier(localData.abc.getSwf(), true, nsname); + String identifier = IdentifiersDeobfuscation.printIdentifier(localData.abc.getSwf(), localData.usedDeobfuscations, true, nsname); writer.hilightSpecial(identifier, HighlightSpecialType.TYPE_NAME, customNs.toRawString()); writer.appendNoHilight("::"); getSrcData().localName = nsname + "::" + localName; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetSlotAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetSlotAVM2Item.java index 2545306ee..011f729ff 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetSlotAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetSlotAVM2Item.java @@ -93,7 +93,7 @@ public class GetSlotAVM2Item extends AVM2Item { if (slotName == null) { return slotObject.toString(localData) + ".§§slot[" + slotIndex + "]"; } - return slotName.getName(localData.abc, localData.constantsAvm2, localData.fullyQualifiedNames, false, true); + return slotName.getName(localData.usedDeobfuscations, localData.abc, localData.constantsAvm2, localData.fullyQualifiedNames, false, true); } public GraphTextWriter getName(GraphTextWriter writer, LocalData localData) throws InterruptedException { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IncLocalAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IncLocalAVM2Item.java index 608ca1922..280a7466e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IncLocalAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IncLocalAVM2Item.java @@ -47,7 +47,7 @@ public class IncLocalAVM2Item extends AVM2Item { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) { - writer.append(localRegName(localData.abc.getSwf(), localData.localRegNames, regIndex)); + writer.append(localRegName(localData.abc.getSwf(), localData.localRegNames, regIndex, localData.usedDeobfuscations)); return writer.append("++"); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/LocalRegAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/LocalRegAVM2Item.java index 8030cb2d6..72f54c4dd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/LocalRegAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/LocalRegAVM2Item.java @@ -91,7 +91,7 @@ public class LocalRegAVM2Item extends AVM2Item { return computedValue.toString(writer, localData); } - String localName = localRegName(localData.abc.getSwf(), localData.localRegNames, regIndex); + String localName = localRegName(localData.abc.getSwf(), localData.localRegNames, regIndex, localData.usedDeobfuscations); getSrcData().localName = localName; return writer.append(localName); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NameSpaceAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NameSpaceAVM2Item.java index c2f31f767..38ca572f2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NameSpaceAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NameSpaceAVM2Item.java @@ -60,7 +60,7 @@ public class NameSpaceAVM2Item extends AVM2Item { String nsname = dc != null ? dc.getLast() : null; if (nsname != null) { - String identifier = IdentifiersDeobfuscation.printIdentifier(localData.abc.getSwf(), true, nsname); + String identifier = IdentifiersDeobfuscation.printIdentifier(localData.abc.getSwf(), localData.usedDeobfuscations, true, nsname); if (identifier != null && !identifier.isEmpty()) { writer.append(identifier); return writer; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NewFunctionAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NewFunctionAVM2Item.java index 84d96c456..2bbaa033a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NewFunctionAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/NewFunctionAVM2Item.java @@ -116,7 +116,7 @@ public class NewFunctionAVM2Item extends AVM2Item { writer.startMethod(methodIndex, null); writer.append((!functionName.isEmpty() ? " " + functionName : "")); writer.appendNoHilight("("); - abc.method_info.get(methodIndex).getParamStr(writer, abc.constants, body, abc, localData.fullyQualifiedNames); + abc.method_info.get(methodIndex).getParamStr(writer, abc.constants, body, abc, localData.fullyQualifiedNames, localData.usedDeobfuscations); writer.appendNoHilight("):"); if (Configuration.showMethodBodyId.get()) { writer.appendNoHilight("// method body index: "); @@ -125,13 +125,13 @@ public class NewFunctionAVM2Item extends AVM2Item { writer.appendNoHilight(methodIndex); writer.newLine(); } - abc.method_info.get(methodIndex).getReturnTypeStr(writer, abc, abc.constants, localData.fullyQualifiedNames); + abc.method_info.get(methodIndex).getReturnTypeStr(writer, abc, abc.constants, localData.fullyQualifiedNames, localData.usedDeobfuscations); writer.startBlock(); if (body != null) { List callStack = new ArrayList<>(localData.callStack); callStack.add(body); - body.convert(localData.swfVersion, callStack, localData.abcIndex, new ConvertData(), path + "/inner", ScriptExportMode.AS, isStatic, methodIndex, scriptIndex, classIndex, abc, null, scopeStack, 0, new NulWriter(), localData.fullyQualifiedNames, null, false, new HashSet<>(localData.seenMethods), new ArrayList<>()); - body.toString(localData.swfVersion, callStack, localData.abcIndex, path + "/inner", ScriptExportMode.AS, abc, null, writer, localData.fullyQualifiedNames, new HashSet<>(localData.seenMethods)); + body.convert(localData.swfVersion, callStack, localData.abcIndex, new ConvertData(), path + "/inner", ScriptExportMode.AS, isStatic, methodIndex, scriptIndex, classIndex, abc, null, scopeStack, 0, new NulWriter(), localData.fullyQualifiedNames, null, false, new HashSet<>(localData.seenMethods), new ArrayList<>(), localData.usedDeobfuscations); + body.toString(localData.usedDeobfuscations, localData.swfVersion, callStack, localData.abcIndex, path + "/inner", ScriptExportMode.AS, abc, null, writer, localData.fullyQualifiedNames, new HashSet<>(localData.seenMethods)); } writer.endBlock(); writer.endMethod(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/PackageAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/PackageAVM2Item.java index 18b5f4951..b5de4d33b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/PackageAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/PackageAVM2Item.java @@ -51,7 +51,7 @@ public class PackageAVM2Item extends AVM2Item { public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { writer.appendNoHilight("package"); if (!packageName.isEmpty()) { - writer.appendNoHilight(" " + DottedChain.parseWithSuffix(packageName).toPrintableString(localData.swf, true)); + writer.appendNoHilight(" " + DottedChain.parseWithSuffix(packageName).toPrintableString(localData.usedDeobfuscations, localData.swf, true)); } writer.startBlock(); Graph.graphToString(items, writer, localData); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetLocalAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetLocalAVM2Item.java index 74ba34dd0..36309d07f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetLocalAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetLocalAVM2Item.java @@ -104,7 +104,7 @@ public class SetLocalAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assig @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - String localName = localRegName(localData.abc.getSwf(), localData.localRegNames, regIndex); + String localName = localRegName(localData.abc.getSwf(), localData.localRegNames, regIndex, localData.usedDeobfuscations); getSrcData().localName = localName; writer.append(localName); if (hideValue) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetSlotAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetSlotAVM2Item.java index a7c8a944f..3eeddaa09 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetSlotAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetSlotAVM2Item.java @@ -152,7 +152,7 @@ public class SetSlotAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assign if (slotName == null) { return slotObject.toString(localData) + ".§§slot[" + slotIndex + "]"; } - return slotName.getName(localData.abc, localData.constantsAvm2, localData.fullyQualifiedNames, false, true); + return slotName.getName(localData.usedDeobfuscations, localData.abc, localData.constantsAvm2, localData.fullyQualifiedNames, false, true); } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ThisAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ThisAVM2Item.java index d153079b1..477697cf0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ThisAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ThisAVM2Item.java @@ -114,9 +114,9 @@ public class ThisAVM2Item extends AVM2Item { if (showClassName) { if (className != null) { if (localData.fullyQualifiedNames != null && localData.fullyQualifiedNames.contains(className)) { - return writer.append(className.toPrintableString(localData.swf, true)).append(".this"); + return writer.append(className.toPrintableString(localData.usedDeobfuscations, localData.swf, true)).append(".this"); } - return writer.append(IdentifiersDeobfuscation.printIdentifier(localData.abc.getSwf(), true, className.getLast())).append(".this"); + return writer.append(IdentifiersDeobfuscation.printIdentifier(localData.abc.getSwf(), localData.usedDeobfuscations, true, className.getLast())).append(".this"); } } return writer.append("this"); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/TraitSlotConstAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/TraitSlotConstAVM2Item.java index 3ca101db1..c25bff686 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/TraitSlotConstAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/TraitSlotConstAVM2Item.java @@ -92,6 +92,7 @@ public class TraitSlotConstAVM2Item extends AVM2Item { cd.assignedValues.put(trait, new AssignedValue(null, assignedValue, initializer, methodIndex)); boolean insideInterface = classIndex > -1 ? localData.abc.instance_info.get(classIndex).isInterface() : false; trait.toString( + localData.usedDeobfuscations, localData.swfVersion, localData.abcIndex, DottedChain.EMPTY /*??*/, diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java index 35657e901..99734071b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java @@ -92,7 +92,7 @@ public class DeclarationAVM2Item extends AVM2Item { if (assignment instanceof LocalRegAVM2Item) { //for..in LocalRegAVM2Item lti = (LocalRegAVM2Item) assignment; - String localName = localRegName(localData.abc.getSwf(), localData.localRegNames, lti.regIndex); + String localName = localRegName(localData.abc.getSwf(), localData.localRegNames, lti.regIndex, localData.usedDeobfuscations); HighlightData srcData = getSrcData(); srcData.localName = localName; srcData.declaration = true; @@ -116,7 +116,7 @@ public class DeclarationAVM2Item extends AVM2Item { if (assignment instanceof SetLocalAVM2Item) { SetLocalAVM2Item lti = (SetLocalAVM2Item) assignment; - String localName = localRegName(localData.abc.getSwf(), localData.localRegNames, lti.regIndex); + String localName = localRegName(localData.abc.getSwf(), localData.localRegNames, lti.regIndex, localData.usedDeobfuscations); HighlightData srcData = getSrcData(); srcData.localName = localName; srcData.declaration = true; @@ -163,7 +163,7 @@ public class DeclarationAVM2Item extends AVM2Item { GraphTargetItem val = spti.value; srcData.declaredType = (type instanceof TypeItem) ? ((TypeItem) type).fullTypeName : DottedChain.ALL; writer.append("var "); - writer.append(IdentifiersDeobfuscation.printIdentifier(localData.abc.getSwf(), true, ((FullMultinameAVM2Item) spti.propertyName).resolvedMultinameName)); + writer.append(IdentifiersDeobfuscation.printIdentifier(localData.abc.getSwf(), localData.usedDeobfuscations, true, ((FullMultinameAVM2Item) spti.propertyName).resolvedMultinameName)); writer.append(":"); type.appendTry(writer, localData); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ExceptionAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ExceptionAVM2Item.java index 974dcddd9..3bb84676d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ExceptionAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ExceptionAVM2Item.java @@ -47,7 +47,7 @@ public class ExceptionAVM2Item extends AVM2Item { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) { - return writer.append(exception.getVarName(localData.abc, localData.constantsAvm2, localData.fullyQualifiedNames)); + return writer.append(exception.getVarName(localData.usedDeobfuscations, localData.abc, localData.constantsAvm2, localData.fullyQualifiedNames)); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java index 2219bc140..38b0e18a4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java @@ -142,7 +142,7 @@ public class TryAVM2Item extends AVM2Item implements Block { for (int e = 0; e < catchExceptions.size(); e++) { writer.newLine(); writer.append("catch("); - String localName = catchExceptions.get(e).getVarName(localData.abc, localData.constantsAvm2, localData.fullyQualifiedNames); + String localName = catchExceptions.get(e).getVarName(localData.usedDeobfuscations, localData.abc, localData.constantsAvm2, localData.fullyQualifiedNames); if (localName.isEmpty()) { localName = finCatchName; } @@ -153,10 +153,10 @@ public class TryAVM2Item extends AVM2Item implements Block { int eti = catchExceptions.get(e).type_index; - data.declaredType = eti <= 0 ? DottedChain.ALL : localData.constantsAvm2.getMultiname(eti).getNameWithNamespace(localData.abc, localData.constantsAvm2, true); + data.declaredType = eti <= 0 ? DottedChain.ALL : localData.constantsAvm2.getMultiname(eti).getNameWithNamespace(localData.usedDeobfuscations, localData.abc, localData.constantsAvm2, true); writer.hilightSpecial(localName, HighlightSpecialType.TRY_NAME, e, data); writer.append(":"); - writer.hilightSpecial(catchExceptions.get(e).getTypeName(localData.abc, localData.constantsAvm2, localData.fullyQualifiedNames), HighlightSpecialType.TRY_TYPE, e); + writer.hilightSpecial(catchExceptions.get(e).getTypeName(localData.usedDeobfuscations, localData.abc, localData.constantsAvm2, localData.fullyQualifiedNames), HighlightSpecialType.TRY_TYPE, e); writer.append(")"); List commands = catchCommands.get(e); appendBlock(null, writer, localData, commands); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java index ad3bf737a..0c9a07b8a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java @@ -116,6 +116,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.logging.Level; @@ -231,7 +232,7 @@ public class AVM2SourceGenerator implements SourceGenerator { Multiname m = ci.abc.instance_info.get(ci.index).getName(ci.abc.constants); if (m != null) { Namespace ns = ci.abc.instance_info.get(ci.index).getName(ci.abc.constants).getNamespace(ci.abc.constants); - String n = m.getName(ci.abc, ci.abc.constants, new ArrayList<>(), true, true /*FIXME!!*/); + String n = m.getName(new LinkedHashSet<>(), ci.abc, ci.abc.constants, new ArrayList<>(), true, true /*FIXME!!*/); String nsn = ns == null ? null : ns.getRawName(ci.abc.constants); name_index = constants.getQnameId( n, @@ -253,7 +254,7 @@ public class AVM2SourceGenerator implements SourceGenerator { if (name_index == 0) { if (pkg.isEmpty() && localData.currentScript != null /*FIXME!*/) { for (Trait t : localData.currentScript.traits.traits) { - if (t.getName(abc).getName(abc, constants, null, true, true /*FIXME!!*/).equals(name)) { + if (t.getName(abc).getName(new LinkedHashSet<>(), abc, constants, null, true, true /*FIXME!!*/).equals(name)) { name_index = t.name_index; break; } @@ -718,7 +719,7 @@ public class AVM2SourceGenerator implements SourceGenerator { List callStack = new ArrayList<>(); callStack.add(pcinit); try { - pcinit.convert(-1 /*FIXME??*/, callStack, null, d, "-", ScriptExportMode.AS, true, mi, -1, ci.index, ci.abc, null, new ScopeStack(), GraphTextWriter.TRAIT_CLASS_INITIALIZER, new NulWriter(), new ArrayList<>(), ci.abc.class_info.get(ci.index).static_traits, false, new HashSet<>(), new ArrayList<>()); + pcinit.convert(-1 /*FIXME??*/, callStack, null, d, "-", ScriptExportMode.AS, true, mi, -1, ci.index, ci.abc, null, new ScopeStack(), GraphTextWriter.TRAIT_CLASS_INITIALIZER, new NulWriter(), new ArrayList<>(), ci.abc.class_info.get(ci.index).static_traits, false, new HashSet<>(), new ArrayList<>(), new LinkedHashSet<>()); //FIXME! Add skinparts from _skinParts attribute of parent class!!! } catch (InterruptedException ex) { Logger.getLogger(AVM2SourceGenerator.class.getName()).log(Level.SEVERE, "Getting parent skinparts interrupted", ex); @@ -727,7 +728,7 @@ public class AVM2SourceGenerator implements SourceGenerator { if (t instanceof TraitSlotConst) { TraitSlotConst tsc = (TraitSlotConst) t; if (tsc.kindType == Trait.TRAIT_SLOT) { - if ("_skinParts".equals(tsc.getName(ci.abc).getName(ci.abc, ci.abc.constants, new ArrayList<>(), true, true))) { + if ("_skinParts".equals(tsc.getName(ci.abc).getName(new LinkedHashSet<>(), ci.abc, ci.abc.constants, new ArrayList<>(), true, true))) { if (d.assignedValues.containsKey(tsc)) { if (d.assignedValues.get(tsc).value instanceof NewObjectAVM2Item) { NewObjectAVM2Item no = (NewObjectAVM2Item) d.assignedValues.get(tsc).value; @@ -1812,7 +1813,7 @@ public class AVM2SourceGenerator implements SourceGenerator { instanceInfo.super_index = abcIndex.getSelectedAbc().constants.getMultinameId(Multiname.createQName(false, str("Object"), namespace(Namespace.KIND_PACKAGE, "")), true); } if (instanceInfo.super_index != 0) { - int foundClass = abc.findClassByName(abc.constants.getMultiname(instanceInfo.super_index).getNameWithNamespace(abc, abc.constants, true)); + int foundClass = abc.findClassByName(abc.constants.getMultiname(instanceInfo.super_index).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, true)); if (foundClass > -1) { if (foundClass > minClassIndex) { minClassIndex = foundClass; @@ -1822,7 +1823,7 @@ public class AVM2SourceGenerator implements SourceGenerator { instanceInfo.interfaces = new int[((ClassAVM2Item) item).implementsOp.size()]; for (int i = 0; i < ((ClassAVM2Item) item).implementsOp.size(); i++) { instanceInfo.interfaces[i] = superIntName(localData, ((ClassAVM2Item) item).implementsOp.get(i)); - int foundIface = abc.findClassByName(abc.constants.getMultiname(instanceInfo.interfaces[i]).getNameWithNamespace(abc, abc.constants, true)); + int foundIface = abc.findClassByName(abc.constants.getMultiname(instanceInfo.interfaces[i]).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, true)); if (foundIface > -1) { if (foundIface > minClassIndex) { minClassIndex = foundIface; @@ -1845,7 +1846,7 @@ public class AVM2SourceGenerator implements SourceGenerator { GraphTargetItem un = ((InterfaceAVM2Item) item).superInterfaces.get(i); instanceInfo.interfaces[i] = superIntName(localData, un); - int foundIface = abc.findClassByName(abc.constants.getMultiname(instanceInfo.interfaces[i]).getNameWithNamespace(abc, abc.constants, true)); + int foundIface = abc.findClassByName(abc.constants.getMultiname(instanceInfo.interfaces[i]).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, true)); if (foundIface > -1) { if (foundIface > minClassIndex) { minClassIndex = foundIface; @@ -2342,7 +2343,7 @@ public class AVM2SourceGenerator implements SourceGenerator { for (Trait t : scriptInfo.traits.traits) { if (t instanceof TraitClass) { TraitClass tc = (TraitClass) t; - DottedChain className = tc.getName(abc).getNameWithNamespace(abc, abc.constants, true); + DottedChain className = tc.getName(abc).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, true); List parents = new ArrayList<>(); if (documentClass != null && documentClass.equals(className)) { @@ -2356,7 +2357,7 @@ public class AVM2SourceGenerator implements SourceGenerator { sinitcode.add(ins(AVM2Instructions.PushNull)); } else { - AbcIndexing.ClassIndex ci = abcIndex.findClass(AbcIndexing.multinameToType(abc.instance_info.get(tc.class_info).name_index, abc, constants), abc, scriptIndex); + AbcIndexing.ClassIndex ci = abcIndex.findClass(AbcIndexing.multinameToType(new LinkedHashSet<>(), abc.instance_info.get(tc.class_info).name_index, abc, constants), abc, scriptIndex); while (ci != null && ci.parent != null) { ci = ci.parent; Multiname origM = ci.abc.constants.getMultiname(ci.abc.instance_info.get(ci.index).name_index); @@ -2430,7 +2431,7 @@ public class AVM2SourceGenerator implements SourceGenerator { indices.add( abc.getSelectedAbc().constants.getMultinameId( Multiname.createQName(false, - abc.getSelectedAbc().constants.getStringId(superName.getName(a, a.constants, null, true, true /*FIXME!!! ???*/), true), + abc.getSelectedAbc().constants.getStringId(superName.getName(new LinkedHashSet<>(), a, a.constants, null, true, true /*FIXME!!! ???*/), true), abc.getSelectedAbc().constants.getNamespaceId(superName.getNamespace(a.constants).kind, superName.getNamespace(a.constants).getName(a.constants), 0, true)), true) ); } @@ -2449,16 +2450,16 @@ public class AVM2SourceGenerator implements SourceGenerator { if (tsc.type_index == 0) { return TypeItem.UNBOUNDED; } - return AbcIndexing.multinameToType(tsc.type_index, abc.getSelectedAbc(), abc.getSelectedAbc().constants); + return AbcIndexing.multinameToType(new LinkedHashSet<>(), tsc.type_index, abc.getSelectedAbc(), abc.getSelectedAbc().constants); } if (t instanceof TraitMethodGetterSetter) { TraitMethodGetterSetter tmgs = (TraitMethodGetterSetter) t; if (tmgs.kindType == Trait.TRAIT_GETTER) { - return AbcIndexing.multinameToType(abc.getSelectedAbc().method_info.get(tmgs.method_info).ret_type, abc.getSelectedAbc(), abc.getSelectedAbc().constants); + return AbcIndexing.multinameToType(new LinkedHashSet<>(), abc.getSelectedAbc().method_info.get(tmgs.method_info).ret_type, abc.getSelectedAbc(), abc.getSelectedAbc().constants); } if (tmgs.kindType == Trait.TRAIT_SETTER) { if (abc.getSelectedAbc().method_info.get(tmgs.method_info).param_types.length > 0) { - return AbcIndexing.multinameToType(abc.getSelectedAbc().method_info.get(tmgs.method_info).param_types[0], abc.getSelectedAbc(), abc.getSelectedAbc().constants); + return AbcIndexing.multinameToType(new LinkedHashSet<>(), abc.getSelectedAbc().method_info.get(tmgs.method_info).param_types[0], abc.getSelectedAbc(), abc.getSelectedAbc().constants); } else { return TypeItem.UNBOUNDED; } @@ -2557,12 +2558,12 @@ public class AVM2SourceGenerator implements SourceGenerator { * @param outABCs Out ABCs */ public static void parentNames(AbcIndexing abc, int scriptIndex, int name_index, List indices, List names, List namespaces, List outABCs) { - AbcIndexing.ClassIndex ci = abc.findClass(new TypeItem(abc.getSelectedAbc().constants.getMultiname(name_index).getNameWithNamespace(abc.getSelectedAbc(), abc.getSelectedAbc().constants, true /*FIXME!!*/)), abc.getSelectedAbc(), scriptIndex); + AbcIndexing.ClassIndex ci = abc.findClass(new TypeItem(abc.getSelectedAbc().constants.getMultiname(name_index).getNameWithNamespace(new LinkedHashSet<>(), abc.getSelectedAbc(), abc.getSelectedAbc().constants, true /*FIXME!!*/)), abc.getSelectedAbc(), scriptIndex); while (ci != null) { int ni = ci.abc.instance_info.get(ci.index).name_index; indices.add(ni); outABCs.add(ci.abc); - names.add(ci.abc.constants.getMultiname(ni).getName(ci.abc, ci.abc.constants, null, true, true/*FIXME!!*/)); + names.add(ci.abc.constants.getMultiname(ni).getName(new LinkedHashSet<>(), ci.abc, ci.abc.constants, null, true, true/*FIXME!!*/)); namespaces.add(ci.abc.constants.getMultiname(ni).getNamespace(ci.abc.constants).getName(ci.abc.constants).toRawString()); ci = ci.parent; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java index b1f9f7f90..5d0c81153 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java @@ -512,7 +512,7 @@ public final class AbcIndexing { */ @Override public String toString() { - return abc.constants.getMultiname(abc.instance_info.get(index).name_index).getNameWithNamespace(abc, abc.constants, true).toPrintableString(abc.getSwf(), true); + return abc.constants.getMultiname(abc.instance_info.get(index).name_index).getNameWithNamespace(new LinkedHashSet<>() /*???*/, abc, abc.constants, true).toPrintableString(new LinkedHashSet<>(), abc.getSwf(), true); } /** @@ -616,18 +616,18 @@ public final class AbcIndexing { return classNames; } - public void getClassTraits(GraphTargetItem cls, ABC abc, Integer scriptIndex, boolean getStatic, boolean getInstance, boolean getInheritance, List ret, List staticRet) { + public void getClassTraits(Set usedDeobfuscations, GraphTargetItem cls, ABC abc, Integer scriptIndex, boolean getStatic, boolean getInstance, boolean getInheritance, List ret, List staticRet) { ClassIndex ci = findClass(cls, abc, scriptIndex); if (ci == null) { return; } ret.clear(); staticRet.clear(); - getClassIndexTraitNames(ret, staticRet, ci, getStatic, getInstance, getInheritance, new HashSet<>()); + getClassIndexTraitNames(usedDeobfuscations, ret, staticRet, ci, getStatic, getInstance, getInheritance, new HashSet<>()); } - private void getClassIndexTraitNames(List ret, List staticRet, ClassIndex ci, boolean getStatic, boolean getInstance, boolean getInheritance, Set used) { - GraphTargetItem ciName = multinameToType(ci.abc.instance_info.get(ci.index).name_index, ci.abc, ci.abc.constants); + private void getClassIndexTraitNames(Set usedDeobfuscations, List ret, List staticRet, ClassIndex ci, boolean getStatic, boolean getInstance, boolean getInheritance, Set used) { + GraphTargetItem ciName = multinameToType(usedDeobfuscations, ci.abc.instance_info.get(ci.index).name_index, ci.abc, ci.abc.constants); boolean isObject = ciName.equals(new TypeItem("Object")); List ignoredObjectTraits = Arrays.asList("_init", "_dontEnumPrototype", "_setPropertyIsEnumerable"); @@ -680,11 +680,11 @@ public final class AbcIndexing { } if (parent != null) { - parent.getClassIndexTraitNames(ret, staticRet, ci, getStatic, getInstance, getInheritance, used); + parent.getClassIndexTraitNames(usedDeobfuscations, ret, staticRet, ci, getStatic, getInstance, getInheritance, used); } if (getInheritance && ci.parent != null) { - getClassIndexTraitNames(ret, staticRet, ci.parent, getStatic, getInstance, getInheritance, used); + getClassIndexTraitNames(usedDeobfuscations, ret, staticRet, ci.parent, getStatic, getInstance, getInheritance, used); } } @@ -890,7 +890,7 @@ public final class AbcIndexing { AbcIndexing.ClassIndex ci = findClass(prop.parent, prop.abc, null); if (ci != null && ci.parent != null && (prop.abc == null || prop.propNsIndex == 0)) { AbcIndexing.ClassIndex ciParent = ci.parent; - DottedChain parentClass = ciParent.abc.instance_info.get(ciParent.index).getName(ciParent.abc.constants).getNameWithNamespace(ciParent.abc, ciParent.abc.constants, true); + DottedChain parentClass = ciParent.abc.instance_info.get(ciParent.index).getName(ciParent.abc.constants).getNameWithNamespace(new LinkedHashSet<>(), ciParent.abc, ciParent.abc.constants, true); TraitIndex pti = findProperty(new PropertyDef(prop.propName, new TypeItem(parentClass), prop.getPropNsString()), findStatic, findInstance, findProtected, foundStatic); if (pti != null) { return pti; @@ -919,12 +919,13 @@ public final class AbcIndexing { /** * Converts multiname to type + * @param usedDeobfuscations Used deobfuscations * @param m_index Multiname index * @param abc ABC * @param constants AVM2 constant pool * @return Type */ - public static GraphTargetItem multinameToType(int m_index, ABC abc, AVM2ConstantPool constants) { + public static GraphTargetItem multinameToType(Set usedDeobfuscations, int m_index, ABC abc, AVM2ConstantPool constants) { if (m_index == 0) { return TypeItem.UNBOUNDED; } @@ -933,13 +934,13 @@ public final class AbcIndexing { return null; } if (m.kind == Multiname.TYPENAME) { - GraphTargetItem obj = multinameToType(m.qname_index, abc, constants); + GraphTargetItem obj = multinameToType(usedDeobfuscations, m.qname_index, abc, constants); if (obj == null) { return null; } List params = new ArrayList<>(); for (int pm : m.params) { - GraphTargetItem r = multinameToType(pm, abc, constants); + GraphTargetItem r = multinameToType(usedDeobfuscations, pm, abc, constants); if (r == null) { return null; } @@ -951,13 +952,13 @@ public final class AbcIndexing { return new ApplyTypeAVM2Item(null, null, obj, params); } else { if (m.namespace_index != 0 && m.getNamespace(constants).kind == Namespace.KIND_PRIVATE) { - return new TypeItem(m.getName(abc, constants, new ArrayList<>(), true, true), "ns:" + m.namespace_index); + return new TypeItem(m.getName(usedDeobfuscations, abc, constants, new ArrayList<>(), true, true), "ns:" + m.namespace_index); } - return new TypeItem(m.getNameWithNamespace(abc, constants, true)); + return new TypeItem(m.getNameWithNamespace(usedDeobfuscations, abc, constants, true)); } } - private static GraphTargetItem getTraitCallReturnType(ABC abc, Trait t) { + private static GraphTargetItem getTraitCallReturnType(Set usedDeobfuscations, ABC abc, Trait t) { if (t instanceof TraitSlotConst) { return TypeItem.UNBOUNDED; } @@ -969,33 +970,33 @@ public final class AbcIndexing { if (tmgs.kindType == Trait.TRAIT_SETTER) { return TypeItem.UNBOUNDED; } - return multinameToType(abc.method_info.get(tmgs.method_info).ret_type, abc, abc.constants); + return multinameToType(usedDeobfuscations, abc.method_info.get(tmgs.method_info).ret_type, abc, abc.constants); } if (t instanceof TraitFunction) { TraitFunction tf = (TraitFunction) t; - return multinameToType(abc.method_info.get(tf.method_info).ret_type, abc, abc.constants); + return multinameToType(usedDeobfuscations, abc.method_info.get(tf.method_info).ret_type, abc, abc.constants); } return TypeItem.UNBOUNDED; } - private static GraphTargetItem getTraitReturnType(ABC abc, Trait t) { + private static GraphTargetItem getTraitReturnType(Set usedDeobfuscations, ABC abc, Trait t) { if (t instanceof TraitSlotConst) { TraitSlotConst tsc = (TraitSlotConst) t; if (tsc.type_index == 0) { return TypeItem.UNBOUNDED; } - return multinameToType(tsc.type_index, abc, abc.constants); + return multinameToType(usedDeobfuscations, tsc.type_index, abc, abc.constants); } if (t instanceof TraitMethodGetterSetter) { TraitMethodGetterSetter tmgs = (TraitMethodGetterSetter) t; if (tmgs.kindType == Trait.TRAIT_GETTER) { - return multinameToType(abc.method_info.get(tmgs.method_info).ret_type, abc, abc.constants); + return multinameToType(usedDeobfuscations, abc.method_info.get(tmgs.method_info).ret_type, abc, abc.constants); } if (tmgs.kindType == Trait.TRAIT_SETTER) { if (abc.method_info.get(tmgs.method_info).param_types.length > 0) { - return multinameToType(abc.method_info.get(tmgs.method_info).param_types[0], abc, abc.constants); + return multinameToType(usedDeobfuscations, abc.method_info.get(tmgs.method_info).param_types[0], abc, abc.constants); } else { return TypeItem.UNBOUNDED; } @@ -1026,13 +1027,13 @@ public final class AbcIndexing { propValue = new ValueKind(tsc.value_index, tsc.value_kind); } if (map != null) { - PropertyDef dp = new PropertyDef(t.getName(abc).getName(abc, abc.constants, new ArrayList<>() /*?*/, true, false), multinameToType(name_index, abc, abc.constants), abc, abc.constants.getMultiname(t.name_index).namespace_index); - map.put(dp, new TraitIndex(t, abc, getTraitReturnType(abc, t), getTraitCallReturnType(abc, t), propValue, multinameToType(name_index, abc, abc.constants), scriptIndex)); + PropertyDef dp = new PropertyDef(t.getName(abc).getName(new LinkedHashSet<>(), abc, abc.constants, new ArrayList<>() /*?*/, true, false), multinameToType(new LinkedHashSet<>(), name_index, abc, abc.constants), abc, abc.constants.getMultiname(t.name_index).namespace_index); + map.put(dp, new TraitIndex(t, abc, getTraitReturnType(new LinkedHashSet<>(), abc, t), getTraitCallReturnType(new LinkedHashSet<>(), abc, t), propValue, multinameToType(new LinkedHashSet<>(), name_index, abc, abc.constants), scriptIndex)); } if (mapNs != null) { Multiname m = abc.constants.getMultiname(t.name_index); - PropertyNsDef ndp = new PropertyNsDef(t.getName(abc).getName(abc, abc.constants, new ArrayList<>() /*?*/, true, true/*FIXME ???*/), m == null || m.namespace_index == 0 ? DottedChain.EMPTY : m.getNamespace(abc.constants).getName(abc.constants), abc, m == null ? 0 : m.namespace_index); - TraitIndex ti = new TraitIndex(t, abc, getTraitReturnType(abc, t), getTraitCallReturnType(abc, t), propValue, multinameToType(name_index, abc, abc.constants), scriptIndex); + PropertyNsDef ndp = new PropertyNsDef(t.getName(abc).getName(new LinkedHashSet<>(), abc, abc.constants, new ArrayList<>() /*?*/, true, true/*FIXME ???*/), m == null || m.namespace_index == 0 ? DottedChain.EMPTY : m.getNamespace(abc.constants).getName(abc.constants), abc, m == null ? 0 : m.namespace_index); + TraitIndex ti = new TraitIndex(t, abc, getTraitReturnType(new LinkedHashSet<>(), abc, t), getTraitCallReturnType(new LinkedHashSet<>(), abc, t), propValue, multinameToType(new LinkedHashSet<>(), name_index, abc, abc.constants), scriptIndex); if (!mapNs.containsKey(ndp)) { mapNs.put(ndp, ti); } @@ -1137,7 +1138,7 @@ public final class AbcIndexing { Integer classScriptIndex = nsKind == Namespace.KIND_PACKAGE ? null : i; ClassIndex cindex = new ClassIndex(tc.class_info, abc, null, classScriptIndex); addedClasses.add(cindex); - GraphTargetItem cname = multinameToType(ii.name_index, abc, abc.constants); + GraphTargetItem cname = multinameToType(new LinkedHashSet<>(), ii.name_index, abc, abc.constants); classes.put(new ClassDef(cname, abc, classScriptIndex), cindex); indexTraits(abc, ii.name_index, ii.instance_traits, instanceProperties, instanceNsProperties, i); @@ -1149,7 +1150,7 @@ public final class AbcIndexing { for (ClassIndex cindex : addedClasses) { int parentClassName = abc.instance_info.get(cindex.index).super_index; if (parentClassName > 0) { - TypeItem parentClass = new TypeItem(abc.constants.getMultiname(parentClassName).getNameWithNamespace(abc, abc.constants, true)); + TypeItem parentClass = new TypeItem(abc.constants.getMultiname(parentClassName).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, true)); ClassIndex parentClassIndex = findClass(parentClass, abc, null); if (parentClassIndex == null) { //Parent class can be deleted, do not check. TODO: handle this better @@ -1211,14 +1212,14 @@ public final class AbcIndexing { * @return True if class is instance of another class */ public boolean isInstanceOf(ABC abc, int classIndex, DottedChain searchClassName) { - DottedChain clsName = abc.instance_info.get(classIndex).getName(abc.constants).getNameWithNamespace(abc, abc.constants, false); + DottedChain clsName = abc.instance_info.get(classIndex).getName(abc.constants).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, false); if (searchClassName.equals(clsName)) { return true; } if (abc.instance_info.get(classIndex).super_index == 0) { return false; } - DottedChain parentClassName = abc.constants.getMultiname(abc.instance_info.get(classIndex).super_index).getNameWithNamespace(abc, abc.constants, false); + DottedChain parentClassName = abc.constants.getMultiname(abc.instance_info.get(classIndex).super_index).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, false); AbcIndexing.ClassIndex ci = findClass(new TypeItem(parentClassName), abc, null); if (ci == null) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/CallAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/CallAVM2Item.java index 0d75b6a74..4fcffa782 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/CallAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/CallAVM2Item.java @@ -36,6 +36,7 @@ import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.LocalData; import com.jpexs.helpers.Reference; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; /** @@ -178,7 +179,7 @@ public class CallAVM2Item extends AVM2Item { if (mi.param_types[i] == 0) { type = TypeItem.UNBOUNDED; } else { - type = new TypeItem(abc.constants.getMultiname(mi.param_types[i]).getNameWithNamespace(abc, abc.constants, true /*??*/)); + type = new TypeItem(abc.constants.getMultiname(mi.param_types[i]).getNameWithNamespace(new LinkedHashSet<>() /*???*/, abc, abc.constants, true /*??*/)); } arguments.set(i, AVM2SourceGenerator.handleAndOrCoerce(arguments.get(i), type)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java index 0a733c72f..ae8c1e403 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java @@ -39,6 +39,7 @@ import com.jpexs.decompiler.graph.model.LocalData; import com.jpexs.helpers.Reference; import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; @@ -434,7 +435,7 @@ public class NameAVM2Item extends AssignableAVM2Item { for (MethodBody b : callStack) { for (int i = 0; i < b.traits.traits.size(); i++) { Trait t = b.traits.traits.get(i); - if (t.getName(abcV).getName(abcV, constants, null, true, true).equals(variableName)) { + if (t.getName(abcV).getName(new LinkedHashSet<>(), abcV, constants, null, true, true).equals(variableName)) { if (t instanceof TraitSlotConst) { if (!localData.traitUsages.containsKey(b)) { localData.traitUsages.put(b, new ArrayList<>()); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java index 091aa8ab0..1ca83292c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java @@ -48,6 +48,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -217,11 +218,11 @@ public class PropertyAVM2Item extends AssignableAVM2Item { for (MethodBody b : callStack) { for (int i = 0; i < b.traits.traits.size(); i++) { Trait t = b.traits.traits.get(i); - if (t.getName(abc).getName(abc, constants, null, true, true).equals(propertyName)) { + if (t.getName(abc).getName(new LinkedHashSet<>(), abc, constants, null, true, true).equals(propertyName)) { if (t instanceof TraitSlotConst) { TraitSlotConst tsc = (TraitSlotConst) t; objType = new TypeItem(DottedChain.FUNCTION); - propType = AbcIndexing.multinameToType(tsc.type_index, abc, constants); + propType = AbcIndexing.multinameToType(new LinkedHashSet<>(), tsc.type_index, abc, constants); propIndex = tsc.name_index; if (!localData.traitUsages.containsKey(b)) { localData.traitUsages.put(b, new ArrayList<>()); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java index 1f5a6976d..b4b21ea0f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/UnresolvedAVM2Item.java @@ -41,6 +41,7 @@ import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.LocalData; import com.jpexs.helpers.Reference; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; @@ -625,7 +626,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { if (ci == null) { ntype = new TypeItem("Object"); } else { - ntype = new TypeItem(ci.abc.instance_info.get(ci.index).getName(ci.abc.constants).getNameWithNamespace(ci.abc, ci.abc.constants, true)); + ntype = new TypeItem(ci.abc.instance_info.get(ci.index).getName(ci.abc.constants).getNameWithNamespace(new LinkedHashSet<>(), ci.abc, ci.abc.constants, true)); } } @@ -650,7 +651,7 @@ public class UnresolvedAVM2Item extends AssignableAVM2Item { } if (mustBeType) { - throw new CompilationException(name.toPrintableString(abcIndex.getSelectedAbc().getSwf(), true) + " is not an existing type", line); + throw new CompilationException(name.toPrintableString(new LinkedHashSet<>(), abcIndex.getSelectedAbc().getSwf(), true) + " is not an existing type", line); } resolved = null; GraphTargetItem ret = null; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ABCException.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ABCException.java index 02c4e6460..fd2377f60 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ABCException.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ABCException.java @@ -24,6 +24,7 @@ import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.helpers.Helper; import java.io.Serializable; import java.util.List; +import java.util.Set; /** * Exception. @@ -79,26 +80,28 @@ public class ABCException implements Serializable, Cloneable { /** * To string. + * @param usedDeobfuscations Used deobfuscations * @param ABC abc * @param constants AVM2 constant pool * @param fullyQualifiedNames Fully qualified names * @return String */ - public String toString(ABC abc, AVM2ConstantPool constants, List fullyQualifiedNames) { - return "Exception: startServer=" + Helper.formatAddress(start) + " end=" + Helper.formatAddress(end) + " target=" + target + " type=\"" + getTypeName(abc, constants, fullyQualifiedNames) + "\" name=\"" + getVarName(abc, constants, fullyQualifiedNames) + "\""; + public String toString(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, List fullyQualifiedNames) { + return "Exception: startServer=" + Helper.formatAddress(start) + " end=" + Helper.formatAddress(end) + " target=" + target + " type=\"" + getTypeName(usedDeobfuscations, abc, constants, fullyQualifiedNames) + "\" name=\"" + getVarName(usedDeobfuscations, abc, constants, fullyQualifiedNames) + "\""; } /** * To string. - * @param ABC abc + * @param usedDeobfuscations Used deobfuscations + * @param abc ABC * @param constants AVM2 constant pool * @param code AVM2 code * @param fullyQualifiedNames Fully qualified names * @return String */ - public String toString(ABC abc, AVM2ConstantPool constants, AVM2Code code, List fullyQualifiedNames) { + public String toString(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, AVM2Code code, List fullyQualifiedNames) { try { - return "Exception: startServer=" + code.adr2pos(start) + ":" + code.code.get(code.adr2pos(start)).toStringNoAddress(constants, fullyQualifiedNames) + " end=" + code.adr2pos(end) + ":" + code.code.get(code.adr2pos(end)).toStringNoAddress(constants, fullyQualifiedNames) + " target=" + code.adr2pos(target) + ":" + code.code.get(code.adr2pos(target)).toStringNoAddress(constants, fullyQualifiedNames) + " type=\"" + getTypeName(abc, constants, fullyQualifiedNames) + "\" name=\"" + getVarName(abc, constants, fullyQualifiedNames) + "\""; + return "Exception: startServer=" + code.adr2pos(start) + ":" + code.code.get(code.adr2pos(start)).toStringNoAddress(constants, fullyQualifiedNames) + " end=" + code.adr2pos(end) + ":" + code.code.get(code.adr2pos(end)).toStringNoAddress(constants, fullyQualifiedNames) + " target=" + code.adr2pos(target) + ":" + code.code.get(code.adr2pos(target)).toStringNoAddress(constants, fullyQualifiedNames) + " type=\"" + getTypeName(usedDeobfuscations, abc, constants, fullyQualifiedNames) + "\" name=\"" + getVarName(usedDeobfuscations, abc, constants, fullyQualifiedNames) + "\""; } catch (ConvertException ex) { return ""; } @@ -114,30 +117,32 @@ public class ABCException implements Serializable, Cloneable { /** * Gets variable name. + * @param usedDeobfuscations Used deobfuscations * @param abc ABC * @param constants AVM2 constant pool * @param fullyQualifiedNames Fully qualified names * @return Variable name */ - public String getVarName(ABC abc, AVM2ConstantPool constants, List fullyQualifiedNames) { + public String getVarName(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, List fullyQualifiedNames) { if (name_index == 0) { return DEFAULT_EXCEPTION_NAME; } - return constants.getMultiname(name_index).getName(abc, constants, fullyQualifiedNames, false, true); + return constants.getMultiname(name_index).getName(usedDeobfuscations, abc, constants, fullyQualifiedNames, false, true); } /** * Gets type name. + * @param usedDeobfuscations Used deobfuscations * @param abc ABC * @param constants AVM2 constant pool * @param fullyQualifiedNames Fully qualified names * @return Type name */ - public String getTypeName(ABC abc, AVM2ConstantPool constants, List fullyQualifiedNames) { + public String getTypeName(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, List fullyQualifiedNames) { if (type_index == 0) { return "*"; } - return constants.getMultiname(type_index).getName(abc, constants, fullyQualifiedNames, false, true); + return constants.getMultiname(type_index).getName(usedDeobfuscations, abc, constants, fullyQualifiedNames, false, true); } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/InstanceInfo.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/InstanceInfo.java index 00218596e..34e418856 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/InstanceInfo.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/InstanceInfo.java @@ -36,6 +36,7 @@ import com.jpexs.decompiler.flash.types.sound.SoundFormat; import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.helpers.Helper; import java.util.List; +import java.util.Set; /** * Instance info. @@ -156,6 +157,7 @@ public class InstanceInfo { /** * Gets class header string. * + * @param usedDeobfuscations Used deobfuscations * @param assetsDir Assets directory * @param writer Writer * @param abc ABC @@ -164,17 +166,17 @@ public class InstanceInfo { * @param allowEmbed Allow embed * @return Writer */ - public GraphTextWriter getClassHeaderStr(String assetsDir, GraphTextWriter writer, ABC abc, List fullyQualifiedNames, boolean allowPrivate, boolean allowEmbed) { + public GraphTextWriter getClassHeaderStr(Set usedDeobfuscations, String assetsDir, GraphTextWriter writer, ABC abc, List fullyQualifiedNames, boolean allowPrivate, boolean allowEmbed) { final String ASSETS_DIR = assetsDir; // "/_assets/"; if (allowEmbed) { if (abc.getSwf() != null) { - String className = getName(abc.constants).getNameWithNamespace(abc, abc.constants, false).toRawString(); + String className = getName(abc.constants).getNameWithNamespace(usedDeobfuscations, abc, abc.constants, false).toRawString(); CharacterTag ct = abc.getSwf().getCharacterByClass(className); if (ct != null) { String fileName = ct.getCharacterExportFileName(); if (Configuration.as3ExportNamesUseClassNamesOnly.get()) { - fileName = getName(abc.constants).getNameWithNamespace(abc, abc.constants, false).toRawString(); + fileName = getName(abc.constants).getNameWithNamespace(usedDeobfuscations, abc, abc.constants, false).toRawString(); } String ext = ""; @@ -313,17 +315,17 @@ public class InstanceInfo { } writer.appendNoHilight(modifiers + objType); - String classTypeName = abc.constants.getMultiname(name_index).getNameWithNamespace(abc, abc.constants, true).toRawString(); + String classTypeName = abc.constants.getMultiname(name_index).getNameWithNamespace(usedDeobfuscations, abc, abc.constants, true).toRawString(); - writer.hilightSpecial(abc.constants.getMultiname(name_index).getName(abc, abc.constants, null/* No full names here*/, false, true), HighlightSpecialType.CLASS_NAME, classTypeName); + writer.hilightSpecial(abc.constants.getMultiname(name_index).getName(usedDeobfuscations, abc, abc.constants, null/* No full names here*/, false, true), HighlightSpecialType.CLASS_NAME, classTypeName); if (!isNullable()) { writer.appendNoHilight("!"); } if (super_index > 0) { - String typeName = abc.constants.getMultiname(super_index).getNameWithNamespace(abc, abc.constants, true).toRawString(); - String parentName = abc.constants.getMultiname(super_index).getName(abc, abc.constants, fullyQualifiedNames, false, true); + String typeName = abc.constants.getMultiname(super_index).getNameWithNamespace(usedDeobfuscations, abc, abc.constants, true).toRawString(); + String parentName = abc.constants.getMultiname(super_index).getName(usedDeobfuscations, abc, abc.constants, fullyQualifiedNames, false, true); if (!parentName.equals("Object")) { writer.appendNoHilight(" extends "); writer.hilightSpecial(parentName, HighlightSpecialType.TYPE_NAME, typeName); @@ -339,8 +341,8 @@ public class InstanceInfo { if (i > 0) { writer.append(", "); } - String typeName = abc.constants.getMultiname(interfaces[i]).getNameWithNamespace(abc, abc.constants, true).toRawString(); - writer.hilightSpecial(abc.constants.getMultiname(interfaces[i]).getName(abc, abc.constants, fullyQualifiedNames, false, true), HighlightSpecialType.TYPE_NAME, typeName); + String typeName = abc.constants.getMultiname(interfaces[i]).getNameWithNamespace(usedDeobfuscations, abc, abc.constants, true).toRawString(); + writer.hilightSpecial(abc.constants.getMultiname(interfaces[i]).getName(usedDeobfuscations, abc, abc.constants, fullyQualifiedNames, false, true), HighlightSpecialType.TYPE_NAME, typeName); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java index 4fa3de38c..36ba346c4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java @@ -449,9 +449,10 @@ public final class MethodBody implements Cloneable { * @param firstLevel First level * @param seenMethods Seen methods * @param initTraitClasses Class ids which traits to init + * @param usedDeobfuscations Used deobfuscations * @throws InterruptedException On interrupt */ - public void convert(int swfVersion, List callStack, AbcIndexing abcIndex, final ConvertData convertData, final String path, ScriptExportMode exportMode, final boolean isStatic, final int methodIndex, final int scriptIndex, final int classIndex, final ABC abc, final Trait trait, final ScopeStack scopeStack, final int initializerType, final NulWriter writer, final List fullyQualifiedNames, Traits initTraits, boolean firstLevel, Set seenMethods, List initTraitClasses) throws InterruptedException { + public void convert(int swfVersion, List callStack, AbcIndexing abcIndex, final ConvertData convertData, final String path, ScriptExportMode exportMode, final boolean isStatic, final int methodIndex, final int scriptIndex, final int classIndex, final ABC abc, final Trait trait, final ScopeStack scopeStack, final int initializerType, final NulWriter writer, final List fullyQualifiedNames, Traits initTraits, boolean firstLevel, Set seenMethods, List initTraitClasses, Set usedDeobfuscations) throws InterruptedException { seenMethods.add(this.method_info); if (debugMode) { System.err.println("Decompiling " + path); @@ -474,10 +475,10 @@ public final class MethodBody implements Cloneable { HashMap localRegNames = getLocalRegNames(abc); List convertedItems1; try (Statistics s = new Statistics("AVM2Code.toGraphTargetItems")) { - convertedItems1 = converted.getCode().toGraphTargetItems(swfVersion, callStack, abcIndex, convertData.thisHasDefaultToPrimitive, convertData, path, methodIndex, isStatic, scriptIndex, classIndex, abc, converted, localRegNames, scopeStack, initializerType, fullyQualifiedNames, initTraits, 0, new HashMap<>(), initTraitClasses); //converted.getCode().visitCode(converted) + convertedItems1 = converted.getCode().toGraphTargetItems(usedDeobfuscations, swfVersion, callStack, abcIndex, convertData.thisHasDefaultToPrimitive, convertData, path, methodIndex, isStatic, scriptIndex, classIndex, abc, converted, localRegNames, scopeStack, initializerType, fullyQualifiedNames, initTraits, 0, new HashMap<>(), initTraitClasses); //converted.getCode().visitCode(converted) } try (Statistics s = new Statistics("Graph.graphToString")) { - Graph.graphToString(convertedItems1, writer, LocalData.create(callStack, abcIndex, abc, localRegNames, fullyQualifiedNames, seenMethods, exportMode, swfVersion)); + Graph.graphToString(convertedItems1, writer, LocalData.create(callStack, abcIndex, abc, localRegNames, fullyQualifiedNames, seenMethods, exportMode, swfVersion, usedDeobfuscations)); } convertedItems = convertedItems1; } @@ -525,6 +526,7 @@ public final class MethodBody implements Cloneable { /** * Returns a string representation of this MethodBody. * + * @param usedDeobfuscations Used deobfuscations * @param swfVersion SWF version * @param callStack Call stack * @param abcIndex ABC indexing @@ -534,11 +536,11 @@ public final class MethodBody implements Cloneable { * @param trait Trait * @param writer Writer * @param fullyQualifiedNames Fully qualified names - * @param seenMethods Seen methods + * @param seenMethods Seen methods * @return Writer * @throws InterruptedException On interrupt */ - public GraphTextWriter toString(int swfVersion, List callStack, AbcIndexing abcIndex, final String path, ScriptExportMode exportMode, final ABC abc, final Trait trait, final GraphTextWriter writer, final List fullyQualifiedNames, Set seenMethods) throws InterruptedException { + public GraphTextWriter toString(Set usedDeobfuscations, int swfVersion, List callStack, AbcIndexing abcIndex, final String path, ScriptExportMode exportMode, final ABC abc, final Trait trait, final GraphTextWriter writer, final List fullyQualifiedNames, Set seenMethods) throws InterruptedException { seenMethods.add(method_info); if (exportMode != ScriptExportMode.AS) { @@ -565,11 +567,11 @@ public final class MethodBody implements Cloneable { } List fullyQualifiedNames2 = new ArrayList<>(fullyQualifiedNames); for (Trait t : traits.traits) { - DottedChain tname = DottedChain.parseWithSuffix(t.getName(abc).getName(abc, abc.constants, new ArrayList<>(), false, true)); + DottedChain tname = DottedChain.parseWithSuffix(t.getName(abc).getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), false, true)); fullyQualifiedNames2.remove(tname); } - - Graph.graphToString(convertedItems, writer, LocalData.create(callStack, abcIndex, abc, localRegNames, fullyQualifiedNames2, seenMethods, exportMode, swfVersion)); + + Graph.graphToString(convertedItems, writer, LocalData.create(callStack, abcIndex, abc, localRegNames, fullyQualifiedNames2, seenMethods, exportMode, swfVersion, usedDeobfuscations)); //writer.endMethod(); } else if (convertException instanceof TimeoutException) { // exception was logged in convert method @@ -657,6 +659,7 @@ public final class MethodBody implements Cloneable { /** * Converts the method body to high-level source code. * + * @param usedDeobfuscations Used deobfuscations * @param swfVersion SWF version * @param callStack Call stack * @param abcIndex ABC indexing @@ -664,14 +667,14 @@ public final class MethodBody implements Cloneable { * @param seenMethods Seen methods * @return High-level source code */ - public String toSource(int swfVersion, List callStack, AbcIndexing abcIndex, int scriptIndex, Set seenMethods) { + public String toSource(Set usedDeobfuscations, int swfVersion, List callStack, AbcIndexing abcIndex, int scriptIndex, Set seenMethods) { ConvertData convertData = new ConvertData(); convertData.deobfuscationMode = 0; try { - convert(swfVersion, callStack, abcIndex, convertData, "", ScriptExportMode.AS, false, method_info, 0, 0, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, seenMethods, new ArrayList<>()); + convert(swfVersion, callStack, abcIndex, convertData, "", ScriptExportMode.AS, false, method_info, 0, 0, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, seenMethods, new ArrayList<>(), usedDeobfuscations); HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), false); writer.indent().indent().indent(); - toString(swfVersion, callStack, abcIndex, "", ScriptExportMode.AS, abc, null, writer, new ArrayList<>(), seenMethods); + toString(usedDeobfuscations, swfVersion, callStack, abcIndex, "", ScriptExportMode.AS, abc, null, writer, new ArrayList<>(), seenMethods); writer.unindent().unindent().unindent(); writer.finishHilights(); return writer.toString(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java index af8c37675..34a08e213 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java @@ -27,8 +27,10 @@ import com.jpexs.decompiler.flash.types.annotations.Internal; import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.helpers.Helper; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; /** * Method info in ABC file. @@ -332,7 +334,7 @@ public class MethodInfo { return param_types.length + (flagNeed_rest() ? 1 : 0) + (flagNeed_arguments() ? 1 : 0); } - public GraphTextWriter getParamStr(GraphTextWriter writer, AVM2ConstantPool constants, MethodBody body, ABC abc, List fullyQualifiedNames) { + public GraphTextWriter getParamStr(GraphTextWriter writer, AVM2ConstantPool constants, MethodBody body, ABC abc, List fullyQualifiedNames, Set usedDeobfuscations) { Map localRegNames = new HashMap<>(); if (body != null && Configuration.getLocalNamesFromDebugInfo.get()) { localRegNames = body.getCode().getLocalRegNamesFromDebug(abc, body.max_regs); @@ -344,7 +346,7 @@ public class MethodInfo { } DottedChain ptype = DottedChain.ALL; if (param_types[i] > 0) { - ptype = constants.getMultiname(param_types[i]).getNameWithNamespace(abc, constants, true); + ptype = constants.getMultiname(param_types[i]).getNameWithNamespace(usedDeobfuscations, abc, constants, true); } HighlightData pdata = new HighlightData(); @@ -353,10 +355,10 @@ public class MethodInfo { pdata.regIndex = i + 1; if (!localRegNames.isEmpty()) { pdata.localName = localRegNames.get(i + 1); //assuming it is a slot - writer.hilightSpecial(IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), true, localRegNames.get(i + 1)), HighlightSpecialType.PARAM_NAME, i, pdata); + writer.hilightSpecial(IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), usedDeobfuscations, true, localRegNames.get(i + 1)), HighlightSpecialType.PARAM_NAME, i, pdata); } else if ((paramNames.length > i) && (paramNames[i] != 0) && Configuration.paramNamesEnable.get()) { pdata.localName = constants.getString(paramNames[i]); - writer.hilightSpecial(IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), true, constants.getString(paramNames[i])), HighlightSpecialType.PARAM_NAME, i, pdata); + writer.hilightSpecial(IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), usedDeobfuscations, true, constants.getString(paramNames[i])), HighlightSpecialType.PARAM_NAME, i, pdata); } else { pdata.localName = "param" + (i + 1); writer.hilightSpecial(pdata.localName, HighlightSpecialType.PARAM_NAME, i, pdata); @@ -365,7 +367,7 @@ public class MethodInfo { if (param_types[i] == 0) { writer.hilightSpecial("*", HighlightSpecialType.PARAM, i); } else { - writer.hilightSpecial(constants.getMultiname(param_types[i]).getName(abc, constants, fullyQualifiedNames, false, true), HighlightSpecialType.PARAM, i); + writer.hilightSpecial(constants.getMultiname(param_types[i]).getName(usedDeobfuscations, abc, constants, fullyQualifiedNames, false, true), HighlightSpecialType.PARAM, i); } if (optional != null && flagHas_optional()) { if (i >= param_types.length - optional.length) { @@ -399,14 +401,14 @@ public class MethodInfo { return writer; } - public GraphTextWriter getReturnTypeStr(GraphTextWriter writer, ABC abc, AVM2ConstantPool constants, List fullyQualifiedNames) { + public GraphTextWriter getReturnTypeStr(GraphTextWriter writer, ABC abc, AVM2ConstantPool constants, List fullyQualifiedNames, Set usedDeobfuscations) { String rname = "*"; if (ret_type > 0) { Multiname multiname = constants.getMultiname(ret_type); if (multiname.kind != Multiname.TYPENAME && multiname.name_index > 0 && constants.getString(multiname.name_index).equals("void")) { rname = "void"; } else { - rname = multiname.getName(abc, constants, fullyQualifiedNames, false, true); + rname = multiname.getName(usedDeobfuscations, abc, constants, fullyQualifiedNames, false, true); } } return writer.hilightSpecial(rname, HighlightSpecialType.RETURNS); @@ -419,7 +421,7 @@ public class MethodInfo { if (multiname.kind != Multiname.TYPENAME && multiname.name_index > 0 && constants.getString(multiname.name_index).equals("void")) { rname = "void"; } else { - rname = multiname.getName(abc, constants, fullyQualifiedNames, false, true); + rname = multiname.getName(new LinkedHashSet<>(), abc, constants, fullyQualifiedNames, false, true); } } return rname; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java index 1d03f638a..bcdf80545 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Multiname.java @@ -27,6 +27,7 @@ import com.jpexs.helpers.Reference; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; import java.util.Set; @@ -624,6 +625,7 @@ public class Multiname { /** * Converts the typename to string. * + * @param usedDeobfuscations Used deobfuscations * @param abc ABC * @param constants Constant pool * @param fullyQualifiedNames Fully qualified names @@ -631,12 +633,12 @@ public class Multiname { * @param withSuffix With suffix flag * @return Typename as string */ - private String typeNameToStr(ABC abc, AVM2ConstantPool constants, List fullyQualifiedNames, boolean dontDeobfuscate, boolean withSuffix) { + private String typeNameToStr(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, List fullyQualifiedNames, boolean dontDeobfuscate, boolean withSuffix) { if (cyclic) { return "§§cyclic_typename()"; } StringBuilder typeNameStr = new StringBuilder(); - typeNameStr.append(constants.getMultiname(qname_index).getName(abc, constants, fullyQualifiedNames, dontDeobfuscate, withSuffix)); + typeNameStr.append(constants.getMultiname(qname_index).getName(usedDeobfuscations, abc, constants, fullyQualifiedNames, dontDeobfuscate, withSuffix)); if (params != null && params.length > 0) { typeNameStr.append(".<"); for (int i = 0; i < params.length; i++) { @@ -647,7 +649,7 @@ public class Multiname { if (param == 0) { typeNameStr.append("*"); } else { - typeNameStr.append(constants.getMultiname(param).getName(abc, constants, fullyQualifiedNames, dontDeobfuscate, withSuffix)); + typeNameStr.append(constants.getMultiname(param).getName(usedDeobfuscations, abc, constants, fullyQualifiedNames, dontDeobfuscate, withSuffix)); } } typeNameStr.append(">"); @@ -662,11 +664,12 @@ public class Multiname { * @param fullyQualifiedNames Fully qualified names * @param dontDeobfuscate Don't deobfuscate flag * @param withSuffix With suffix flag + * @param usedDeobfuscations Used deobfuscations * @return Name with custom namespace */ - public String getNameWithCustomNamespace(ABC abc, List fullyQualifiedNames, boolean dontDeobfuscate, boolean withSuffix) { + public String getNameWithCustomNamespace(Set usedDeobfuscations, ABC abc, List fullyQualifiedNames, boolean dontDeobfuscate, boolean withSuffix) { if (kind == TYPENAME) { - return typeNameToStr(abc, abc.constants, fullyQualifiedNames, dontDeobfuscate, withSuffix); + return typeNameToStr(usedDeobfuscations, abc, abc.constants, fullyQualifiedNames, dontDeobfuscate, withSuffix); } if (name_index == -1) { return ""; @@ -682,7 +685,7 @@ public class Multiname { String nsname = dc != null ? dc.getLast() : null; if (nsname != null && !"AS3".equals(nsname)) { - String identifier = dontDeobfuscate ? nsname : IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), true, nsname); + String identifier = dontDeobfuscate ? nsname : IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), usedDeobfuscations, true, nsname); if (identifier != null && !identifier.isEmpty()) { return identifier + "::" + name; } @@ -690,16 +693,17 @@ public class Multiname { } if (nskind == Namespace.KIND_PACKAGE && fullyQualifiedNames != null && !fullyQualifiedNames.isEmpty() && fullyQualifiedNames.contains(DottedChain.parseWithSuffix(name))) { - DottedChain dc = getNameWithNamespace(abc, abc.constants, withSuffix); - return dontDeobfuscate ? dc.toRawString() : dc.toPrintableString(abc.getSwf(), true); + DottedChain dc = getNameWithNamespace(usedDeobfuscations, abc, abc.constants, withSuffix); + return dontDeobfuscate ? dc.toRawString() : dc.toPrintableString(usedDeobfuscations, abc.getSwf(), true); } - return (isAttribute() ? "@" : "") + (dontDeobfuscate ? name : IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), true, name)) + (withSuffix ? getNamespaceSuffix() : ""); + return (isAttribute() ? "@" : "") + (dontDeobfuscate ? name : IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), usedDeobfuscations, true, name)) + (withSuffix ? getNamespaceSuffix() : ""); } } /** * Gets the name with custom namespace. * + * @param usedDeobfuscations Used deobfuscations * @param abc ABC * @param fullyQualifiedNames Fully qualified names * @param dontDeobfuscate Don't deobfuscate flag @@ -707,9 +711,9 @@ public class Multiname { * @param customNamespaceRef Custom namespace * @return Name with custom namespace */ - public String getNameAndCustomNamespace(ABC abc, List fullyQualifiedNames, boolean dontDeobfuscate, boolean withSuffix, Reference customNamespaceRef) { + public String getNameAndCustomNamespace(Set usedDeobfuscations, ABC abc, List fullyQualifiedNames, boolean dontDeobfuscate, boolean withSuffix, Reference customNamespaceRef) { if (kind == TYPENAME) { - return typeNameToStr(abc, abc.constants, fullyQualifiedNames, dontDeobfuscate, withSuffix); + return typeNameToStr(usedDeobfuscations, abc, abc.constants, fullyQualifiedNames, dontDeobfuscate, withSuffix); } if (name_index == -1) { return ""; @@ -725,7 +729,7 @@ public class Multiname { String nsname = dc != null ? dc.getLast() : null; if (nsname != null && !"AS3".equals(nsname)) { - String identifier = dontDeobfuscate ? nsname : IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), true, nsname); + String identifier = dontDeobfuscate ? nsname : IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), usedDeobfuscations, true, nsname); if (identifier != null && !identifier.isEmpty()) { customNamespaceRef.setVal(dc); return name; @@ -734,16 +738,17 @@ public class Multiname { } if (nskind == Namespace.KIND_PACKAGE && fullyQualifiedNames != null && !fullyQualifiedNames.isEmpty() && fullyQualifiedNames.contains(DottedChain.parseWithSuffix(name))) { - DottedChain dc = getNameWithNamespace(abc, abc.constants, withSuffix); - return dontDeobfuscate ? dc.toRawString() : dc.toPrintableString(abc.getSwf(), true); + DottedChain dc = getNameWithNamespace(usedDeobfuscations, abc, abc.constants, withSuffix); + return dontDeobfuscate ? dc.toRawString() : dc.toPrintableString(usedDeobfuscations, abc.getSwf(), true); } - return (isAttribute() ? "@" : "") + (dontDeobfuscate ? name : IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), true, name)) + (withSuffix ? getNamespaceSuffix() : ""); + return (isAttribute() ? "@" : "") + (dontDeobfuscate ? name : IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), usedDeobfuscations,true, name)) + (withSuffix ? getNamespaceSuffix() : ""); } } /** * Gets the name. * + * @param usedDeobfuscations Used deobfuscations * @param abc ABC * @param constants Constant pool * @param fullyQualifiedNames Fully qualified names @@ -751,9 +756,9 @@ public class Multiname { * @param withSuffix With suffix flag * @return Name */ - public String getName(ABC abc, AVM2ConstantPool constants, List fullyQualifiedNames, boolean dontDeobfuscate, boolean withSuffix) { + public String getName(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, List fullyQualifiedNames, boolean dontDeobfuscate, boolean withSuffix) { if (kind == TYPENAME) { - return typeNameToStr(abc, constants, fullyQualifiedNames, dontDeobfuscate, withSuffix); + return typeNameToStr(usedDeobfuscations, abc, constants, fullyQualifiedNames, dontDeobfuscate, withSuffix); } if (name_index == -1) { return ""; @@ -776,22 +781,23 @@ public class Multiname { isPublic = true; } if (isPublic && fullyQualifiedNames != null && !fullyQualifiedNames.isEmpty() && fullyQualifiedNames.contains(DottedChain.parseWithSuffix(name))) { - DottedChain dc = getNameWithNamespace(abc, constants, withSuffix); - return dontDeobfuscate ? dc.toRawString() : dc.toPrintableString(abc.getSwf(), true); + DottedChain dc = getNameWithNamespace(usedDeobfuscations, abc, constants, withSuffix); + return dontDeobfuscate ? dc.toRawString() : dc.toPrintableString(usedDeobfuscations, abc.getSwf(), true); } - return (isAttribute() ? "@" : "") + (dontDeobfuscate ? name : IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), true, name)) + (withSuffix ? getNamespaceSuffix() : ""); + return (isAttribute() ? "@" : "") + (dontDeobfuscate ? name : IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), usedDeobfuscations, true, name)) + (withSuffix ? getNamespaceSuffix() : ""); } } /** * Gets the name with namespace. * + * @param usedDeobfuscations Used deobfuscations * @param abc ABC * @param constants Constant pool * @param withSuffix With suffix flag * @return Name with namespace */ - public DottedChain getNameWithNamespace(ABC abc, AVM2ConstantPool constants, boolean withSuffix) { + public DottedChain getNameWithNamespace(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, boolean withSuffix) { DottedChain cached = constants.getCachedMultinameWithNamespace(this); if (cached != null) { return cached; @@ -812,7 +818,7 @@ public class Multiname { nsName = ns.getName(constants); } } - String name = getName(abc, constants, null, true, false); + String name = getName(usedDeobfuscations, abc, constants, null, true, false); DottedChain ret; if (nsName != null) { ret = nsName.add(name, withSuffix ? getNamespaceSuffix() : ""); @@ -1066,7 +1072,7 @@ public class Multiname { return false; } - if (!Objects.equals(other.getName(otherAbc, otherCpool, new ArrayList<>(), true, true), getName(thisAbc, thisCpool, new ArrayList<>(), true, true))) { + if (!Objects.equals(other.getName(new LinkedHashSet<>(), otherAbc, otherCpool, new ArrayList<>(), true, true), getName(new LinkedHashSet<>(), thisAbc, thisCpool, new ArrayList<>(), true, true))) { return false; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Namespace.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Namespace.java index 36cc30b2d..58b32ce2e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Namespace.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/Namespace.java @@ -20,6 +20,7 @@ import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; import com.jpexs.decompiler.flash.types.annotations.Internal; import com.jpexs.decompiler.graph.DottedChain; +import java.util.Set; /** * Namespace in ABC file. @@ -180,12 +181,14 @@ public class Namespace { /** * To string. + * + * @param usedDeobfuscations Used deobuscations * @param ABC abc * @param constants Constant pool * @return String representation */ - public String toString(ABC abc, AVM2ConstantPool constants) { - return getName(constants).toPrintableString(abc.getSwf(), true); + public String toString(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants) { + return getName(constants).toPrintableString(usedDeobfuscations, abc.getSwf(), true); } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ScriptInfo.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ScriptInfo.java index 38ba3e800..9a246e9cf 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ScriptInfo.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/ScriptInfo.java @@ -25,7 +25,9 @@ import com.jpexs.decompiler.flash.abc.types.traits.Traits; import com.jpexs.decompiler.flash.types.annotations.Internal; import com.jpexs.decompiler.graph.DottedChain; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; /** * Script info in ABC file. @@ -108,9 +110,10 @@ public class ScriptInfo { * returns null. * * @param abc ABC file + * @param usedDeobfuscations Used deobfuscations * @return Simple pack name - Can be null! */ - public DottedChain getSimplePackName(ABC abc) { + public DottedChain getSimplePackName(ABC abc, Set usedDeobfuscations) { List packageTraits = new ArrayList<>(); for (int j = 0; j < traits.traits.size(); j++) { @@ -128,7 +131,7 @@ public class ScriptInfo { if (packageTraits.isEmpty() || packageTraits.size() > 1) { return null; } - return traits.traits.get(packageTraits.get(0)).getName(abc).getNameWithNamespace(abc, abc.constants, true); + return traits.traits.get(packageTraits.get(0)).getName(abc).getNameWithNamespace(usedDeobfuscations, abc, abc.constants, true); } /** @@ -180,7 +183,7 @@ public class ScriptInfo { if ((nskind == Namespace.KIND_PACKAGE_INTERNAL) || (nskind == Namespace.KIND_PACKAGE)) { DottedChain packageName = name.getSimpleNamespaceName(abc.constants); // assume not null package - String objectName = name.getName(abc, abc.constants, null, true, false); + String objectName = name.getName(new LinkedHashSet<>() /*???*/, abc, abc.constants, null, true, false); String namespaceSuffix = name.getNamespaceSuffix(); List traitIndices = new ArrayList<>(); @@ -190,7 +193,7 @@ public class ScriptInfo { otherTraits.clear(); } - if (packagePrefix == null || packageName.toPrintableString(abc.getSwf(), true).startsWith(packagePrefix)) { + if (packagePrefix == null || packageName.toPrintableString(new LinkedHashSet<>(), abc.getSwf(), true).startsWith(packagePrefix)) { ClassPath cp = new ClassPath(packageName, objectName, namespaceSuffix, abc.getSwf()); ScriptPack pack = new ScriptPack(cp, abc, allAbcs, scriptIndex, traitIndices); @@ -206,7 +209,7 @@ public class ScriptInfo { Multiname name = t.getName(abc); DottedChain packageName = name.getSimpleNamespaceName(abc.constants); - String objectName = name.getName(abc, abc.constants, null, true, false); + String objectName = name.getName(new LinkedHashSet<>()/*???*/, abc, abc.constants, null, true, false); String namespaceSuffix = name.getNamespaceSuffix(); List traitIndices = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java index 511837cae..fe76ed947 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java @@ -183,12 +183,13 @@ public abstract class Trait implements Cloneable, Serializable { /** * Gets metadata table. * + * @param usedDeobfuscations Used deobfuscations * @param parent Parent trait * @param convertData Convert data * @param abc ABC * @return Metadata table */ - public final List>> getMetaDataTable(Trait parent, ConvertData convertData, ABC abc) { + public final List>> getMetaDataTable(Set usedDeobfuscations, Trait parent, ConvertData convertData, ABC abc) { List>> ret = new ArrayList<>(); for (int m : metadata) { if (m >= 0 && m < abc.metadata_info.size()) { @@ -211,11 +212,11 @@ public abstract class Trait implements Cloneable, Serializable { public var attr2; */ if (parent instanceof TraitClass) { - String thisName = getName(abc).getName(abc, abc.constants, new ArrayList<>(), true, true); + String thisName = getName(abc).getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), true, true); List classTraits = abc.class_info.get(((TraitClass) parent).class_info).static_traits.traits; for (Trait t : classTraits) { if (t.kindType == Trait.TRAIT_SLOT) { - if ("_skinParts".equals(t.getName(abc).getName(abc, abc.constants, new ArrayList<>(), true, true))) { + if ("_skinParts".equals(t.getName(abc).getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), true, true))) { if (t.getName(abc).getNamespace(abc.constants).kind == Namespace.KIND_PRIVATE) { if (convertData.assignedValues.containsKey(t)) { if (convertData.assignedValues.get(t).value instanceof NewObjectAVM2Item) { @@ -269,6 +270,7 @@ public abstract class Trait implements Cloneable, Serializable { /** * Gets dependencies. * + * @param usedDeobfuscations Used deobfuscations * @param abcIndex ABC indexing * @param scriptIndex Script index * @param classIndex Class index @@ -281,7 +283,7 @@ public abstract class Trait implements Cloneable, Serializable { * @param uses Uses * @throws InterruptedException On interrupt */ - public void getDependencies(AbcIndexing abcIndex, int scriptIndex, int classIndex, boolean isStatic, String customNamespace, ABC abc, List dependencies, DottedChain ignorePackage, List fullyQualifiedNames, List uses, Reference numberContextRef) throws InterruptedException { + public void getDependencies(Set usedDeobfuscations, AbcIndexing abcIndex, int scriptIndex, int classIndex, boolean isStatic, String customNamespace, ABC abc, List dependencies, DottedChain ignorePackage, List fullyQualifiedNames, List uses, Reference numberContextRef) throws InterruptedException { if (customNamespace == null) { Multiname m = getName(abc); int nskind = m.getSimpleNamespaceKind(abc.constants); @@ -289,7 +291,7 @@ public abstract class Trait implements Cloneable, Serializable { customNamespace = m.getSimpleNamespaceName(abc.constants).toRawString(); } } - DependencyParser.parseDependenciesFromMultiname(abcIndex, customNamespace, abc, dependencies, getName(abc), ignorePackage, fullyQualifiedNames, DependencyType.NAMESPACE, uses); + DependencyParser.parseDependenciesFromMultiname(usedDeobfuscations, abcIndex, customNamespace, abc, dependencies, getName(abc), ignorePackage, fullyQualifiedNames, DependencyType.NAMESPACE, uses); //DependencyParser.parseUsagesFromMultiname(ignoredCustom, abc, dependencies, getName(abc), ignorePackage, fullyQualifiedNames, DependencyType.NAMESPACE); } @@ -316,6 +318,7 @@ public abstract class Trait implements Cloneable, Serializable { /** * Gets all class trait names. * + * @param usedDeobfuscations Used deobfuscations * @param traitNamesInThisScript Trait names in this script * @param abcIndex ABC indexing * @param abc ABC @@ -323,7 +326,7 @@ public abstract class Trait implements Cloneable, Serializable { * @param scriptIndex Script index * @param isParent Is parent */ - private static void getAllClassTraitNames(List traitNamesInThisScript, AbcIndexing abcIndex, ABC abc, int classIndex, Integer scriptIndex, boolean isParent) { + private static void getAllClassTraitNames(Set usedDeobfuscations, List traitNamesInThisScript, AbcIndexing abcIndex, ABC abc, int classIndex, Integer scriptIndex, boolean isParent) { boolean publicProtectedOnly = isParent; for (Trait it : abc.instance_info.get(classIndex).instance_traits.traits) { if (publicProtectedOnly) { @@ -332,7 +335,7 @@ public abstract class Trait implements Cloneable, Serializable { continue; } } - traitNamesInThisScript.add(it.getName(abc).getName(abc, abc.constants, new ArrayList<>(), true, true)); + traitNamesInThisScript.add(it.getName(abc).getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), true, true)); } for (Trait ct : abc.class_info.get(classIndex).static_traits.traits) { if (publicProtectedOnly) { @@ -341,21 +344,22 @@ public abstract class Trait implements Cloneable, Serializable { continue; } } - traitNamesInThisScript.add(ct.getName(abc).getName(abc, abc.constants, new ArrayList<>(), true, true)); + traitNamesInThisScript.add(ct.getName(abc).getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), true, true)); } if (abc.instance_info.get(classIndex).super_index == 0) { return; } - DottedChain fullClassName = abc.constants.getMultiname(abc.instance_info.get(classIndex).super_index).getNameWithNamespace(abc, abc.constants, true); + DottedChain fullClassName = abc.constants.getMultiname(abc.instance_info.get(classIndex).super_index).getNameWithNamespace(usedDeobfuscations, abc, abc.constants, true); AbcIndexing.ClassIndex ci = abcIndex.findClass(new TypeItem(fullClassName), abc, scriptIndex); if (ci != null) { - getAllClassTraitNames(traitNamesInThisScript, abcIndex, ci.abc, ci.index, ci.scriptIndex, true); + getAllClassTraitNames(usedDeobfuscations, traitNamesInThisScript, abcIndex, ci.abc, ci.index, ci.scriptIndex, true); } } /** * Writes imports. * + * @param usedDeobfuscations Used deobfuscations * @param traits Traits * @param methodIndex Method index * @param abcIndex ABC indexing @@ -369,13 +373,13 @@ public abstract class Trait implements Cloneable, Serializable { * @return True if its not empty * @throws InterruptedException On interrupt */ - public static boolean writeImports(List traits, int methodIndex, AbcIndexing abcIndex, int scriptIndex, int classIndex, boolean isStatic, ABC abc, GraphTextWriter writer, DottedChain ignorePackage, List fullyQualifiedNames) throws InterruptedException { + public static boolean writeImports(Set usedDeobfuscations, List traits, int methodIndex, AbcIndexing abcIndex, int scriptIndex, int classIndex, boolean isStatic, ABC abc, GraphTextWriter writer, DottedChain ignorePackage, List fullyQualifiedNames) throws InterruptedException { List namesInThisPackage = new ArrayList<>(); for (ABCContainerTag tag : abc.getAbcTags()) { for (ScriptInfo si : tag.getABC().script_info) { for (Trait t : si.traits.traits) { - ClassPath classPath = t.getPath(tag.getABC()); + ClassPath classPath = t.getPath(usedDeobfuscations, tag.getABC()); if (classPath.packageStr.equals(ignorePackage)) { namesInThisPackage.add(classPath.className); } @@ -386,9 +390,9 @@ public abstract class Trait implements Cloneable, Serializable { List traitNamesInThisScript = new ArrayList<>(); for (Trait st : abc.script_info.get(scriptIndex).traits.traits) { if (st instanceof TraitClass) { - getAllClassTraitNames(traitNamesInThisScript, abcIndex, abc, ((TraitClass) st).class_info, scriptIndex, false); + getAllClassTraitNames(usedDeobfuscations, traitNamesInThisScript, abcIndex, abc, ((TraitClass) st).class_info, scriptIndex, false); } else { - traitNamesInThisScript.add(st.getName(abc).getName(abc, abc.constants, new ArrayList<>(), true, true)); + traitNamesInThisScript.add(st.getName(abc).getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), true, true)); } } @@ -407,10 +411,10 @@ public abstract class Trait implements Cloneable, Serializable { if (nskind == Namespace.KIND_NAMESPACE) { customNs = multiname.getSimpleNamespaceName(abc.constants).toRawString(); } - trait.getDependencies(abcIndex, scriptIndex, classIndex, isStatic, customNs, abc, dependencies, ignorePackage, new ArrayList<>(), uses, numberContextRef); + trait.getDependencies(usedDeobfuscations, abcIndex, scriptIndex, classIndex, isStatic, customNs, abc, dependencies, ignorePackage, new ArrayList<>(), uses, numberContextRef); } if (methodIndex != -1) { - DependencyParser.parseDependenciesFromMethodInfo(abcIndex, null, scriptIndex, classIndex, isStatic, customNs, abc, methodIndex, dependencies, ignorePackage, fullyQualifiedNames, new ArrayList<>(), uses, numberContextRef); + DependencyParser.parseDependenciesFromMethodInfo(usedDeobfuscations, abcIndex, null, scriptIndex, classIndex, isStatic, customNs, abc, methodIndex, dependencies, ignorePackage, fullyQualifiedNames, new ArrayList<>(), uses, numberContextRef); } List imports = new ArrayList<>(); for (Dependency d : dependencies) { @@ -481,13 +485,13 @@ public abstract class Trait implements Cloneable, Serializable { writer.appendNoHilight("import "); if (imp.size() > 1) { - writer.appendNoHilight(imp.getWithoutLast().toPrintableString(abc.getSwf(), true)); + writer.appendNoHilight(imp.getWithoutLast().toPrintableString(usedDeobfuscations,abc.getSwf(), true)); writer.appendNoHilight("."); } if ("*".equals(imp.getLast())) { writer.appendNoHilight("*"); } else { - writer.hilightSpecial(IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), true, imp.getLast()), HighlightSpecialType.TYPE_NAME, imp.toRawString()); + writer.hilightSpecial(IdentifiersDeobfuscation.printIdentifier(abc.getSwf(),usedDeobfuscations, true, imp.getLast()), HighlightSpecialType.TYPE_NAME, imp.toRawString()); } writer.appendNoHilight(";").newLine(); hasImport = true; @@ -532,20 +536,21 @@ public abstract class Trait implements Cloneable, Serializable { /** * Gets metadata. * + * @param usedDeobfuscations Used deobfuscations * @param parent Parent trait * @param convertData Convert data * @param abc ABC * @param writer Writer * @return Writer */ - public final GraphTextWriter getMetaData(Trait parent, ConvertData convertData, ABC abc, GraphTextWriter writer) { - List>> md = getMetaDataTable(parent, convertData, abc); + public final GraphTextWriter getMetaData(Set usedDeobfuscations, Trait parent, ConvertData convertData, ABC abc, GraphTextWriter writer) { + List>> md = getMetaDataTable(usedDeobfuscations, parent, convertData, abc); for (Entry> en : md) { String name = en.getKey(); if (METADATA_DEFINITION.equals(name) || METADATA_CTOR_DEFINITION.equals(name)) { continue; } - writer.append("[").append(IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), true, name)); + writer.append("[").append(IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), usedDeobfuscations, true, name)); if (!en.getValue().isEmpty()) { writer.append("("); boolean first = true; @@ -555,7 +560,7 @@ public abstract class Trait implements Cloneable, Serializable { } first = false; if (key != null && !key.isEmpty()) { - writer.append(IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), true, key)).append("="); + writer.append(IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), usedDeobfuscations, true, key)).append("="); } writer.append("\""); String val = en.getValue().get(key); @@ -599,6 +604,7 @@ public abstract class Trait implements Cloneable, Serializable { /** * Gets modifiers. * + * @param usedDeobfuscations Used deobfuscations * @param abc ABC * @param isStatic Is static * @param insideInterface Inside interface @@ -606,7 +612,7 @@ public abstract class Trait implements Cloneable, Serializable { * @param classIndex Class index * @return Writer */ - public final GraphTextWriter getModifiers(ABC abc, boolean isStatic, boolean insideInterface, GraphTextWriter writer, int classIndex) { + public final GraphTextWriter getModifiers(Set usedDeobfuscations, ABC abc, boolean isStatic, boolean insideInterface, GraphTextWriter writer, int classIndex) { if ((kindFlags & ATTR_Final) > 0) { if (!isStatic) { writer.appendNoHilight("final "); @@ -629,7 +635,7 @@ public abstract class Trait implements Cloneable, Serializable { writer.append(Helper.escapeActionScriptString(m.getSimpleNamespaceName(abc.constants).toRawString())); writer.append("\") "); } else if (dc != null && nsname != null) { - String identifier = IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), true, nsname); + String identifier = IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), usedDeobfuscations, true, nsname); if (identifier != null && !identifier.isEmpty()) { writer.hilightSpecial(identifier, HighlightSpecialType.TYPE_NAME, dc.toRawString()).appendNoHilight(" "); } @@ -712,6 +718,7 @@ public abstract class Trait implements Cloneable, Serializable { /** * To string. * + * @param usedDeobfuscations Used deobfuscations * @param swfVersion SWF version * @param abcIndex ABC indexing * @param packageName Package name @@ -730,7 +737,7 @@ public abstract class Trait implements Cloneable, Serializable { * @return Writer * @throws InterruptedException On interrupt */ - public GraphTextWriter toString(int swfVersion, AbcIndexing abcIndex, DottedChain packageName, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { + public GraphTextWriter toString(Set usedDeobfuscations, int swfVersion, AbcIndexing abcIndex, DottedChain packageName, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { writer.appendNoHilight(abc.constants.getMultiname(name_index).toString(abc.constants, fullyQualifiedNames) + " kind=" + kindType + " metadata=" + Helper.intArrToString(metadata)); return writer; } @@ -738,6 +745,7 @@ public abstract class Trait implements Cloneable, Serializable { /** * Converts trait. * + * @param usedDeobfuscations Used deobfuscations * @param swfVersion SWF version * @param abcIndex ABC indexing * @param parent Parent trait @@ -754,7 +762,7 @@ public abstract class Trait implements Cloneable, Serializable { * @param scopeStack Scope stack * @throws InterruptedException On interrupt */ - public void convert(int swfVersion, AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel, ScopeStack scopeStack) throws InterruptedException { + public void convert(Set usedDeobfuscations, int swfVersion, AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel, ScopeStack scopeStack) throws InterruptedException { } /** @@ -851,6 +859,7 @@ public abstract class Trait implements Cloneable, Serializable { /** * ToString conversion including package. * + * @param usedDeobfuscations Used deobfuscations * @param swfVersion SWF version * @param abcIndex ABC indexing * @param parent Parent trait @@ -868,11 +877,11 @@ public abstract class Trait implements Cloneable, Serializable { * @return Writer * @throws InterruptedException On interrupt */ - public GraphTextWriter toStringPackaged(int swfVersion, AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { + public GraphTextWriter toStringPackaged(Set usedDeobfuscations, int swfVersion, AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { Multiname name = abc.constants.getMultiname(name_index); int nskind = name.getSimpleNamespaceKind(abc.constants); if ((nskind == Namespace.KIND_PACKAGE) || (nskind == Namespace.KIND_PACKAGE_INTERNAL)) { - String nsname = name.getSimpleNamespaceName(abc.constants).toPrintableString(abc.getSwf(), true); + String nsname = name.getSimpleNamespaceName(abc.constants).toPrintableString(usedDeobfuscations, abc.getSwf(), true); writer.appendNoHilight("package"); if (!nsname.isEmpty()) { writer.appendNoHilight(" " + nsname); //assume not null name @@ -880,8 +889,8 @@ public abstract class Trait implements Cloneable, Serializable { writer.startBlock(); List traits = new ArrayList<>(); traits.add(this); - writeImports(traits, -1, abcIndex, scriptIndex, classIndex, isStatic, abc, writer, getPackage(abc), fullyQualifiedNames); - toString(swfVersion, abcIndex, name.getNameWithNamespace(abc, abc.constants, true).getWithoutLast(), parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface); + writeImports(usedDeobfuscations, traits, -1, abcIndex, scriptIndex, classIndex, isStatic, abc, writer, getPackage(abc), fullyQualifiedNames); + toString(usedDeobfuscations, swfVersion, abcIndex, name.getNameWithNamespace(usedDeobfuscations, abc, abc.constants, true).getWithoutLast(), parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface); writer.endBlock(); writer.newLine(); } @@ -891,6 +900,7 @@ public abstract class Trait implements Cloneable, Serializable { /** * Converts trait including package. * + * @param usedDeobfuscations Used deobfuscations * @param swfVersion * @param abcIndex ABC indexing * @param parent Parent trait @@ -907,18 +917,19 @@ public abstract class Trait implements Cloneable, Serializable { * @param scopeStack Scope stack * @throws InterruptedException On interrupt */ - public void convertPackaged(int swfVersion, AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel, ScopeStack scopeStack) throws InterruptedException { + public void convertPackaged(Set usedDeobfuscations, int swfVersion, AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel, ScopeStack scopeStack) throws InterruptedException { Multiname name = abc.constants.getMultiname(name_index); int nskind = name.getSimpleNamespaceKind(abc.constants); if ((nskind == Namespace.KIND_PACKAGE) || (nskind == Namespace.KIND_PACKAGE_INTERNAL)) { - String nsname = name.getSimpleNamespaceName(abc.constants).toPrintableString(abc.getSwf(), true); - convert(swfVersion, abcIndex, parent, convertData, path + nsname, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, scopeStack); + String nsname = name.getSimpleNamespaceName(abc.constants).toPrintableString(usedDeobfuscations, abc.getSwf(), true); + convert(usedDeobfuscations, swfVersion, abcIndex, parent, convertData, path + nsname, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, scopeStack); } } /** * ToString of header. * + * @param usedDeobfuscations Used deobfuscations * @param swfVersion SWF version * @param parent Parent trait * @param packageName Package name @@ -936,14 +947,15 @@ public abstract class Trait implements Cloneable, Serializable { * @return Writer * @throws InterruptedException On interrupt */ - public GraphTextWriter toStringHeader(int swfVersion, Trait parent, DottedChain packageName, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { - toString(swfVersion, null, packageName, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface); + public GraphTextWriter toStringHeader(Set usedDeobfuscations, int swfVersion, Trait parent, DottedChain packageName, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { + toString(usedDeobfuscations, swfVersion, null, packageName, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface); return writer; } /** * Converts header. * + * @param usedDeobfuscations Used deobfuscations * @param swfVersion SWF version * @param parent Parent trait * @param convertData Convert data @@ -958,8 +970,8 @@ public abstract class Trait implements Cloneable, Serializable { * @param parallel Parallel * @throws InterruptedException On interrupt */ - public void convertHeader(int swfVersion, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel) throws InterruptedException { - convert(swfVersion, null, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, new ScopeStack()); + public void convertHeader(Set usedDeobfuscations, int swfVersion, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel) throws InterruptedException { + convert(usedDeobfuscations, swfVersion, null, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, new ScopeStack()); } /** @@ -992,14 +1004,15 @@ public abstract class Trait implements Cloneable, Serializable { /** * Gets class path. * + * @param usedDeobfuscations Used deobfuscations * @param abc ABC * @return Class path */ - public final ClassPath getPath(ABC abc) { + public final ClassPath getPath(Set usedDeobfuscations, ABC abc) { Multiname name = getName(abc); Namespace ns = name.getNamespace(abc.constants); DottedChain packageName = ns == null ? DottedChain.EMPTY : ns.getName(abc.constants); - String objectName = name.getName(abc, abc.constants, null, true, false); + String objectName = name.getName(usedDeobfuscations, abc, abc.constants, null, true, false); String namespaceSuffix = name.getNamespaceSuffix(); return new ClassPath(packageName, objectName, namespaceSuffix, abc.getSwf()); //assume not null name } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java index e98120a6d..7eb8ae685 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java @@ -53,7 +53,9 @@ import com.jpexs.helpers.Helper; import com.jpexs.helpers.Reference; import java.util.ArrayList; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; /** * Class trait in ABC file @@ -105,57 +107,42 @@ public class TraitClass extends Trait implements TraitWithSlot { return slot_id; } - /** - * Gets dependencies. - * - * @param abcIndex ABC indexing - * @param scriptIndex Script index - * @param classIndex Class index - * @param isStatic Is static - * @param customNamespace Custom namespace - * @param abc ABC - * @param dependencies Dependencies - * @param ignorePackage Ignore package - * @param fullyQualifiedNames Fully qualified names - * @param uses Uses - * @throws InterruptedException On interrupt - */ @Override - public void getDependencies(AbcIndexing abcIndex, int scriptIndex, int classIndex, boolean isStatic, String customNamespace, ABC abc, List dependencies, DottedChain ignorePackage, List fullyQualifiedNames, List uses, Reference numberContextRef) throws InterruptedException { - super.getDependencies(abcIndex, scriptIndex, -1, false, customNamespace, abc, dependencies, ignorePackage == null ? getPackage(abc) : ignorePackage, fullyQualifiedNames, uses, numberContextRef); + public void getDependencies(Set usedDeobfuscations, AbcIndexing abcIndex, int scriptIndex, int classIndex, boolean isStatic, String customNamespace, ABC abc, List dependencies, DottedChain ignorePackage, List fullyQualifiedNames, List uses, Reference numberContextRef) throws InterruptedException { + super.getDependencies(usedDeobfuscations, abcIndex, scriptIndex, -1, false, customNamespace, abc, dependencies, ignorePackage == null ? getPackage(abc) : ignorePackage, fullyQualifiedNames, uses, numberContextRef); ClassInfo classInfo = abc.class_info.get(class_info); InstanceInfo instanceInfo = abc.instance_info.get(class_info); DottedChain packageName = instanceInfo.getName(abc.constants).getNamespace(abc.constants).getName(abc.constants); //assume not null name //DependencyParser.parseDependenciesFromMultiname(customNs, abc, dependencies, uses, abc.constants.getMultiname(instanceInfo.name_index), packageName, fullyQualifiedNames); if (instanceInfo.super_index > 0) { - DependencyParser.parseDependenciesFromMultiname(abcIndex, customNamespace, abc, dependencies, abc.constants.getMultiname(instanceInfo.super_index), packageName, fullyQualifiedNames, DependencyType.INHERITANCE, uses); + DependencyParser.parseDependenciesFromMultiname(usedDeobfuscations, abcIndex, customNamespace, abc, dependencies, abc.constants.getMultiname(instanceInfo.super_index), packageName, fullyQualifiedNames, DependencyType.INHERITANCE, uses); } for (int i : instanceInfo.interfaces) { - DependencyParser.parseDependenciesFromMultiname(abcIndex, customNamespace, abc, dependencies, abc.constants.getMultiname(i), packageName, fullyQualifiedNames, DependencyType.INHERITANCE, uses); + DependencyParser.parseDependenciesFromMultiname(usedDeobfuscations, abcIndex, customNamespace, abc, dependencies, abc.constants.getMultiname(i), packageName, fullyQualifiedNames, DependencyType.INHERITANCE, uses); } //static - classInfo.static_traits.getDependencies(abcIndex, scriptIndex, class_info, true, customNamespace, abc, dependencies, packageName, fullyQualifiedNames, uses, numberContextRef); + classInfo.static_traits.getDependencies(usedDeobfuscations, abcIndex, scriptIndex, class_info, true, customNamespace, abc, dependencies, packageName, fullyQualifiedNames, uses, numberContextRef); //static initializer - DependencyParser.parseDependenciesFromMethodInfo(abcIndex, null, scriptIndex, class_info, true, customNamespace, abc, classInfo.cinit_index, dependencies, packageName, fullyQualifiedNames, new ArrayList<>(), uses, numberContextRef); + DependencyParser.parseDependenciesFromMethodInfo(usedDeobfuscations, abcIndex, null, scriptIndex, class_info, true, customNamespace, abc, classInfo.cinit_index, dependencies, packageName, fullyQualifiedNames, new ArrayList<>(), uses, numberContextRef); //instance - instanceInfo.instance_traits.getDependencies(abcIndex, scriptIndex, class_info, false, customNamespace, abc, dependencies, packageName, fullyQualifiedNames, uses, numberContextRef); + instanceInfo.instance_traits.getDependencies(usedDeobfuscations, abcIndex, scriptIndex, class_info, false, customNamespace, abc, dependencies, packageName, fullyQualifiedNames, uses, numberContextRef); //instance initializer - DependencyParser.parseDependenciesFromMethodInfo(abcIndex, null, scriptIndex, class_info, false, customNamespace, abc, instanceInfo.iinit_index, dependencies, packageName, fullyQualifiedNames, new ArrayList<>(), uses, numberContextRef); + DependencyParser.parseDependenciesFromMethodInfo(usedDeobfuscations, abcIndex, null, scriptIndex, class_info, false, customNamespace, abc, instanceInfo.iinit_index, dependencies, packageName, fullyQualifiedNames, new ArrayList<>(), uses, numberContextRef); } @Override - public GraphTextWriter toStringHeader(int swfVersion, Trait parent, DottedChain packageName, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) { - abc.instance_info.get(class_info).getClassHeaderStr(convertData.assetsDir, writer, abc, fullyQualifiedNames, false, false /*??*/); + public GraphTextWriter toStringHeader(Set usedDeobfuscations, int swfVersion, Trait parent, DottedChain packageName, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) { + abc.instance_info.get(class_info).getClassHeaderStr(usedDeobfuscations, convertData.assetsDir, writer, abc, fullyQualifiedNames, false, false /*??*/); return writer; } @Override - public void convertHeader(int swfVersion, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel) { + public void convertHeader(Set usedDeobfuscations, int swfVersion, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel) { } /** @@ -169,28 +156,9 @@ public class TraitClass extends Trait implements TraitWithSlot { public String toString(ABC abc, List fullyQualifiedNames) { return "Class " + abc.constants.getMultiname(name_index).toString(abc.constants, fullyQualifiedNames) + " slot=" + slot_id + " class_info=" + class_info + " metadata=" + Helper.intArrToString(metadata); } - - /** - * To string. - * - * @param abcIndex ABC indexing - * @param parent Parent trait - * @param convertData Convert data - * @param path Path - * @param abc ABC - * @param isStatic Is static - * @param exportMode Export mode - * @param scriptIndex Script index - * @param classIndex Class index - * @param writer Writer - * @param fullyQualifiedNames Fully qualified names - * @param parallel Parallel - * @param insideInterface Inside interface - * @return Writer - * @throws InterruptedException On interrupt - */ + @Override - public GraphTextWriter toString(int swfVersion, AbcIndexing abcIndex, DottedChain packageName, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { + public GraphTextWriter toString(Set usedDeobfuscations, int swfVersion, AbcIndexing abcIndex, DottedChain packageName, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { InstanceInfo instanceInfo = abc.instance_info.get(class_info); @@ -201,16 +169,16 @@ public class TraitClass extends Trait implements TraitWithSlot { Reference first = new Reference<>(true); - String instanceInfoName = instanceInfoMultiname.getName(abc, abc.constants, fullyQualifiedNames, false, true); + String instanceInfoName = instanceInfoMultiname.getName(usedDeobfuscations, abc, abc.constants, fullyQualifiedNames, false, true); - getMetaData(this, convertData, abc, writer); + getMetaData(usedDeobfuscations, this, convertData, abc, writer); boolean allowEmbed = true; if (convertData.exportEmbedFlaMode) { allowEmbed = false; if (abc.getSwf() != null) { - CharacterTag ct = abc.getSwf().getCharacterByClass(instanceInfoMultiname.getNameWithNamespace(abc, abc.constants, false).toRawString()); + CharacterTag ct = abc.getSwf().getCharacterByClass(instanceInfoMultiname.getNameWithNamespace(usedDeobfuscations, abc, abc.constants, false).toRawString()); if (ct == null) { allowEmbed = false; } else { @@ -237,7 +205,7 @@ public class TraitClass extends Trait implements TraitWithSlot { } //class header - instanceInfo.getClassHeaderStr(convertData.assetsDir, writer, abc, fullyQualifiedNames, false, allowEmbed); + instanceInfo.getClassHeaderStr(usedDeobfuscations, convertData.assetsDir, writer, abc, fullyQualifiedNames, false, allowEmbed); writer.endTrait(); writer.startClass(class_info); writer.startBlock(); @@ -261,7 +229,7 @@ public class TraitClass extends Trait implements TraitWithSlot { } //static variables & constants - classInfo.static_traits.toString(swfVersion, packageName, first, abcIndex, new Class[]{TraitSlotConst.class}, this, convertData, path + "/" + instanceInfoName, abc, true, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, new ArrayList<>(), isInterface); + classInfo.static_traits.toString(usedDeobfuscations, swfVersion, packageName, first, abcIndex, new Class[]{TraitSlotConst.class}, this, convertData, path + "/" + instanceInfoName, abc, true, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, new ArrayList<>(), isInterface); //static initializer continue if (bodyIndex != -1) { @@ -276,7 +244,7 @@ public class TraitClass extends Trait implements TraitWithSlot { first.setVal(false); List callStack = new ArrayList<>(); callStack.add(abc.bodies.get(bodyIndex)); - abc.bodies.get(bodyIndex).toString(swfVersion, callStack, abcIndex, path + "/" + instanceInfoName + ".staticinitializer", exportMode, abc, this, writer, fullyQualifiedNames, new HashSet<>()); + abc.bodies.get(bodyIndex).toString(usedDeobfuscations, swfVersion, callStack, abcIndex, path + "/" + instanceInfoName + ".staticinitializer", exportMode, abc, this, writer, fullyQualifiedNames, new HashSet<>()); //first.setVal(true); //writer.endBlock(); } else { @@ -303,7 +271,7 @@ public class TraitClass extends Trait implements TraitWithSlot { } //instance variables - instanceInfo.instance_traits.toString(swfVersion, packageName, first, abcIndex, new Class[]{TraitSlotConst.class}, this, convertData, path + "/" + instanceInfoName, abc, false, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, ignoredInstanceVariableNames, isInterface); + instanceInfo.instance_traits.toString(usedDeobfuscations, swfVersion, packageName, first, abcIndex, new Class[]{TraitSlotConst.class}, this, convertData, path + "/" + instanceInfoName, abc, false, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, ignoredInstanceVariableNames, isInterface); //instance initializer - constructor if (!instanceInfo.isInterface()) { @@ -318,17 +286,17 @@ public class TraitClass extends Trait implements TraitWithSlot { writer.startMethod(instanceInfo.iinit_index, "iinit"); writer.appendNoHilight(modifier); writer.appendNoHilight("function "); - writer.appendNoHilight(m.getName(abc, abc.constants, null/*do not want full names here*/, false, true)); + writer.appendNoHilight(m.getName(usedDeobfuscations, abc, abc.constants, null/*do not want full names here*/, false, true)); writer.appendNoHilight("("); bodyIndex = abc.findBodyIndex(instanceInfo.iinit_index); MethodBody body = bodyIndex == -1 ? null : abc.bodies.get(bodyIndex); - abc.method_info.get(instanceInfo.iinit_index).getParamStr(writer, abc.constants, body, abc, fullyQualifiedNames); + abc.method_info.get(instanceInfo.iinit_index).getParamStr(writer, abc.constants, body, abc, fullyQualifiedNames, usedDeobfuscations); writer.appendNoHilight(")").startBlock(); if (exportMode != ScriptExportMode.AS_METHOD_STUBS) { if (body != null) { List callStack = new ArrayList<>(); callStack.add(body); - body.toString(swfVersion, callStack, abcIndex, path + "/" + instanceInfoName + ".initializer", exportMode, abc, this, writer, fullyQualifiedNames, new HashSet<>()); + body.toString(usedDeobfuscations, swfVersion, callStack, abcIndex, path + "/" + instanceInfoName + ".initializer", exportMode, abc, this, writer, fullyQualifiedNames, new HashSet<>()); } } @@ -338,7 +306,7 @@ public class TraitClass extends Trait implements TraitWithSlot { } //static methods - classInfo.static_traits.toString(swfVersion, packageName, first, abcIndex, new Class[]{TraitClass.class, TraitFunction.class, TraitMethodGetterSetter.class}, this, convertData, path + "/" + instanceInfoName, abc, true, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, new ArrayList<>(), isInterface); + classInfo.static_traits.toString(usedDeobfuscations, swfVersion, packageName, first, abcIndex, new Class[]{TraitClass.class, TraitFunction.class, TraitMethodGetterSetter.class}, this, convertData, path + "/" + instanceInfoName, abc, true, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, new ArrayList<>(), isInterface); List ignoredInstanceTraitNames = new ArrayList<>(); if (convertData.ignoreFrameScripts) { @@ -346,7 +314,7 @@ public class TraitClass extends Trait implements TraitWithSlot { } if (convertData.ignoreAccessibility) { for (Trait t : instanceInfo.instance_traits.traits) { - String traitName = t.getName(abc).getName(abc, abc.constants, new ArrayList<>(), true, false);; + String traitName = t.getName(abc).getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), true, false);; if (traitName.startsWith("__setAcc_") || traitName.startsWith("__setTab_")) { ignoredInstanceTraitNames.add(traitName); @@ -355,7 +323,7 @@ public class TraitClass extends Trait implements TraitWithSlot { } //instance methods - instanceInfo.instance_traits.toString(swfVersion, packageName, first, abcIndex, new Class[]{TraitClass.class, TraitFunction.class, TraitMethodGetterSetter.class}, this, convertData, path + "/" + instanceInfoName, abc, false, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, ignoredInstanceTraitNames, isInterface); + instanceInfo.instance_traits.toString(usedDeobfuscations, swfVersion, packageName, first, abcIndex, new Class[]{TraitClass.class, TraitFunction.class, TraitMethodGetterSetter.class}, this, convertData, path + "/" + instanceInfoName, abc, false, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, ignoredInstanceTraitNames, isInterface); if (first.getVal()) { writer.newLine(); @@ -367,12 +335,12 @@ public class TraitClass extends Trait implements TraitWithSlot { } @Override - public void convert(int swfVersion, AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel, ScopeStack scopeStack) throws InterruptedException { + public void convert(Set usedDeobfuscations, int swfVersion, AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel, ScopeStack scopeStack) throws InterruptedException { fullyQualifiedNames = new ArrayList<>(); InstanceInfo instanceInfo = abc.instance_info.get(class_info); - String instanceInfoName = instanceInfo.getName(abc.constants).getName(abc, abc.constants, fullyQualifiedNames, false, true); + String instanceInfoName = instanceInfo.getName(abc.constants).getName(usedDeobfuscations, abc, abc.constants, fullyQualifiedNames, false, true); ClassInfo classInfo = abc.class_info.get(class_info); AbcIndexing index = new AbcIndexing(abc.getSwf()); @@ -382,7 +350,7 @@ public class TraitClass extends Trait implements TraitWithSlot { int nsIndex = abc.constants.getNamespaceId(Namespace.KIND_PACKAGE, DottedChain.TOPLEVEL, sIndex, false); if (nsIndex > -1) { Reference foundStatic = new Reference<>(null); - convertData.thisHasDefaultToPrimitive = null == index.findProperty(new AbcIndexing.PropertyDef("toString", new TypeItem(instanceInfo.getName(abc.constants).getNameWithNamespace(abc, abc.constants, true)), abc, nsIndex), false, true, false, foundStatic); + convertData.thisHasDefaultToPrimitive = null == index.findProperty(new AbcIndexing.PropertyDef("toString", new TypeItem(instanceInfo.getName(abc.constants).getNameWithNamespace(usedDeobfuscations, abc, abc.constants, true)), abc, nsIndex), false, true, false, foundStatic); } else { convertData.thisHasDefaultToPrimitive = true; } @@ -398,7 +366,7 @@ public class TraitClass extends Trait implements TraitWithSlot { callStack.add(abc.bodies.get(bodyIndex)); if (!abc.instance_info.get(class_info).isInterface()) { - AbcIndexing.ClassIndex cls = abcIndex.findClass(AbcIndexing.multinameToType(abc.instance_info.get(class_info).name_index, abc, abc.constants), abc, scriptIndex); + AbcIndexing.ClassIndex cls = abcIndex.findClass(AbcIndexing.multinameToType(new LinkedHashSet<>(), abc.instance_info.get(class_info).name_index, abc, abc.constants), abc, scriptIndex); List clsList = new ArrayList<>(); cls = cls.parent; while (cls != null) { @@ -406,11 +374,11 @@ public class TraitClass extends Trait implements TraitWithSlot { cls = cls.parent; } for (AbcIndexing.ClassIndex cls2 : clsList) { - newScopeStack.push(new ClassAVM2Item(cls2.abc.instance_info.get(cls2.index).getName(cls2.abc.constants).getNameWithNamespace(cls2.abc, cls2.abc.constants, true))); + newScopeStack.push(new ClassAVM2Item(cls2.abc.instance_info.get(cls2.index).getName(cls2.abc.constants).getNameWithNamespace(usedDeobfuscations, cls2.abc, cls2.abc.constants, true))); } } - abc.bodies.get(bodyIndex).convert(swfVersion, callStack, abcIndex, convertData, path + "/" + instanceInfoName + ".staticinitializer", exportMode, true, classInfo.cinit_index, scriptIndex, class_info, abc, this, newScopeStack, GraphTextWriter.TRAIT_CLASS_INITIALIZER, writer, fullyQualifiedNames, classInfo.static_traits, true, new HashSet<>(), new ArrayList<>()); + abc.bodies.get(bodyIndex).convert(swfVersion, callStack, abcIndex, convertData, path + "/" + instanceInfoName + ".staticinitializer", exportMode, true, classInfo.cinit_index, scriptIndex, class_info, abc, this, newScopeStack, GraphTextWriter.TRAIT_CLASS_INITIALIZER, writer, fullyQualifiedNames, classInfo.static_traits, true, new HashSet<>(), new ArrayList<>(), usedDeobfuscations); newScopeStack.push(new ClassAVM2Item(abc.instance_info.get(class_info).getName(abc.constants))); classInitializerIsEmpty = !writer.getMark(); @@ -423,7 +391,7 @@ public class TraitClass extends Trait implements TraitWithSlot { MethodBody constructorBody = abc.bodies.get(bodyIndex); List callStack = new ArrayList<>(); callStack.add(constructorBody); - constructorBody.convert(swfVersion, callStack, abcIndex, convertData, path + "/" + instanceInfoName + ".initializer", exportMode, false, instanceInfo.iinit_index, scriptIndex, class_info, abc, this, new ScopeStack(), GraphTextWriter.TRAIT_INSTANCE_INITIALIZER, writer, fullyQualifiedNames, instanceInfo.instance_traits, true, new HashSet<>(), new ArrayList<>()); + constructorBody.convert(swfVersion, callStack, abcIndex, convertData, path + "/" + instanceInfoName + ".initializer", exportMode, false, instanceInfo.iinit_index, scriptIndex, class_info, abc, this, new ScopeStack(), GraphTextWriter.TRAIT_INSTANCE_INITIALIZER, writer, fullyQualifiedNames, instanceInfo.instance_traits, true, new HashSet<>(), new ArrayList<>(), usedDeobfuscations); if (convertData.ignoreFrameScripts) { //find all addFrameScript(xx,this.method) in constructor @@ -453,14 +421,14 @@ public class TraitClass extends Trait implements TraitWithSlot { if (callProp.arguments.get(i) instanceof IntegerValueAVM2Item) { if (callProp.arguments.get(i + 1) instanceof GetLexAVM2Item) { GetLexAVM2Item lex = (GetLexAVM2Item) callProp.arguments.get(i + 1); - frameTraitNames.add(lex.propertyName.getName(abc, abc.constants, new ArrayList<>(), false, true)); + frameTraitNames.add(lex.propertyName.getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), false, true)); } else if (callProp.arguments.get(i + 1) instanceof GetPropertyAVM2Item) { GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) callProp.arguments.get(i + 1); if (getProp.object instanceof ThisAVM2Item) { if (getProp.propertyName instanceof FullMultinameAVM2Item) { FullMultinameAVM2Item framePropName = (FullMultinameAVM2Item) getProp.propertyName; int multinameIndex = framePropName.multinameIndex; - frameTraitNames.add(abc.constants.getMultiname(multinameIndex).getName(abc, abc.constants, new ArrayList<>(), false, true)); + frameTraitNames.add(abc.constants.getMultiname(multinameIndex).getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), false, true)); } } } @@ -574,9 +542,9 @@ public class TraitClass extends Trait implements TraitWithSlot { } //static variables,constants & methods - classInfo.static_traits.convert(swfVersion, abcIndex, this, convertData, path + "/" + instanceInfoName, abc, true, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, newScopeStack); + classInfo.static_traits.convert(usedDeobfuscations, swfVersion, abcIndex, this, convertData, path + "/" + instanceInfoName, abc, true, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, newScopeStack); - instanceInfo.instance_traits.convert(swfVersion, abcIndex, this, convertData, path + "/" + instanceInfoName, abc, false, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, newScopeStack); + instanceInfo.instance_traits.convert(usedDeobfuscations, swfVersion, abcIndex, this, convertData, path + "/" + instanceInfoName, abc, false, exportMode, false, scriptIndex, class_info, writer, fullyQualifiedNames, parallel, newScopeStack); } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java index 128e4081c..f7983c87e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java @@ -34,6 +34,7 @@ import com.jpexs.helpers.Reference; import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Set; /** * Function trait in ABC file. @@ -77,23 +78,23 @@ public class TraitFunction extends Trait implements TraitWithSlot { } @Override - public GraphTextWriter toStringHeader(int swfVersion, Trait parent, DottedChain packageName, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) { + public GraphTextWriter toStringHeader(Set usedDeobfuscations, int swfVersion, Trait parent, DottedChain packageName, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) { MethodBody body = abc.findBody(method_info); if (body == null) { writer.appendNoHilight("native "); } - getModifiers(abc, isStatic, insideInterface, writer, classIndex); + getModifiers(usedDeobfuscations, abc, isStatic, insideInterface, writer, classIndex); writer.hilightSpecial("function ", HighlightSpecialType.TRAIT_TYPE); - writer.hilightSpecial(abc.constants.getMultiname(name_index).getName(abc, abc.constants, fullyQualifiedNames, false, true), HighlightSpecialType.TRAIT_NAME); + writer.hilightSpecial(abc.constants.getMultiname(name_index).getName(usedDeobfuscations, abc, abc.constants, fullyQualifiedNames, false, true), HighlightSpecialType.TRAIT_NAME); writer.appendNoHilight("("); - abc.method_info.get(method_info).getParamStr(writer, abc.constants, body, abc, fullyQualifiedNames); + abc.method_info.get(method_info).getParamStr(writer, abc.constants, body, abc, fullyQualifiedNames, usedDeobfuscations); writer.appendNoHilight(") : "); - abc.method_info.get(method_info).getReturnTypeStr(writer, abc, abc.constants, fullyQualifiedNames); + abc.method_info.get(method_info).getReturnTypeStr(writer, abc, abc.constants, fullyQualifiedNames, usedDeobfuscations); return writer; } @Override - public void convertHeader(int swfVersion, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel) { + public void convertHeader(Set usedDeobfuscations, int swfVersion, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel) { } /** @@ -109,10 +110,10 @@ public class TraitFunction extends Trait implements TraitWithSlot { } @Override - public GraphTextWriter toString(int swfVersion, AbcIndexing abcIndex, DottedChain packageName, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { - getMetaData(this, convertData, abc, writer); - writer.startMethod(method_info, getName(abc).getName(abc, abc.constants, new ArrayList<>(), true, false)); - toStringHeader(swfVersion, parent, packageName, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface); + public GraphTextWriter toString(Set usedDeobfuscations, int swfVersion, AbcIndexing abcIndex, DottedChain packageName, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { + getMetaData(usedDeobfuscations, this, convertData, abc, writer); + writer.startMethod(method_info, getName(abc).getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), true, false)); + toStringHeader(usedDeobfuscations, swfVersion, parent, packageName, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface); writer.startBlock(); int bodyIndex = abc.findBodyIndex(method_info); @@ -120,7 +121,7 @@ public class TraitFunction extends Trait implements TraitWithSlot { //writeUses(scriptIndex, classIndex, isStatic, abc, writer); List callStack = new ArrayList<>(); callStack.add(abc.bodies.get(bodyIndex)); - abc.bodies.get(bodyIndex).toString(swfVersion, callStack, abcIndex, path + "." + abc.constants.getMultiname(name_index).getName(abc, abc.constants, fullyQualifiedNames, false, true), exportMode, abc, this, writer, fullyQualifiedNames, new HashSet<>()); + abc.bodies.get(bodyIndex).toString(usedDeobfuscations, swfVersion, callStack, abcIndex, path + "." + abc.constants.getMultiname(name_index).getName(usedDeobfuscations, abc, abc.constants, fullyQualifiedNames, false, true), exportMode, abc, this, writer, fullyQualifiedNames, new HashSet<>()); } writer.endBlock(); @@ -131,15 +132,15 @@ public class TraitFunction extends Trait implements TraitWithSlot { @Override - public void convert(int swfVersion, AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel, ScopeStack scopeStack) throws InterruptedException { + public void convert(Set usedDeobfuscations, int swfVersion, AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel, ScopeStack scopeStack) throws InterruptedException { fullyQualifiedNames = new ArrayList<>(); - writer.startMethod(method_info, getName(abc).getName(abc, abc.constants, new ArrayList<>(), true, false)); - convertHeader(swfVersion, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel); + writer.startMethod(method_info, getName(abc).getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), true, false)); + convertHeader(usedDeobfuscations, swfVersion, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel); int bodyIndex = abc.findBodyIndex(method_info); if (bodyIndex != -1) { List callStack = new ArrayList<>(); callStack.add(abc.bodies.get(bodyIndex)); - abc.bodies.get(bodyIndex).convert(swfVersion, callStack, abcIndex, convertData, path + "." + abc.constants.getMultiname(name_index).getName(abc, abc.constants, fullyQualifiedNames, false, true), exportMode, isStatic, method_info, scriptIndex, classIndex, abc, this, scopeStack, 0, writer, fullyQualifiedNames, null, true, new HashSet<>(), new ArrayList<>()); + abc.bodies.get(bodyIndex).convert(swfVersion, callStack, abcIndex, convertData, path + "." + abc.constants.getMultiname(name_index).getName(usedDeobfuscations, abc, abc.constants, fullyQualifiedNames, false, true), exportMode, isStatic, method_info, scriptIndex, classIndex, abc, this, scopeStack, 0, writer, fullyQualifiedNames, null, true, new HashSet<>(), new ArrayList<>(), usedDeobfuscations); } writer.endMethod(); } @@ -174,29 +175,14 @@ public class TraitFunction extends Trait implements TraitWithSlot { TraitFunction ret = (TraitFunction) super.clone(); return ret; } - - /** - * Gets dependencies. - * - * @param abcIndex ABC indexing - * @param scriptIndex Script index - * @param classIndex Class index - * @param isStatic Is static - * @param customNamespace Custom namespace - * @param abc ABC - * @param dependencies Dependencies - * @param ignorePackage Ignore package - * @param fullyQualifiedNames Fully qualified names - * @param uses Uses - * @throws InterruptedException On interrupt - */ + @Override - public void getDependencies(AbcIndexing abcIndex, int scriptIndex, int classIndex, boolean isStatic, String customNamespace, ABC abc, List dependencies, DottedChain ignorePackage, List fullyQualifiedNames, List uses, Reference numberContextRef) throws InterruptedException { + public void getDependencies(Set usedDeobfuscations, AbcIndexing abcIndex, int scriptIndex, int classIndex, boolean isStatic, String customNamespace, ABC abc, List dependencies, DottedChain ignorePackage, List fullyQualifiedNames, List uses, Reference numberContextRef) throws InterruptedException { if (ignorePackage == null) { ignorePackage = getPackage(abc); } - super.getDependencies(abcIndex, scriptIndex, classIndex, false, customNamespace, abc, dependencies, ignorePackage, fullyQualifiedNames, uses, numberContextRef); - DependencyParser.parseDependenciesFromMethodInfo(abcIndex, this, scriptIndex, classIndex, false, customNamespace, abc, method_info, dependencies, ignorePackage, fullyQualifiedNames, new ArrayList<>(), uses, numberContextRef); + super.getDependencies(usedDeobfuscations, abcIndex, scriptIndex, classIndex, false, customNamespace, abc, dependencies, ignorePackage, fullyQualifiedNames, uses, numberContextRef); + DependencyParser.parseDependenciesFromMethodInfo(usedDeobfuscations, abcIndex, this, scriptIndex, classIndex, false, customNamespace, abc, method_info, dependencies, ignorePackage, fullyQualifiedNames, new ArrayList<>(), uses, numberContextRef); } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java index 1df73c1bb..6dc867e98 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java @@ -40,7 +40,9 @@ import com.jpexs.helpers.Helper; import com.jpexs.helpers.Reference; import java.util.ArrayList; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; /** * Method, getter or setter trait in ABC file. @@ -74,30 +76,15 @@ public class TraitMethodGetterSetter extends Trait { } @Override - public void convertHeader(int swfVersion, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel) { + public void convertHeader(Set usedDeobfuscations, int swfVersion, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel) { } - - /** - * Gets dependencies. - * - * @param abcIndex ABC indexing - * @param scriptIndex Script index - * @param classIndex Class index - * @param isStatic Is static - * @param customNamespace Custom namespace - * @param abc ABC - * @param dependencies Dependencies - * @param ignorePackage Ignore package - * @param fullyQualifiedNames Fully qualified names - * @param uses Uses - * @throws InterruptedException On interrupt - */ + @Override - public void getDependencies(AbcIndexing abcIndex, int scriptIndex, int classIndex, boolean isStatic, String customNamespace, ABC abc, List dependencies, DottedChain ignorePackage, List fullyQualifiedNames, List uses, Reference numberContextRef) throws InterruptedException { + public void getDependencies(Set usedDeobfuscations, AbcIndexing abcIndex, int scriptIndex, int classIndex, boolean isStatic, String customNamespace, ABC abc, List dependencies, DottedChain ignorePackage, List fullyQualifiedNames, List uses, Reference numberContextRef) throws InterruptedException { if (ignorePackage == null) { ignorePackage = getPackage(abc); } - super.getDependencies(abcIndex, scriptIndex, classIndex, isStatic, customNamespace, abc, dependencies, ignorePackage, fullyQualifiedNames, uses, numberContextRef); + super.getDependencies(usedDeobfuscations, abcIndex, scriptIndex, classIndex, isStatic, customNamespace, abc, dependencies, ignorePackage, fullyQualifiedNames, uses, numberContextRef); if (customNamespace == null) { Multiname m = getName(abc); @@ -106,11 +93,11 @@ public class TraitMethodGetterSetter extends Trait { customNamespace = m.getSimpleNamespaceName(abc.constants).toRawString(); } } - DependencyParser.parseDependenciesFromMethodInfo(abcIndex, this, scriptIndex, classIndex, isStatic, customNamespace, abc, method_info, dependencies, ignorePackage, fullyQualifiedNames, new ArrayList<>(), uses, numberContextRef); + DependencyParser.parseDependenciesFromMethodInfo(usedDeobfuscations, abcIndex, this, scriptIndex, classIndex, isStatic, customNamespace, abc, method_info, dependencies, ignorePackage, fullyQualifiedNames, new ArrayList<>(), uses, numberContextRef); } @Override - public GraphTextWriter toStringHeader(int swfVersion, Trait parent, DottedChain packageName, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) { + public GraphTextWriter toStringHeader(Set usedDeobfuscations, int swfVersion, Trait parent, DottedChain packageName, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) { String addKind = ""; if (kindType == TRAIT_GETTER) { addKind = "get "; @@ -120,34 +107,34 @@ public class TraitMethodGetterSetter extends Trait { } MethodBody body = abc.findBody(method_info); - getModifiers(abc, isStatic, insideInterface, writer, classIndex); + getModifiers(usedDeobfuscations, abc, isStatic, insideInterface, writer, classIndex); if (abc.method_info.get(method_info).flagNative()) { writer.appendNoHilight("native "); } writer.hilightSpecial("function " + addKind, HighlightSpecialType.TRAIT_TYPE); - writer.hilightSpecial(getName(abc).getName(abc, abc.constants, new ArrayList<>(), false, true), HighlightSpecialType.TRAIT_NAME); + writer.hilightSpecial(getName(abc).getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), false, true), HighlightSpecialType.TRAIT_NAME); writer.appendNoHilight("("); - abc.method_info.get(method_info).getParamStr(writer, abc.constants, body, abc, fullyQualifiedNames); + abc.method_info.get(method_info).getParamStr(writer, abc.constants, body, abc, fullyQualifiedNames, usedDeobfuscations); writer.appendNoHilight(") : "); - abc.method_info.get(method_info).getReturnTypeStr(writer, abc, abc.constants, fullyQualifiedNames); + abc.method_info.get(method_info).getReturnTypeStr(writer, abc, abc.constants, fullyQualifiedNames, usedDeobfuscations); return writer; } @Override - public void convert(int swfVersion, AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel, ScopeStack scopeStack) throws InterruptedException { + public void convert(Set usedDeobfuscations, int swfVersion, AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel, ScopeStack scopeStack) throws InterruptedException { int nsKind = getName(abc).getSimpleNamespaceKind(abc.constants); - writer.startMethod(method_info, getName(abc).getName(abc, abc.constants, new ArrayList<>(), true, false)); - path = path + "." + getName(abc).getName(abc, abc.constants, fullyQualifiedNames, false, true); - convertHeader(swfVersion, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel); + writer.startMethod(method_info, getName(abc).getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), true, false)); + path = path + "." + getName(abc).getName(usedDeobfuscations, abc, abc.constants, fullyQualifiedNames, false, true); + convertHeader(usedDeobfuscations, swfVersion, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel); int bodyIndex = abc.findBodyIndex(method_info); if (exportMode != ScriptExportMode.AS_METHOD_STUBS) { if (!(classIndex != -1 && abc.instance_info.get(classIndex).isInterface() || bodyIndex == -1)) { if (bodyIndex != -1) { List callStack = new ArrayList<>(); callStack.add(abc.bodies.get(bodyIndex)); - abc.bodies.get(bodyIndex).convert(swfVersion, callStack, abcIndex, convertData, path, exportMode, isStatic, method_info, scriptIndex, classIndex, abc, this, scopeStack, 0, writer, fullyQualifiedNames, null, true, new HashSet<>(), new ArrayList<>()); + abc.bodies.get(bodyIndex).convert(swfVersion, callStack, abcIndex, convertData, path, exportMode, isStatic, method_info, scriptIndex, classIndex, abc, this, scopeStack, 0, writer, fullyQualifiedNames, null, true, new HashSet<>(), new ArrayList<>(), usedDeobfuscations); } } } @@ -167,11 +154,11 @@ public class TraitMethodGetterSetter extends Trait { } @Override - public GraphTextWriter toString(int swfVersion, AbcIndexing abcIndex, DottedChain packageName, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { - getMetaData(this, convertData, abc, writer); - writer.startMethod(method_info, getName(abc).getName(abc, abc.constants, new ArrayList<>(), true, false)); - path = path + "." + getName(abc).getName(abc, abc.constants, fullyQualifiedNames, false, true); - toStringHeader(swfVersion, parent, packageName, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface); + public GraphTextWriter toString(Set usedDeobfuscations, int swfVersion, AbcIndexing abcIndex, DottedChain packageName, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { + getMetaData(usedDeobfuscations, this, convertData, abc, writer); + writer.startMethod(method_info, getName(abc).getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), true, false)); + path = path + "." + getName(abc).getName(usedDeobfuscations, abc, abc.constants, fullyQualifiedNames, false, true); + toStringHeader(usedDeobfuscations, swfVersion, parent, packageName, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface); int bodyIndex = abc.findBodyIndex(method_info); if (classIndex != -1 && abc.instance_info.get(classIndex).isInterface() || bodyIndex == -1) { writer.appendNoHilight(";"); @@ -185,7 +172,7 @@ public class TraitMethodGetterSetter extends Trait { //writeUses(scriptIndex, classIndex, isStatic, abc, writer); List callStack = new ArrayList<>(); callStack.add(abc.bodies.get(bodyIndex)); - abc.bodies.get(bodyIndex).toString(swfVersion, callStack, abcIndex, path, exportMode, abc, this, writer, fullyQualifiedNames, new HashSet<>()); + abc.bodies.get(bodyIndex).toString(usedDeobfuscations, swfVersion, callStack, abcIndex, path, exportMode, abc, this, writer, fullyQualifiedNames, new HashSet<>()); } } else { String retTypeRaw = abc.method_info.get(method_info).getReturnTypeRaw(abc, abc.constants, fullyQualifiedNames); @@ -256,10 +243,10 @@ public class TraitMethodGetterSetter extends Trait { @Override public boolean isVisible(boolean isStatic, ABC abc) { if (Configuration.handleSkinPartsAutomatically.get()) { - if ("skinParts".equals(getName(abc).getName(abc, abc.constants, new ArrayList<>(), true, true))) { + if ("skinParts".equals(getName(abc).getName(new LinkedHashSet<>(), abc, abc.constants, new ArrayList<>(), true, true))) { if (kindType == TRAIT_GETTER) { MethodInfo mi = abc.method_info.get(method_info); - if (mi.param_types.length == 0 && "Object".equals(abc.constants.getMultiname(mi.ret_type).getNameWithNamespace(abc, abc.constants, true).toRawString())) { + if (mi.param_types.length == 0 && "Object".equals(abc.constants.getMultiname(mi.ret_type).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, true).toRawString())) { if (abc.constants.getNamespace(abc.constants.getMultiname(name_index).namespace_index).kind == Namespace.KIND_PROTECTED) { return false; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java index a6b29f724..57e591d99 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java @@ -44,7 +44,9 @@ import com.jpexs.helpers.Reference; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; /** * Slot or const trait in ABC file. @@ -99,15 +101,16 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { /** * Gets type as string. * + * @param usedDeobfuscations Used deobfuscations * @param abc ABC * @param constants Constant pool * @param fullyQualifiedNames Fully qualified names * @return Type as string */ - public String getType(ABC abc, AVM2ConstantPool constants, List fullyQualifiedNames) { + public String getType(Set usedDeobfuscations, ABC abc, AVM2ConstantPool constants, List fullyQualifiedNames) { String typeStr = "*"; if (type_index > 0) { - typeStr = constants.getMultiname(type_index).getName(abc, constants, fullyQualifiedNames, false, true); + typeStr = constants.getMultiname(type_index).getName(usedDeobfuscations, abc, constants, fullyQualifiedNames, false, true); } return typeStr; } @@ -118,10 +121,11 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { * @param writer Writer * @param abc ABC * @param fullyQualifiedNames Fully qualified names + * @param usedDeobfuscations Used deobfuscations * @return Writer */ - public GraphTextWriter getNameStr(GraphTextWriter writer, ABC abc, List fullyQualifiedNames) { - String typeStr = getType(abc, abc.constants, fullyQualifiedNames); + public GraphTextWriter getNameStr(GraphTextWriter writer, ABC abc, List fullyQualifiedNames, Set usedDeobfuscations) { + String typeStr = getType(usedDeobfuscations, abc, abc.constants, fullyQualifiedNames); ValueKind val = null; if (value_kind != 0) { val = new ValueKind(value_index, value_kind); @@ -138,7 +142,7 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { typeStr = ""; } writer.hilightSpecial(slotconst + " ", HighlightSpecialType.TRAIT_TYPE); - writer.hilightSpecial(getName(abc).getName(abc, abc.constants, new ArrayList<>(), false, true), HighlightSpecialType.TRAIT_NAME); + writer.hilightSpecial(getName(abc).getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), false, true), HighlightSpecialType.TRAIT_NAME); writer.hilightSpecial(typeStr, HighlightSpecialType.TRAIT_TYPE_NAME); return writer; } @@ -165,6 +169,7 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { /** * Gets value as string. * + * @param usedDeobfuscations Used deobfuscations * @param swfVersion SWF version * @param abcIndex ABC indexing * @param exportMode Export mode @@ -174,7 +179,7 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { * @param fullyQualifiedNames Fully qualified names * @throws InterruptedException On interrupt */ - public void getValueStr(int swfVersion, AbcIndexing abcIndex, ScriptExportMode exportMode, ConvertData convertData, GraphTextWriter writer, ABC abc, List fullyQualifiedNames) throws InterruptedException { + public void getValueStr(Set usedDeobfuscations, int swfVersion, AbcIndexing abcIndex, ScriptExportMode exportMode, ConvertData convertData, GraphTextWriter writer, ABC abc, List fullyQualifiedNames) throws InterruptedException { if (convertData.assignedValues.containsKey(this)) { AssignedValue assignment = convertData.assignedValues.get(this); @@ -190,7 +195,7 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { if (exportMode != ScriptExportMode.AS_METHOD_STUBS) { List callStack = new ArrayList<>(); callStack.add(abc.bodies.get(abc.findBodyIndex(assignment.method))); - assignment.value.toString(writer, LocalData.create(callStack, abcIndex, abc, new HashMap<>(), fullyQualifiedNames, new HashSet<>(), exportMode, swfVersion)); + assignment.value.toString(writer, LocalData.create(callStack, abcIndex, abc, new HashMap<>(), fullyQualifiedNames, new HashSet<>(), exportMode, swfVersion, usedDeobfuscations)); } writer.endMethod(); writer.endTrait(); @@ -233,8 +238,8 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { } @Override - public GraphTextWriter toString(int swfVersion, AbcIndexing abcIndex, DottedChain packageName, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { - getMetaData(this, convertData, abc, writer); + public GraphTextWriter toString(Set usedDeobfuscations, int swfVersion, AbcIndexing abcIndex, DottedChain packageName, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, boolean insideInterface) throws InterruptedException { + getMetaData(usedDeobfuscations, this, convertData, abc, writer); Multiname n = getName(abc); boolean showModifier = true; if ((classIndex == -1) && (n != null)) { @@ -246,7 +251,7 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { } } if (showModifier) { - getModifiers(abc, isStatic, insideInterface, writer, classIndex); + getModifiers(usedDeobfuscations, abc, isStatic, insideInterface, writer, classIndex); } if (convertData.assignedValues.containsKey(this)) { GraphTargetItem val = convertData.assignedValues.get(this).value; @@ -254,22 +259,22 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { List callStack = new ArrayList<>(); AssignedValue assignment = convertData.assignedValues.get(this); callStack.add(abc.bodies.get(abc.findBodyIndex(assignment.method))); - return val.toString(writer, LocalData.create(callStack, abcIndex, abc, new HashMap<>(), fullyQualifiedNames, new HashSet<>(), exportMode, swfVersion)); + return val.toString(writer, LocalData.create(callStack, abcIndex, abc, new HashMap<>(), fullyQualifiedNames, new HashSet<>(), exportMode, swfVersion, usedDeobfuscations)); } } - getNameStr(writer, abc, fullyQualifiedNames); + getNameStr(writer, abc, fullyQualifiedNames, usedDeobfuscations); if (hasValueStr(abc, convertData)) { writer.appendNoHilight(" = "); - getValueStr(swfVersion, abcIndex, exportMode, convertData, writer, abc, fullyQualifiedNames); + getValueStr(usedDeobfuscations, swfVersion, abcIndex, exportMode, convertData, writer, abc, fullyQualifiedNames); } return writer.appendNoHilight(";").newLine(); } @Override - public void convert(int swfVersion, AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel, ScopeStack scopeStack) throws InterruptedException { - getNameStr(writer, abc, fullyQualifiedNames); + public void convert(Set usedDeobfuscations, int swfVersion, AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel, ScopeStack scopeStack) throws InterruptedException { + getNameStr(writer, abc, fullyQualifiedNames, usedDeobfuscations); if (hasValueStr(abc, convertData)) { - getValueStr(swfVersion, abcIndex, exportMode, convertData, writer, abc, fullyQualifiedNames); + getValueStr(usedDeobfuscations, swfVersion, abcIndex, exportMode, convertData, writer, abc, fullyQualifiedNames); } } @@ -317,29 +322,14 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { TraitSlotConst ret = (TraitSlotConst) super.clone(); return ret; } - - /** - * Gets dependencies. - * - * @param abcIndex ABC indexing - * @param scriptIndex Script index - * @param classIndex Class index - * @param isStatic Is static - * @param customNamespace Custom namespace - * @param abc ABC - * @param dependencies Dependencies - * @param ignorePackage Ignore package - * @param fullyQualifiedNames Fully qualified names - * @param uses Uses - * @throws InterruptedException On interrupt - */ + @Override - public void getDependencies(AbcIndexing abcIndex, int scriptIndex, int classIndex, boolean isStatic, String customNamespace, ABC abc, List dependencies, DottedChain ignorePackage, List fullyQualifiedNames, List uses, Reference numberContextRef) throws InterruptedException { + public void getDependencies(Set usedDeobfuscations, AbcIndexing abcIndex, int scriptIndex, int classIndex, boolean isStatic, String customNamespace, ABC abc, List dependencies, DottedChain ignorePackage, List fullyQualifiedNames, List uses, Reference numberContextRef) throws InterruptedException { if (ignorePackage == null) { ignorePackage = getPackage(abc); } - super.getDependencies(abcIndex, scriptIndex, classIndex, isStatic, customNamespace, abc, dependencies, ignorePackage, fullyQualifiedNames, uses, numberContextRef); - DependencyParser.parseDependenciesFromMultiname(abcIndex, customNamespace, abc, dependencies, abc.constants.getMultiname(type_index), getPackage(abc), fullyQualifiedNames, DependencyType.SIGNATURE, uses); + super.getDependencies(usedDeobfuscations, abcIndex, scriptIndex, classIndex, isStatic, customNamespace, abc, dependencies, ignorePackage, fullyQualifiedNames, uses, numberContextRef); + DependencyParser.parseDependenciesFromMultiname(usedDeobfuscations, abcIndex, customNamespace, abc, dependencies, abc.constants.getMultiname(type_index), getPackage(abc), fullyQualifiedNames, DependencyType.SIGNATURE, uses); } /** @@ -357,9 +347,9 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { Hide: private static var _skinParts (part of [SkinPart] compilations) */ - if (isStatic && "_skinParts".equals(getName(abc).getName(abc, abc.constants, new ArrayList<>(), true, true))) { + if (isStatic && "_skinParts".equals(getName(abc).getName(new LinkedHashSet<>(), abc, abc.constants, new ArrayList<>(), true, true))) { if (kindType == Trait.TRAIT_SLOT) { - if ("_skinParts".equals(getName(abc).getName(abc, abc.constants, new ArrayList<>(), true, true))) { + if ("_skinParts".equals(getName(abc).getName(new LinkedHashSet<>(), abc, abc.constants, new ArrayList<>(), true, true))) { if (getName(abc).getNamespace(abc.constants).kind == Namespace.KIND_PRIVATE) { return false; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java index 8b24eb6e9..c916d9207 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java @@ -31,6 +31,8 @@ import com.jpexs.helpers.Reference; import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import java.util.Locale; +import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; @@ -218,6 +220,15 @@ public class Traits implements Cloneable, Serializable { * Convert data */ ConvertData convertData; + + /** + * Used deobfuscations + */ + private final Set usedDeobfuscations; + + /** + * SWF version + */ private final int swfVersion; /** @@ -233,6 +244,7 @@ public class Traits implements Cloneable, Serializable { /** * Constructs a new TraitConvertTask object. * + * @param usedDeobfuscations Used deobfuscations * @param swfVersion SWF version * @param abcIndex ABC indexing * @param trait Trait @@ -251,7 +263,7 @@ public class Traits implements Cloneable, Serializable { * @param parallel Parallel flag * @param scopeStack Scope stack */ - public TraitConvertTask(int swfVersion, AbcIndexing abcIndex, Trait trait, Trait parent, ConvertData convertData, boolean makePackages, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, int traitIndex, boolean parallel, ScopeStack scopeStack) { + public TraitConvertTask(Set usedDeobfuscations, int swfVersion, AbcIndexing abcIndex, Trait trait, Trait parent, ConvertData convertData, boolean makePackages, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, int traitIndex, boolean parallel, ScopeStack scopeStack) { this.trait = trait; this.parent = parent; this.convertData = convertData; @@ -266,6 +278,7 @@ public class Traits implements Cloneable, Serializable { this.fullyQualifiedNames = fullyQualifiedNames; this.traitIndex = traitIndex; this.parallel = parallel; + this.usedDeobfuscations = usedDeobfuscations; this.swfVersion = swfVersion; this.abcIndex = abcIndex; this.scopeStack = scopeStack; @@ -280,9 +293,9 @@ public class Traits implements Cloneable, Serializable { @Override public Void call() throws InterruptedException { if (makePackages) { - trait.convertPackaged(swfVersion, abcIndex, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, scopeStack); + trait.convertPackaged(usedDeobfuscations, swfVersion, abcIndex, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, scopeStack); } else { - trait.convert(swfVersion, abcIndex, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, scopeStack); + trait.convert(usedDeobfuscations, swfVersion, abcIndex, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, scopeStack); } return null; } @@ -291,6 +304,7 @@ public class Traits implements Cloneable, Serializable { /** * To string. * + * @param usedDeobfuscations Used deobfuscations * @param swfVersion SWF version * @param packageName Package name * @param first Whether to add newline @@ -313,7 +327,7 @@ public class Traits implements Cloneable, Serializable { * @return Writer * @throws InterruptedException On interrupt */ - public GraphTextWriter toString(int swfVersion, DottedChain packageName, Reference first, AbcIndexing abcIndex, Class[] traitTypes, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, boolean makePackages, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, List ignoredTraitNames, boolean insideInterface) throws InterruptedException { + public GraphTextWriter toString(Set usedDeobfuscations, int swfVersion, DottedChain packageName, Reference first, AbcIndexing abcIndex, Class[] traitTypes, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, boolean makePackages, int scriptIndex, int classIndex, GraphTextWriter writer, List fullyQualifiedNames, boolean parallel, List ignoredTraitNames, boolean insideInterface) throws InterruptedException { List ordered = traits; for (Trait trait : ordered) { @@ -333,7 +347,7 @@ public class Traits implements Cloneable, Serializable { if (!trait.isVisible(isStatic, abc)) { continue; } - if (ignoredTraitNames.contains(trait.getName(abc).getName(abc, abc.constants, new ArrayList<>(), false, false))) { + if (ignoredTraitNames.contains(trait.getName(abc).getName(usedDeobfuscations, abc, abc.constants, new ArrayList<>(), false, false))) { continue; } @@ -348,9 +362,9 @@ public class Traits implements Cloneable, Serializable { int h = abc.getGlobalTraitId(TraitType.METHOD, isStatic, classIndex, t); writer.startTrait(h); if (makePackages) { - trait.toStringPackaged(swfVersion, abcIndex, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface); + trait.toStringPackaged(usedDeobfuscations, swfVersion, abcIndex, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface); } else { - trait.toString(swfVersion, abcIndex, packageName, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface); + trait.toString(usedDeobfuscations, swfVersion, abcIndex, packageName, parent, convertData, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, parallel, insideInterface); } writer.endTrait(); } @@ -360,6 +374,7 @@ public class Traits implements Cloneable, Serializable { /** * Converts traits. * + * @param usedDeobfuscations Used deobfuscations * @param swfVersion SWF version * @param abcIndex ABC indexing * @param parent Parent trait @@ -377,10 +392,10 @@ public class Traits implements Cloneable, Serializable { * @param scopeStack Scope stack * @throws InterruptedException On interrupt */ - public void convert(int swfVersion, AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, boolean makePackages, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel, ScopeStack scopeStack) throws InterruptedException { + public void convert(Set usedDeobfuscations, int swfVersion, AbcIndexing abcIndex, Trait parent, ConvertData convertData, String path, ABC abc, boolean isStatic, ScriptExportMode exportMode, boolean makePackages, int scriptIndex, int classIndex, NulWriter writer, List fullyQualifiedNames, boolean parallel, ScopeStack scopeStack) throws InterruptedException { if (!parallel || traits.size() < 2) { for (int t = 0; t < traits.size(); t++) { - TraitConvertTask task = new TraitConvertTask(swfVersion, abcIndex, traits.get(t), parent, convertData, makePackages, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, t, parallel, scopeStack); + TraitConvertTask task = new TraitConvertTask(usedDeobfuscations, swfVersion, abcIndex, traits.get(t), parent, convertData, makePackages, path, abc, isStatic, exportMode, scriptIndex, classIndex, writer, fullyQualifiedNames, t, parallel, scopeStack); task.call(); } } else { @@ -390,7 +405,7 @@ public class Traits implements Cloneable, Serializable { futureResults = new ArrayList<>(); for (int t = 0; t < traits.size(); t++) { // each convert task needs a separate NulWriter, because they are executed parallel - TraitConvertTask task = new TraitConvertTask(swfVersion, abcIndex, traits.get(t), parent, convertData, makePackages, path, abc, isStatic, exportMode, scriptIndex, classIndex, new NulWriter(), fullyQualifiedNames, t, parallel, scopeStack); + TraitConvertTask task = new TraitConvertTask(usedDeobfuscations, swfVersion, abcIndex, traits.get(t), parent, convertData, makePackages, path, abc, isStatic, exportMode, scriptIndex, classIndex, new NulWriter(), fullyQualifiedNames, t, parallel, scopeStack); Future future = executor.submit(task); futureResults.add(future); } @@ -435,6 +450,7 @@ public class Traits implements Cloneable, Serializable { /** * Gets dependencies. * + * @param usedDeobfuscations Used deobfuscations * @param abcIndex ABC indexing * @param scriptIndex Script index * @param classIndex Class index @@ -447,9 +463,9 @@ public class Traits implements Cloneable, Serializable { * @param uses Uses * @throws InterruptedException On interrupt */ - public void getDependencies(AbcIndexing abcIndex, int scriptIndex, int classIndex, boolean isStatic, String customNs, ABC abc, List dependencies, DottedChain ignorePackage, List fullyQualifiedNames, List uses, Reference numberContextRef) throws InterruptedException { + public void getDependencies(Set usedDeobfuscations, AbcIndexing abcIndex, int scriptIndex, int classIndex, boolean isStatic, String customNs, ABC abc, List dependencies, DottedChain ignorePackage, List fullyQualifiedNames, List uses, Reference numberContextRef) throws InterruptedException { for (Trait t : traits) { - t.getDependencies(abcIndex, scriptIndex, classIndex, isStatic, customNs, abc, dependencies, ignorePackage, fullyQualifiedNames, uses, numberContextRef); + t.getDependencies(usedDeobfuscations, abcIndex, scriptIndex, classIndex, isStatic, customNs, abc, dependencies, ignorePackage, fullyQualifiedNames, uses, numberContextRef); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/ClassNameMultinameUsage.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/ClassNameMultinameUsage.java index 165880933..d52a60794 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/ClassNameMultinameUsage.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/ClassNameMultinameUsage.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.abc.usages.multinames; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.types.InstanceInfo; +import java.util.LinkedHashSet; /** * Class name multiname usage. @@ -49,7 +50,7 @@ public class ClassNameMultinameUsage extends MultinameUsage implements Definitio public String toString() { InstanceInfo ii = abc.instance_info.get(classIndex); String kind = ii.isInterface() ? "interface" : "class"; - return kind + " " + ii.getName(abc.constants).getNameWithNamespace(abc, abc.constants, true).toPrintableString(abc.getSwf(), true) + " name"; + return kind + " " + ii.getName(abc.constants).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, true).toPrintableString(new LinkedHashSet<>(), abc.getSwf(), true) + " name"; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/ConstVarMultinameUsage.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/ConstVarMultinameUsage.java index 63a3d8c32..4e843a725 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/ConstVarMultinameUsage.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/ConstVarMultinameUsage.java @@ -27,6 +27,7 @@ import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; import com.jpexs.decompiler.flash.helpers.NulWriter; import com.jpexs.decompiler.graph.DottedChain; import java.util.ArrayList; +import java.util.LinkedHashSet; /** * Const or var multiname usage. @@ -56,13 +57,13 @@ public abstract class ConstVarMultinameUsage extends TraitMultinameUsage { ConvertData convertData = new ConvertData(); if (parentTraitIndex > -1) { if (traitsType == TRAITS_TYPE_CLASS) { - ((TraitMethodGetterSetter) abc.class_info.get(classIndex).static_traits.traits.get(parentTraitIndex)).convertHeader(-1, null, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, nulWriter, new ArrayList<>(), false); + ((TraitMethodGetterSetter) abc.class_info.get(classIndex).static_traits.traits.get(parentTraitIndex)).convertHeader(new LinkedHashSet<>(), -1, null, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, nulWriter, new ArrayList<>(), false); } else if (traitsType == TRAITS_TYPE_INSTANCE) { - ((TraitMethodGetterSetter) abc.instance_info.get(classIndex).instance_traits.traits.get(parentTraitIndex)).convertHeader(-1, null, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, nulWriter, new ArrayList<>(), false); + ((TraitMethodGetterSetter) abc.instance_info.get(classIndex).instance_traits.traits.get(parentTraitIndex)).convertHeader(new LinkedHashSet<>(), -1, null, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, nulWriter, new ArrayList<>(), false); } } try { - ((TraitSlotConst) traits.traits.get(traitIndex)).convertHeader(-1, null, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS /*?? FIXME*/, ScriptExportMode.AS, -1/*FIXME*/, classIndex, nulWriter, new ArrayList<>(), false); + ((TraitSlotConst) traits.traits.get(traitIndex)).convertHeader(new LinkedHashSet<>(), -1, null, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS /*?? FIXME*/, ScriptExportMode.AS, -1/*FIXME*/, classIndex, nulWriter, new ArrayList<>(), false); } catch (InterruptedException ex) { // ignore } @@ -76,13 +77,13 @@ public abstract class ConstVarMultinameUsage extends TraitMultinameUsage { if (parentTraitIndex > -1) { if (traitsType == TRAITS_TYPE_CLASS) { - ((TraitMethodGetterSetter) abc.class_info.get(classIndex).static_traits.traits.get(parentTraitIndex)).toStringHeader(-1, null, DottedChain.EMPTY /*??*/, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface); + ((TraitMethodGetterSetter) abc.class_info.get(classIndex).static_traits.traits.get(parentTraitIndex)).toStringHeader(new LinkedHashSet<>(), -1, null, DottedChain.EMPTY /*??*/, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface); } else if (traitsType == TRAITS_TYPE_INSTANCE) { - ((TraitMethodGetterSetter) abc.instance_info.get(classIndex).instance_traits.traits.get(parentTraitIndex)).toStringHeader(-1, null, DottedChain.EMPTY /*??*/, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface); + ((TraitMethodGetterSetter) abc.instance_info.get(classIndex).instance_traits.traits.get(parentTraitIndex)).toStringHeader(new LinkedHashSet<>(), -1, null, DottedChain.EMPTY /*??*/, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface); } } try { - ((TraitSlotConst) traits.traits.get(traitIndex)).toStringHeader(-1, null, DottedChain.EMPTY /*??*/, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface); + ((TraitSlotConst) traits.traits.get(traitIndex)).toStringHeader(new LinkedHashSet<>(), -1, null, DottedChain.EMPTY /*??*/, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface); } catch (InterruptedException ex) { // ignore } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/MethodMultinameUsage.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/MethodMultinameUsage.java index d46803bc6..39fa5c4ab 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/MethodMultinameUsage.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/MethodMultinameUsage.java @@ -26,6 +26,7 @@ import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; import com.jpexs.decompiler.flash.helpers.NulWriter; import com.jpexs.decompiler.graph.DottedChain; import java.util.ArrayList; +import java.util.LinkedHashSet; /** * Method multiname usage. @@ -70,12 +71,12 @@ public abstract class MethodMultinameUsage extends TraitMultinameUsage { if (!isInitializer) { if (parentTraitIndex > -1) { if (traitsType == TRAITS_TYPE_CLASS) { - ((TraitMethodGetterSetter) abc.class_info.get(classIndex).static_traits.traits.get(parentTraitIndex)).convertHeader(-1, null, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, nulWriter, new ArrayList<>(), false); + ((TraitMethodGetterSetter) abc.class_info.get(classIndex).static_traits.traits.get(parentTraitIndex)).convertHeader(new LinkedHashSet<>(), -1, null, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, nulWriter, new ArrayList<>(), false); } else { - ((TraitMethodGetterSetter) abc.instance_info.get(classIndex).instance_traits.traits.get(parentTraitIndex)).convertHeader(-1, null, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, nulWriter, new ArrayList<>(), false); + ((TraitMethodGetterSetter) abc.instance_info.get(classIndex).instance_traits.traits.get(parentTraitIndex)).convertHeader(new LinkedHashSet<>(), -1, null, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, nulWriter, new ArrayList<>(), false); } } - ((TraitMethodGetterSetter) traits.traits.get(traitIndex)).convertHeader(-1, null, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, nulWriter, new ArrayList<>(), false); + ((TraitMethodGetterSetter) traits.traits.get(traitIndex)).convertHeader(new LinkedHashSet<>(), -1, null, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, nulWriter, new ArrayList<>(), false); } HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), false); @@ -102,13 +103,13 @@ public abstract class MethodMultinameUsage extends TraitMultinameUsage { } if (parentTraitIndex > -1) { if (traitsType == TRAITS_TYPE_CLASS) { - ((TraitMethodGetterSetter) abc.class_info.get(classIndex).static_traits.traits.get(parentTraitIndex)).toStringHeader(-1, null, DottedChain.EMPTY /*??*/, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface); + ((TraitMethodGetterSetter) abc.class_info.get(classIndex).static_traits.traits.get(parentTraitIndex)).toStringHeader(new LinkedHashSet<>(), -1, null, DottedChain.EMPTY /*??*/, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface); } else { - ((TraitMethodGetterSetter) abc.instance_info.get(classIndex).instance_traits.traits.get(parentTraitIndex)).toStringHeader(-1, null, DottedChain.EMPTY /*??*/, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface); + ((TraitMethodGetterSetter) abc.instance_info.get(classIndex).instance_traits.traits.get(parentTraitIndex)).toStringHeader(new LinkedHashSet<>(), -1, null, DottedChain.EMPTY /*??*/, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface); } writer.appendNoHilight(" "); } - ((TraitMethodGetterSetter) traits.traits.get(traitIndex)).toStringHeader(-1, null, DottedChain.EMPTY /*??*/, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface); + ((TraitMethodGetterSetter) traits.traits.get(traitIndex)).toStringHeader(new LinkedHashSet<>(), -1, null, DottedChain.EMPTY /*??*/, convertData, "", abc, traitsType == TRAITS_TYPE_CLASS, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList<>(), false, insideInterface); } writer.finishHilights(); return writer.toString().trim(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/MultinameUsage.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/MultinameUsage.java index de42e862f..bd0248493 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/MultinameUsage.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/MultinameUsage.java @@ -21,6 +21,7 @@ import com.jpexs.decompiler.flash.abc.types.Multiname; import com.jpexs.decompiler.flash.abc.types.Namespace; import com.jpexs.decompiler.flash.abc.usages.Usage; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.Objects; /** @@ -86,8 +87,8 @@ public abstract class MultinameUsage implements Usage { return false; } if ((thisM.kind == Multiname.QNAME || thisM.kind == Multiname.QNAMEA) && otherM.kind == thisM.kind) { - String thisName = thisM.getName(abc, abc.constants, new ArrayList<>(), true, true); - String otherName = otherM.getName(other.abc, other.abc.constants, new ArrayList<>(), true, true); + String thisName = thisM.getName(new LinkedHashSet<>(), abc, abc.constants, new ArrayList<>(), true, true); + String otherName = otherM.getName(new LinkedHashSet<>(), other.abc, other.abc.constants, new ArrayList<>(), true, true); Namespace thisNs = thisM.getNamespace(abc.constants); Namespace otherNs = otherM.getNamespace(other.abc.constants); if (!Objects.equals(thisName, otherName)) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/SuperClassMultinameUsage.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/SuperClassMultinameUsage.java index 84b357a01..19fb9da16 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/SuperClassMultinameUsage.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/SuperClassMultinameUsage.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.abc.usages.multinames; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.types.InstanceInfo; +import java.util.LinkedHashSet; /** * Super class multiname usage. @@ -52,7 +53,7 @@ public class SuperClassMultinameUsage extends MultinameUsage implements InsideCl public String toString() { InstanceInfo ii = abc.instance_info.get(classIndex); String kind = ii.isInterface() ? "interface" : "class"; - return kind + " " + ii.getName(abc.constants).getNameWithNamespace(abc, abc.constants, true) + " extends"; + return kind + " " + ii.getName(abc.constants).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, true) + " extends"; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/SuperInterfaceMultinameUsage.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/SuperInterfaceMultinameUsage.java index d62c4447f..d56ab8768 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/SuperInterfaceMultinameUsage.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/SuperInterfaceMultinameUsage.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.abc.usages.multinames; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.types.InstanceInfo; +import java.util.LinkedHashSet; /** * Super interface multiname usage. @@ -52,7 +53,7 @@ public class SuperInterfaceMultinameUsage extends MultinameUsage implements Insi public String toString() { InstanceInfo ii = abc.instance_info.get(classIndex); String kind = ii.isInterface() ? "interface" : "class"; - return kind + " " + ii.getName(abc.constants).getNameWithNamespace(abc, abc.constants, true) + " " + (ii.isInterface() ? "extends" : "implements"); + return kind + " " + ii.getName(abc.constants).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, true) + " " + (ii.isInterface() ? "extends" : "implements"); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/TraitMultinameUsage.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/TraitMultinameUsage.java index 92c746ad4..21ac4843a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/TraitMultinameUsage.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/usages/multinames/TraitMultinameUsage.java @@ -20,6 +20,7 @@ import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.types.InstanceInfo; import com.jpexs.decompiler.flash.abc.types.traits.Traits; import com.jpexs.decompiler.graph.DottedChain; +import java.util.LinkedHashSet; import java.util.Objects; /** @@ -100,10 +101,10 @@ public abstract class TraitMultinameUsage extends MultinameUsage implements Insi if (classIndex != -1) { InstanceInfo ii = abc.instance_info.get(classIndex); String kind = ii.isInterface() ? "interface" : "class"; - return kind + " " + ii.getName(abc.constants).getNameWithNamespace(abc, abc.constants, true).toPrintableString(abc.getSwf(), true); + return kind + " " + ii.getName(abc.constants).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, true).toPrintableString(new LinkedHashSet<>(), abc.getSwf(), true); } - DottedChain scriptSimpleName = abc.script_info.get(scriptIndex).getSimplePackName(abc); - return "script " + (scriptSimpleName == null ? "" + scriptIndex : scriptSimpleName.toPrintableString(abc.getSwf(), true)); + DottedChain scriptSimpleName = abc.script_info.get(scriptIndex).getSimplePackName(abc, new LinkedHashSet<>()); + return "script " + (scriptSimpleName == null ? "" + scriptIndex : scriptSimpleName.toPrintableString(new LinkedHashSet<>(), abc.getSwf(), true)); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java index 7ba406edf..9212db367 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java @@ -87,9 +87,11 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -977,8 +979,9 @@ public abstract class Action implements GraphSourceItem { * @return Writer * @throws InterruptedException On interrupt */ - public static GraphTextWriter actionsToSource(Map> uninitializedClassTraits, final ASMSource asm, final List actions, final String path, GraphTextWriter writer, String charset, List treeOperations) throws InterruptedException { + public static GraphTextWriter actionsToSource(Map> uninitializedClassTraits, final ASMSource asm, final List actions, final String path, GraphTextWriter writer, String charset, List treeOperations) throws InterruptedException { writer.suspendMeasure(); + Set usedDeobfuscations = Collections.synchronizedSet(new LinkedHashSet<>()); List tree = null; Throwable convertException = null; int timeout = Configuration.decompilationTimeoutSingleMethod.get(); @@ -990,7 +993,7 @@ public abstract class Action implements GraphSourceItem { public List call() throws Exception { int staticOperation = 0; boolean insideDoInitAction = (asm instanceof DoInitActionTag); - List tree = actionsToTree(asm == null ? false : swf.needsCalculatingAS2UninitializeClassTraits(asm), uninitializedClassTraits, insideDoInitAction, false, new HashMap<>(), new HashMap<>(), new HashMap<>(), actions, version, staticOperation, path, charset); + List tree = actionsToTree(usedDeobfuscations, asm == null ? false : swf.needsCalculatingAS2UninitializeClassTraits(asm), uninitializedClassTraits, insideDoInitAction, false, new HashMap<>(), new HashMap<>(), new HashMap<>(), actions, version, staticOperation, path, charset); SWFDecompilerPlugin.fireActionTreeCreated(tree, swf); for (ActionTreeOperation treeOperation : treeOperations) { treeOperation.run(tree); @@ -1037,6 +1040,8 @@ public abstract class Action implements GraphSourceItem { if (asm != null) { asm.getActionSourceSuffix(writer); } + + //TODO: write the actual used deobfuscations !!! return writer; } @@ -1044,6 +1049,7 @@ public abstract class Action implements GraphSourceItem { /** * Converts list of actions to List of treeItems * + * @param usedDeobfuscations Used deobfuscations * @param needsUninitializedClassFieldsDetection Needs uninitialized class fields detection * @param uninitializedClassTraits Uninitialized class traits * @param insideDoInitAction Inside DoInitAction? @@ -1056,13 +1062,14 @@ public abstract class Action implements GraphSourceItem { * @return List of treeItems * @throws InterruptedException On interrupt */ - public static List actionsToTree(boolean needsUninitializedClassFieldsDetection, Map> uninitializedClassTraits, boolean insideDoInitAction, boolean insideFunction, List actions, int version, int staticOperation, String path, String charset) throws InterruptedException { - return actionsToTree(needsUninitializedClassFieldsDetection, uninitializedClassTraits, insideDoInitAction, insideFunction, new HashMap<>(), new HashMap<>(), new HashMap<>(), actions, version, staticOperation, path, charset); + public static List actionsToTree(Set usedDeobfuscations, boolean needsUninitializedClassFieldsDetection, Map> uninitializedClassTraits, boolean insideDoInitAction, boolean insideFunction, List actions, int version, int staticOperation, String path, String charset) throws InterruptedException { + return actionsToTree(usedDeobfuscations, needsUninitializedClassFieldsDetection, uninitializedClassTraits, insideDoInitAction, insideFunction, new HashMap<>(), new HashMap<>(), new HashMap<>(), actions, version, staticOperation, path, charset); } /** * Converts list of actions to List of treeItems. * + * @param usedDeobfuscations Used deobfuscations * @param needsUninitializedClassFieldsDetection Needs uninitialized class fields detection * @param uninitializedClassTraits Uninitialized class traits * @param insideDoInitAction Inside DoInitAction? @@ -1078,17 +1085,17 @@ public abstract class Action implements GraphSourceItem { * @return List of treeItems * @throws InterruptedException On interrupt */ - public static List actionsToTree(boolean needsUninitializedClassFieldsDetection, Map> uninitializedClassTraits, boolean insideDoInitAction, boolean insideFunction, HashMap regNames, HashMap variables, HashMap functions, List actions, int version, int staticOperation, String path, String charset) throws InterruptedException { + public static List actionsToTree(Set usedDeobfuscations, boolean needsUninitializedClassFieldsDetection, Map> uninitializedClassTraits, boolean insideDoInitAction, boolean insideFunction, HashMap regNames, HashMap variables, HashMap functions, List actions, int version, int staticOperation, String path, String charset) throws InterruptedException { HashMap variablesBackup = new LinkedHashMap<>(variables); HashMap functionsBackup = new LinkedHashMap<>(functions); try { - return ActionGraph.translateViaGraph(needsUninitializedClassFieldsDetection, uninitializedClassTraits, null, insideDoInitAction, insideFunction, regNames, variables, functions, fixActionsClassHeader(actions, needsUninitializedClassFieldsDetection, charset, path), version, staticOperation, path, charset, 0); + return ActionGraph.translateViaGraph(usedDeobfuscations, needsUninitializedClassFieldsDetection, uninitializedClassTraits, null, insideDoInitAction, insideFunction, regNames, variables, functions, fixActionsClassHeader(actions, needsUninitializedClassFieldsDetection, charset, path), version, staticOperation, path, charset, 0); } catch (SecondPassException spe) { variables.clear(); variables.putAll(variablesBackup); functions.clear(); functions.putAll(functionsBackup); - return ActionGraph.translateViaGraph(needsUninitializedClassFieldsDetection, uninitializedClassTraits, spe.getData(), insideDoInitAction, insideFunction, regNames, variables, functions, actions, version, staticOperation, path, charset, 0); + return ActionGraph.translateViaGraph(usedDeobfuscations, needsUninitializedClassFieldsDetection, uninitializedClassTraits, spe.getData(), insideDoInitAction, insideFunction, regNames, variables, functions, actions, version, staticOperation, path, charset, 0); } } @@ -1109,6 +1116,7 @@ public abstract class Action implements GraphSourceItem { /** * Translates this function to stack and output. * + * @param usedDeobfuscations Used deobfuscations * @param uninitializedClassTraits Uninitialized class traits * @param secondPassData Second pass data * @param insideDoInitAction Inside DoInitAction? @@ -1122,7 +1130,7 @@ public abstract class Action implements GraphSourceItem { * @param path the value of path * @throws InterruptedException On interrupt */ - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartIns, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartIns, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { } /** @@ -1138,7 +1146,7 @@ public abstract class Action implements GraphSourceItem { @Override public void translate(BaseLocalData localData, TranslateStack stack, List output, int staticOperation, String path) throws InterruptedException { ActionLocalData aLocalData = (ActionLocalData) localData; - translate(aLocalData.uninitializedClassTraits, aLocalData.secondPassData, aLocalData.insideDoInitAction, aLocalData.lineStartAction, stack, output, aLocalData.regNames, aLocalData.variables, aLocalData.functions, staticOperation, path); + translate(localData.usedDeobfuscations, aLocalData.uninitializedClassTraits, aLocalData.secondPassData, aLocalData.insideDoInitAction, aLocalData.lineStartAction, stack, output, aLocalData.regNames, aLocalData.variables, aLocalData.functions, staticOperation, path); } /** @@ -1225,6 +1233,7 @@ public abstract class Action implements GraphSourceItem { /** * Converts list of actions to tree. * + * @param usedDeobfuscations Used deobfuscations * @param output Output * @param graph ActionGraph * @param switchParts Switch parts @@ -1245,11 +1254,11 @@ public abstract class Action implements GraphSourceItem { * @throws InterruptedException On interrupt * @throws GraphPartChangeException On graph part change */ - public static void actionsPartToTree(List output, ActionGraph graph, Set switchParts, SecondPassData secondPassData, boolean insideDoInitAction, Reference lineStartActionRef, HashMap registerNames, HashMap variables, HashMap functions, TranslateStack stack, List actions, int start, int end, int version, int staticOperation, String path, String charset) throws InterruptedException, GraphPartChangeException { + public static void actionsPartToTree(Set usedDeobfuscations, List output, ActionGraph graph, Set switchParts, SecondPassData secondPassData, boolean insideDoInitAction, Reference lineStartActionRef, HashMap registerNames, HashMap variables, HashMap functions, TranslateStack stack, List actions, int start, int end, int version, int staticOperation, String path, String charset) throws InterruptedException, GraphPartChangeException { if (start < actions.size() && (end > 0) && (start > 0)) { logger.log(Level.FINE, "Entering {0}-{1}{2}", new Object[]{start, end, actions.size() > 0 ? (" (" + actions.get(start).toString() + " - " + actions.get(end == actions.size() ? end - 1 : end) + ")") : ""}); } - ActionLocalData localData = new ActionLocalData(switchParts, secondPassData, insideDoInitAction, registerNames, variables, functions, graph.getUninitializedClassTraits()); + ActionLocalData localData = new ActionLocalData(switchParts, secondPassData, insideDoInitAction, registerNames, variables, functions, graph.getUninitializedClassTraits(), usedDeobfuscations); localData.lineStartAction = lineStartActionRef.getVal(); int ip = start; boolean isWhile = false; @@ -1313,10 +1322,10 @@ public abstract class Action implements GraphSourceItem { } int startIp = adr2ip(actions, endAddr); try { - out = ActionGraph.translateViaGraph(graph.doesNeedUninitializedClassFieldsDetection(), graph.getUninitializedClassTraits(), null, insideDoInitAction, true, regNames, variables2, functions, actions.subList(0, adr2ip(actions, endAddr + size)), version, staticOperation, path + (cntName == null ? "" : "/" + cntName), charset, startIp); + out = ActionGraph.translateViaGraph(usedDeobfuscations, graph.doesNeedUninitializedClassFieldsDetection(), graph.getUninitializedClassTraits(), null, insideDoInitAction, true, regNames, variables2, functions, actions.subList(0, adr2ip(actions, endAddr + size)), version, staticOperation, path + (cntName == null ? "" : "/" + cntName), charset, startIp); } catch (SecondPassException spe) { variables2 = prepareVariables(cnt, variables); - out = ActionGraph.translateViaGraph(graph.doesNeedUninitializedClassFieldsDetection(), graph.getUninitializedClassTraits(), spe.getData(), insideDoInitAction, true, regNames, variables2, functions, actions.subList(0, adr2ip(actions, endAddr + size)), version, staticOperation, path + (cntName == null ? "" : "/" + cntName), charset, startIp); + out = ActionGraph.translateViaGraph(usedDeobfuscations, graph.doesNeedUninitializedClassFieldsDetection(), graph.getUninitializedClassTraits(), spe.getData(), insideDoInitAction, true, regNames, variables2, functions, actions.subList(0, adr2ip(actions, endAddr + size)), version, staticOperation, path + (cntName == null ? "" : "/" + cntName), charset, startIp); } } catch (OutOfMemoryError | TranslateException | StackOverflowError ex) { logger.log(Level.SEVERE, "Decompilation error in: " + path, ex); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java index e801aba5e..64d3e4b8f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -226,6 +226,7 @@ public class ActionGraph extends Graph { /** * Translates via Graph - decompiles. * + * @param usedDeobfuscations Used deobfuscations * @param needsUninitializedClassFieldsDetection Needs uninitialized class fields detection * @param uninitializedClassTraits Uninitialized class traits * @param secondPassData Second pass data @@ -242,9 +243,9 @@ public class ActionGraph extends Graph { * @return List of graph target items * @throws InterruptedException On interrupt */ - public static List translateViaGraph(boolean needsUninitializedClassFieldsDetection, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, boolean insideFunction, HashMap registerNames, HashMap variables, HashMap functions, List code, int version, int staticOperation, String path, String charset, int startIp) throws InterruptedException { + public static List translateViaGraph(Set usedDeobfuscations, boolean needsUninitializedClassFieldsDetection, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, boolean insideFunction, HashMap registerNames, HashMap variables, HashMap functions, List code, int version, int staticOperation, String path, String charset, int startIp) throws InterruptedException { ActionGraph g = new ActionGraph(needsUninitializedClassFieldsDetection, uninitializedClassTraits, path, insideDoInitAction, insideFunction, code, registerNames, variables, functions, version, charset, startIp); - ActionLocalData localData = new ActionLocalData(secondPassData, insideDoInitAction, registerNames, uninitializedClassTraits); + ActionLocalData localData = new ActionLocalData(secondPassData, insideDoInitAction, registerNames, uninitializedClassTraits, usedDeobfuscations); g.init(localData); return g.translate(localData, staticOperation, path); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java index eb0c2fcf9..b2b29bae7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java @@ -213,7 +213,7 @@ public class ActionGraphSource extends GraphSource { public void translatePart(List output, Graph graph, GraphPart part, BaseLocalData localData, TranslateStack stack, int start, int end, int staticOperation, String path) throws InterruptedException, GraphPartChangeException { Reference fi = new Reference<>(localData.lineStartInstruction); - Action.actionsPartToTree(output, (ActionGraph) graph, localData.allSwitchParts, localData.secondPassData, this.insideDoInitAction, fi, registerNames, variables, functions, stack, actions, start, end, version, staticOperation, path, charset); + Action.actionsPartToTree(localData.usedDeobfuscations, output, (ActionGraph) graph, localData.allSwitchParts, localData.secondPassData, this.insideDoInitAction, fi, registerNames, variables, functions, stack, actions, start, end, version, staticOperation, path, charset); localData.lineStartInstruction = fi.getVal(); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionIncorrectClassHeaderRemover.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionIncorrectClassHeaderRemover.java index 1fc5fb24f..21d20242c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionIncorrectClassHeaderRemover.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionIncorrectClassHeaderRemover.java @@ -38,6 +38,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; /** @@ -53,7 +54,7 @@ public class ActionIncorrectClassHeaderRemover extends SWFDecompilerAdapter { public void actionListParsed(ActionList actions, SWF swf) throws InterruptedException { FastActionList list = new FastActionList(actions); int ip = 0; - BaseLocalData ld = new ActionLocalData(null, true, new HashMap<>()); + BaseLocalData ld = new ActionLocalData(null, true, new HashMap<>(), new LinkedHashSet<>()); TranslateStack stack = new TranslateStack(""); List output = new ArrayList<>(); FastActionListIterator iterator = list.iterator(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionLocalData.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionLocalData.java index bcfa2ebfe..4fe8533ee 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionLocalData.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionLocalData.java @@ -71,13 +71,14 @@ public class ActionLocalData extends BaseLocalData { * @param insideDoInitAction Is inside doInitAction * @param uninitializedClassTraits Uninitialized class traits */ - public ActionLocalData(SecondPassData secondPassData, boolean insideDoInitAction, Map> uninitializedClassTraits) { + public ActionLocalData(SecondPassData secondPassData, boolean insideDoInitAction, Map> uninitializedClassTraits, Set usedDeobfuscations) { this.secondPassData = secondPassData; regNames = new HashMap<>(); variables = new HashMap<>(); functions = new HashMap<>(); this.insideDoInitAction = insideDoInitAction; this.uninitializedClassTraits = uninitializedClassTraits; + this.usedDeobfuscations = usedDeobfuscations; } /** @@ -88,13 +89,14 @@ public class ActionLocalData extends BaseLocalData { * @param regNames Register names * @param uninitializedClassTraits Uninitialized class traits */ - public ActionLocalData(SecondPassData secondPassData, boolean insideDoInitAction, HashMap regNames, Map> uninitializedClassTraits) { + public ActionLocalData(SecondPassData secondPassData, boolean insideDoInitAction, HashMap regNames, Map> uninitializedClassTraits, Set usedDeobfuscations) { this.regNames = regNames; this.secondPassData = secondPassData; variables = new HashMap<>(); functions = new HashMap<>(); this.insideDoInitAction = insideDoInitAction; this.uninitializedClassTraits = uninitializedClassTraits; + this.usedDeobfuscations = usedDeobfuscations; } /** @@ -108,7 +110,7 @@ public class ActionLocalData extends BaseLocalData { * @param functions Functions * @param uninitializedClassTraits Uninitialized class traits */ - public ActionLocalData(Set switchParts, SecondPassData secondPassData, boolean insideDoInitAction, HashMap regNames, HashMap variables, HashMap functions, Map> uninitializedClassTraits) { + public ActionLocalData(Set switchParts, SecondPassData secondPassData, boolean insideDoInitAction, HashMap regNames, HashMap variables, HashMap functions, Map> uninitializedClassTraits, Set usedDeobfuscations) { this.allSwitchParts = switchParts; this.regNames = regNames; this.variables = variables; @@ -116,5 +118,6 @@ public class ActionLocalData extends BaseLocalData { this.insideDoInitAction = insideDoInitAction; this.secondPassData = secondPassData; this.uninitializedClassTraits = uninitializedClassTraits; + this.usedDeobfuscations = usedDeobfuscations; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/StoreTypeAction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/StoreTypeAction.java index 08128ebf7..2df210281 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/StoreTypeAction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/StoreTypeAction.java @@ -19,6 +19,7 @@ package com.jpexs.decompiler.flash.action; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.action.model.ConstantPool; import com.jpexs.decompiler.graph.TranslateStack; +import java.util.Set; /** * Store type action interface. @@ -30,10 +31,11 @@ public interface StoreTypeAction { /** * Gets variable name. * + * @param usedDeobfuscations Used deobufscations * @param stack Stack * @param cpool Constant pool * @param swf SWF * @return Variable name */ - public String getVariableName(TranslateStack stack, ConstantPool cpool, SWF swf); + public String getVariableName(Set usedDeobfuscations, TranslateStack stack, ConstantPool cpool, SWF swf); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/as2/UninitializedClassFieldsDetector.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/as2/UninitializedClassFieldsDetector.java index 47bf051b2..95c27cad5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/as2/UninitializedClassFieldsDetector.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/as2/UninitializedClassFieldsDetector.java @@ -43,6 +43,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -71,7 +72,7 @@ public class UninitializedClassFieldsDetector { DoInitActionTag doi = (DoInitActionTag) asm; String exportName = doi.getSwf().getExportName(doi.spriteId); if (exportName != null) { - asmPath = DottedChain.parseNoSuffix(exportName).toPrintableString(doi.getSwf(), false); + asmPath = DottedChain.parseNoSuffix(exportName).toPrintableString(new LinkedHashSet<>(), doi.getSwf(), false); } } for (ProgressListener listener : progressListeners) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java index 557d4c1dd..30fa6ae24 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java @@ -29,6 +29,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * FSCommand2 action - file system command. @@ -51,7 +52,7 @@ public class ActionFSCommand2 extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { long numArgs = popLong(stack); List args = new ArrayList<>(); for (long l = 0; l < numArgs; l++) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java index 9e808196b..e043e5564 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java @@ -33,6 +33,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * StrictMode action - set strict mode. @@ -104,7 +105,7 @@ public class ActionStrictMode extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { if (mode != 1) { return; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/DirectValueActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/DirectValueActionItem.java index e2fb0ab06..48bc976dc 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/DirectValueActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/DirectValueActionItem.java @@ -142,7 +142,7 @@ public class DirectValueActionItem extends ActionItem implements SimpleValue { } if (value instanceof RegisterNumber) { - return IdentifiersDeobfuscation.printIdentifier(localData.swf, false, ((RegisterNumber) value).translate()); + return IdentifiersDeobfuscation.printIdentifier(localData.swf, localData.usedDeobfuscations, false, ((RegisterNumber) value).translate()); } return value.toString(); @@ -164,7 +164,7 @@ public class DirectValueActionItem extends ActionItem implements SimpleValue { } if (value instanceof RegisterNumber) { - return writer.append(IdentifiersDeobfuscation.printIdentifier(localData.swf, false, ((RegisterNumber) value).translate())); + return writer.append(IdentifiersDeobfuscation.printIdentifier(localData.swf, localData.usedDeobfuscations, false, ((RegisterNumber) value).translate())); } return writer.append(value.toString()); @@ -197,7 +197,7 @@ public class DirectValueActionItem extends ActionItem implements SimpleValue { srcData.localName = ((RegisterNumber) value).translate(); srcData.regIndex = ((RegisterNumber) value).number; - return writer.appendWithData(IdentifiersDeobfuscation.printIdentifier(localData.swf, false, ((RegisterNumber) value).translate()), srcData); + return writer.appendWithData(IdentifiersDeobfuscation.printIdentifier(localData.swf, localData.usedDeobfuscations, false, ((RegisterNumber) value).translate()), srcData); } return writer.append(EcmaScript.toString(value)); } 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 2b9172c80..d9d622dc5 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 @@ -82,7 +82,7 @@ public class GetMemberActionItem extends ActionItem { StringBuilder sb = new StringBuilder(); StringBuilderTextWriter sbw = new StringBuilderTextWriter(new CodeFormatting(), sb); stripQuotes(memberName, localData, sbw); - writer.append(IdentifiersDeobfuscation.printIdentifier(localData.swf, false, sb.toString())); + writer.append(IdentifiersDeobfuscation.printIdentifier(localData.swf, localData.usedDeobfuscations, false, sb.toString())); return writer; } if (((!(memberName instanceof DirectValueActionItem)) || (!((DirectValueActionItem) memberName).isString()) || (!printObfuscatedMemberName && !IdentifiersDeobfuscation.isValidName(false, ((DirectValueActionItem) memberName).toStringNoQuotes(localData))))) { 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 a54b981f7..c5b2bedb2 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 @@ -102,7 +102,7 @@ public class GetVariableActionItem extends ActionItem { StringBuilder sb = new StringBuilder(); StringBuilderTextWriter sbw = new StringBuilderTextWriter(new CodeFormatting(), sb); stripQuotes(name, localData, sbw); - writer.append(IdentifiersDeobfuscation.printIdentifier(localData.swf, false, sb.toString())); + writer.append(IdentifiersDeobfuscation.printIdentifier(localData.swf, localData.usedDeobfuscations, false, sb.toString())); return writer; } if ((name instanceof DirectValueActionItem) && (((DirectValueActionItem) name).isString()) && (printObfuscatedName || IdentifiersDeobfuscation.isValidNameWithDot(false, ((DirectValueActionItem) name).toStringNoQuotes(localData), "this", "super"))) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/InitObjectActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/InitObjectActionItem.java index b63f05c64..eea7891d2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/InitObjectActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/InitObjectActionItem.java @@ -81,7 +81,7 @@ public class InitObjectActionItem extends ActionItem { //AS1/2 does not allow quotes in name here if ((names.get(i) instanceof DirectValueActionItem) && (((DirectValueActionItem) names.get(i)).isSimpleValue())) { - writer.append(IdentifiersDeobfuscation.printIdentifier(localData.swf, false, names.get(i).toStringNoQuotes(localData))); + writer.append(IdentifiersDeobfuscation.printIdentifier(localData.swf, localData.usedDeobfuscations, false, names.get(i).toStringNoQuotes(localData))); } else { writer.append("("); names.get(i).appendTo(writer, localData); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/NewObjectActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/NewObjectActionItem.java index f7b4453d3..3d54ef0ba 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/NewObjectActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/NewObjectActionItem.java @@ -70,7 +70,7 @@ public class NewObjectActionItem extends ActionItem { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { writer.append("new "); - writer.append(IdentifiersDeobfuscation.printIdentifier(localData.swf, false, objectName.toStringNoQuotes(localData))); + writer.append(IdentifiersDeobfuscation.printIdentifier(localData.swf, localData.usedDeobfuscations, false, objectName.toStringNoQuotes(localData))); writer.spaceBeforeCallParenthesis(arguments.size()); writer.append("("); for (int t = 0; t < arguments.size(); t++) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/SetVariableActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/SetVariableActionItem.java index 62e64ccef..1a4a8b841 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/SetVariableActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/SetVariableActionItem.java @@ -130,7 +130,7 @@ public class SetVariableActionItem extends ActionItem implements SetTypeActionIt //TODO: handle result needed better, without identifierdeobfuscation HighlightData srcData = getSrcData(); srcData.localName = name.toStringNoQuotes(localData); - writer.append(IdentifiersDeobfuscation.printIdentifier(localData.swf, false, name.toStringNoQuotes(localData))); + writer.append(IdentifiersDeobfuscation.printIdentifier(localData.swf, localData.usedDeobfuscations, false, name.toStringNoQuotes(localData))); if (compoundOperator != null) { writer.append(" "); writer.append(compoundOperator); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/StoreRegisterActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/StoreRegisterActionItem.java index 05a0e7201..fffb742b1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/StoreRegisterActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/StoreRegisterActionItem.java @@ -126,7 +126,7 @@ public class StoreRegisterActionItem extends ActionItem implements SetTypeAction srcData.declaredType = DottedChain.ALL; writer.append("var "); } - writer.append(IdentifiersDeobfuscation.printIdentifier(localData.swf, false, register.translate())); + writer.append(IdentifiersDeobfuscation.printIdentifier(localData.swf, localData.usedDeobfuscations, false, register.translate())); if (compoundOperator != null) { writer.append(" "); 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 0eec9c66f..dbd8c638f 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 @@ -250,7 +250,7 @@ public class ClassActionItem extends ActionItem implements Block { item.getValue().toString(writer, localData).newLine(); } else { writer.append("var "); - writer.append(IdentifiersDeobfuscation.printIdentifier(localData.swf, false, item.getKey().toStringNoQuotes(localData))); + writer.append(IdentifiersDeobfuscation.printIdentifier(localData.swf, localData.usedDeobfuscations, false, item.getKey().toStringNoQuotes(localData))); if (item.getValue() != null) { writer.append(" = "); item.getValue().toString(writer, localData); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java index 23f5d811e..5775efae9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java @@ -173,6 +173,7 @@ import java.io.StringReader; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -2061,7 +2062,7 @@ public class ActionScript2Parser { } private boolean isCastOp(GraphTargetItem item) { - LocalData localData = LocalData.create(new ConstantPool(constantPool), this.swf); + LocalData localData = LocalData.create(new ConstantPool(constantPool), this.swf, new LinkedHashSet<>()); List items = new ArrayList<>(); while (item instanceof GetMemberActionItem) { GetMemberActionItem mem = (GetMemberActionItem) item; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionEnd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionEnd.java index e8ba71aa0..7cba01b17 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionEnd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionEnd.java @@ -27,6 +27,7 @@ import com.jpexs.decompiler.graph.TranslateStack; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * End action. @@ -61,7 +62,7 @@ public class ActionEnd extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { //output.add(new SimpleActionTreeItem(this, "end()")); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java index cb95dc82f..ffc45f5c7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java @@ -26,6 +26,7 @@ import com.jpexs.decompiler.graph.TranslateStack; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Nop action. @@ -62,7 +63,7 @@ public class ActionNop extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { //output.add(new SimpleActionTreeItem(this, "nop();")); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionUnknown.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionUnknown.java index 651d419c5..bae794780 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionUnknown.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionUnknown.java @@ -26,6 +26,7 @@ import com.jpexs.helpers.Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Unknown action. @@ -56,6 +57,6 @@ public class ActionUnknown extends ActionNop { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java index 01f7e0d20..2e8d10afd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java @@ -41,6 +41,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * GetURL action - Gets a URL. @@ -129,7 +130,7 @@ public class ActionGetURL extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { String fsCommandPrefix = "FSCommand:"; if (urlString.startsWith(fsCommandPrefix)) { String command = urlString.substring(fsCommandPrefix.length()); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java index e04d969b2..9f9f42ace 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java @@ -36,6 +36,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * GoToLabel action - Jumps to a label in the current timeline. @@ -113,7 +114,7 @@ public class ActionGoToLabel extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new GotoLabelActionItem(this, lineStartAction, label)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java index 6cdb880ad..32b088413 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java @@ -34,6 +34,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * GotoFrame action - Jumps to a frame in the current timeline. @@ -109,7 +110,7 @@ public class ActionGotoFrame extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new GotoFrameActionItem(this, lineStartAction, frame)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java index c2aede13a..517fa3fe9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * NextFrame action - Jumps to the next frame in the current timeline. @@ -62,7 +63,7 @@ public class ActionNextFrame extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new NextFrameActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java index ef74dc8d0..18077c1f9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java @@ -33,6 +33,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Play action - Plays the current timeline. @@ -61,7 +62,7 @@ public class ActionPlay extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { if (!output.isEmpty() && (output.get(output.size() - 1) instanceof GotoFrameActionItem)) { GotoFrameActionItem gta = (GotoFrameActionItem) output.remove(output.size() - 1); output.add(new GotoFrame2ActionItem(this, lineStartAction, new DirectValueActionItem(gta.frame + 1), false, true, 0)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java index 9b4a41c43..96a6f202b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * PrevFrame action - Jumps to the previous frame in the current timeline. @@ -62,7 +63,7 @@ public class ActionPrevFrame extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new PrevFrameActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java index 56a30c6a5..281fbec54 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java @@ -35,6 +35,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * SetTarget action - Sets the target for the following actions. @@ -120,7 +121,7 @@ public class ActionSetTarget extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new SetTargetActionItem(this, lineStartAction, targetName)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java index 05979e7f4..40aaf516e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Stop action - Stops the current timeline. @@ -58,7 +59,7 @@ public class ActionStop extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new StopActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java index 46a91225b..3bd91e6d4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java @@ -29,6 +29,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * StopSounds action - Stops all sounds. @@ -57,7 +58,7 @@ public class ActionStopSounds extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new StopAllSoundsActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java index bf10f078d..2cb8e1dfe 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java @@ -29,6 +29,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * ToggleQuality action - Toggles the quality of the Flash Player. @@ -57,7 +58,7 @@ public class ActionToggleQuality extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new ToggleHighQualityActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java index f9915506d..e60bc6e0b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java @@ -129,20 +129,20 @@ public class ActionWaitForFrame extends Action implements ActionStore { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { GraphTargetItem frameTi = new DirectValueActionItem(null, null, 0, (Long) ((long) frame), new ArrayList<>()); List body; HashMap variablesBackup = new LinkedHashMap<>(variables); HashMap functionsBackup = new LinkedHashMap<>(functions); try { - body = ActionGraph.translateViaGraph(false, uninitializedClassTraits, null, insideDoInitAction, true, regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path, getCharset(), 0); + body = ActionGraph.translateViaGraph(usedDeobfuscations, false, uninitializedClassTraits, null, insideDoInitAction, true, regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path, getCharset(), 0); } catch (SecondPassException spe) { variables.clear(); variables.putAll(variablesBackup); functions.clear(); functions.putAll(functionsBackup); - body = ActionGraph.translateViaGraph(false, uninitializedClassTraits, spe.getData(), insideDoInitAction, true, regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path, getCharset(), 0); + body = ActionGraph.translateViaGraph(usedDeobfuscations, false, uninitializedClassTraits, spe.getData(), insideDoInitAction, true, regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path, getCharset(), 0); } output.add(new IfFrameLoadedActionItem(frameTi, body, this, lineStartAction)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAdd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAdd.java index daa4801c3..01272343b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAdd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAdd.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Add action - Adds two numbers together. @@ -62,7 +63,7 @@ public class ActionAdd extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new AddActionItem(this, lineStartAction, b, a, false)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAnd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAnd.java index 5c1fb7c24..693a6d24d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAnd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAnd.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * And action - Logical AND operation. @@ -62,7 +63,7 @@ public class ActionAnd extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new AndActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAsciiToChar.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAsciiToChar.java index 815f3e786..304a570ff 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAsciiToChar.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAsciiToChar.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * AsciiToChar action - Converts an ASCII code to a character. @@ -62,7 +63,7 @@ public class ActionAsciiToChar extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new AsciiToCharActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java index b0d473300..382a60209 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java @@ -31,6 +31,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Call action - Calls a frame. @@ -73,7 +74,7 @@ public class ActionCall extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new CallActionItem(this, lineStartAction, stack.pop())); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCharToAscii.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCharToAscii.java index 44212c3f1..0a09fff4c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCharToAscii.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCharToAscii.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * CharToAscii action - Converts a character to an ASCII code. @@ -62,7 +63,7 @@ public class ActionCharToAscii extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new CharToAsciiActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java index b2a6dc814..29460552a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java @@ -33,6 +33,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * CloneSprite action - Clones a sprite. @@ -72,7 +73,7 @@ public class ActionCloneSprite extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem depth = stack.pop(); GraphTargetItem source = stack.pop(); GraphTargetItem target = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionDivide.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionDivide.java index 326317f85..c92b5ac80 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionDivide.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionDivide.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Divide action - Divides two numbers. @@ -62,7 +63,7 @@ public class ActionDivide extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new DivideActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java index 86a6bbb21..4cecb0cc3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * EndDrag action - Stops dragging a movie clip. @@ -61,7 +62,7 @@ public class ActionEndDrag extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new StopDragActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEquals.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEquals.java index 712c506c8..02cb6ffad 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEquals.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEquals.java @@ -29,6 +29,7 @@ import com.jpexs.decompiler.graph.TranslateStack; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Equals action - Compares two values for equality. @@ -40,6 +41,7 @@ public class ActionEquals extends Action { /** * Constructor. + * * @param charset Charset */ public ActionEquals(String charset) { @@ -62,7 +64,7 @@ public class ActionEquals extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new EqActionItem(this, lineStartAction, b, a, false)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java index c462c147e..d81cda6ec 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java @@ -34,6 +34,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -75,7 +76,7 @@ public class ActionGetProperty extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem index = stack.pop(); GraphTargetItem target = stack.pop(); int indexInt = 0; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java index 3d36e07eb..053552a63 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * GetTime action - Returns the current time in milliseconds. @@ -58,7 +59,7 @@ public class ActionGetTime extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { stack.push(new GetTimeActionItem(this, lineStartAction)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java index 1235c5a20..fe0c85cdf 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java @@ -51,6 +51,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * GetURL2 action - Gets a URL, stack-based. @@ -189,7 +190,7 @@ public class ActionGetURL2 extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem targetString = stack.pop(); GraphTargetItem urlString = stack.pop(); GraphTargetItem num = null; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetVariable.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetVariable.java index efcbf47ab..b0e4d39d2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetVariable.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetVariable.java @@ -36,6 +36,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * GetVariable action - Gets a variable. @@ -73,7 +74,7 @@ public class ActionGetVariable extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem name = stack.pop(); String nameStr; if (name instanceof DirectValueActionItem) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java index 40a25dd60..4524ce39f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java @@ -37,6 +37,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * GotoFrame2 action - Goes to a frame, stack-based. @@ -66,6 +67,7 @@ public class ActionGotoFrame2 extends Action { /** * Constructor. + * * @param playFlag Play flag * @param sceneBiasFlag Scene bias flag * @param sceneBias Scene bias @@ -80,6 +82,7 @@ public class ActionGotoFrame2 extends Action { /** * Constructor. + * * @param actionLength Action length * @param sis SWF input stream * @throws IOException On I/O error @@ -126,6 +129,7 @@ public class ActionGotoFrame2 extends Action { /** * Constructor. + * * @param lexer Lexer * @param charset Charset * @throws IOException On I/O error @@ -179,7 +183,7 @@ public class ActionGotoFrame2 extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem frame = stack.pop(); output.add(new GotoFrame2ActionItem(this, lineStartAction, frame, sceneBiasFlag, playFlag, sceneBias)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionIf.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionIf.java index 8651f142c..1dd54d484 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionIf.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionIf.java @@ -83,6 +83,7 @@ public class ActionIf extends Action { /** * Constructor + * * @param offset Offset * @param charset Charset */ @@ -93,6 +94,7 @@ public class ActionIf extends Action { /** * Constructor + * * @param actionLength Action length * @param sis SWF input stream * @throws IOException On I/O error @@ -109,6 +111,7 @@ public class ActionIf extends Action { /** * Gets the target address + * * @return Address */ public long getTargetAddress() { @@ -139,6 +142,7 @@ public class ActionIf extends Action { /** * Constructor + * * @param lexer Lexer * @param charset Charset * @throws IOException On I/O error @@ -179,7 +183,7 @@ public class ActionIf extends Action { long targetAddress = getTargetAddress(); int jmp = code.adr2pos(targetAddress); int after = code.adr2pos(getAddress() + length); - if (jmp == -1) { + if (jmp == -1) { Logger.getLogger(ActionIf.class.getName()).log(Level.SEVERE, "Invalid IF jump to ofs{0} from ofs{1} in {2}", new Object[]{Helper.formatAddress(targetAddress), Helper.formatAddress(getAddress()), ((ActionGraphSource) code).getPath()}); ret.add(after); } else { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionJump.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionJump.java index 3207c5a5c..d3c7648d3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionJump.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionJump.java @@ -64,6 +64,7 @@ public class ActionJump extends Action { /** * Gets the jump offset + * * @return Offset */ public int getJumpOffset() { @@ -72,6 +73,7 @@ public class ActionJump extends Action { /** * Sets the jump offset + * * @param offset Offset */ public final void setJumpOffset(int offset) { @@ -80,6 +82,7 @@ public class ActionJump extends Action { /** * Constructor + * * @param offset Offset * @param charset Charset */ @@ -90,6 +93,7 @@ public class ActionJump extends Action { /** * Constructor + * * @param actionLength Action length * @param sis SWF input stream * @throws IOException On I/O error @@ -106,6 +110,7 @@ public class ActionJump extends Action { /** * Gets the target address + * * @return Address */ public long getTargetAddress() { @@ -136,6 +141,7 @@ public class ActionJump extends Action { /** * Constructor + * * @param lexer Lexer * @param charset Charset * @throws IOException On I/O error @@ -169,7 +175,7 @@ public class ActionJump extends Action { int ofs = code.adr2pos(targetAddress); if (ofs == -1) { int length = getBytesLength(); - ofs = code.adr2pos(getAddress() + length); + ofs = code.adr2pos(getAddress() + length); Logger.getLogger(ActionJump.class.getName()).log(Level.SEVERE, "Invalid jump to ofs{0} from ofs{1} in {2}", new Object[]{Helper.formatAddress(targetAddress), Helper.formatAddress(getAddress()), ((ActionGraphSource) code).getPath()}); } ret.add(ofs); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionLess.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionLess.java index 1e920a4fd..8ef7b95dd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionLess.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionLess.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Less action - Less than. @@ -62,7 +63,7 @@ public class ActionLess extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new LtActionItem(this, lineStartAction, b, a, false)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBAsciiToChar.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBAsciiToChar.java index d9abbb37d..340ee82e2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBAsciiToChar.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBAsciiToChar.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * MBAsciiToChar action - Converts a multibyte ASCII character to a Unicode @@ -63,7 +64,7 @@ public class ActionMBAsciiToChar extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new MBAsciiToCharActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBCharToAscii.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBCharToAscii.java index 36043733b..f331e8f88 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBCharToAscii.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBCharToAscii.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * MBCharToAscii action - Converts a multibyte character to an ASCII character. @@ -62,7 +63,7 @@ public class ActionMBCharToAscii extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new MBCharToAsciiActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringExtract.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringExtract.java index a89913075..4e42bb135 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringExtract.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringExtract.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * MBStringExtract action - Extracts a substring from a multibyte string. @@ -62,7 +63,7 @@ public class ActionMBStringExtract extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem count = stack.pop(); GraphTargetItem index = stack.pop(); GraphTargetItem value = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringLength.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringLength.java index 02121afc5..d42992e1d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringLength.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringLength.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * MBStringLength action - Returns the number of characters in a multibyte @@ -63,7 +64,7 @@ public class ActionMBStringLength extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new MBStringLengthActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMultiply.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMultiply.java index fce188eea..864b98a26 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMultiply.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMultiply.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Multiply action - Multiplies two numbers. @@ -62,7 +63,7 @@ public class ActionMultiply extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new MultiplyActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java index a30919abd..27d066b0e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Not action - Logical NOT. @@ -62,7 +63,7 @@ public class ActionNot extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(a.invert(this)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionOr.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionOr.java index 64144c129..6b59030e8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionOr.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionOr.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Or action - Logical OR. @@ -62,7 +63,7 @@ public class ActionOr extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new OrActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java index 19dfe7dd9..a89be25a3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Pop action - Removes the top item from the stack. @@ -62,7 +63,7 @@ public class ActionPop extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem val = stack.pop(); if (val instanceof AnyItem) { return; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java index e19980868..57221205c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java @@ -56,6 +56,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.Set; /** * Push action - Pushes values onto the stack. @@ -376,6 +377,7 @@ public class ActionPush extends Action { /** * Converts the parameters to string - use replacements when available. + * * @param container Container * @param knownAddresses Known addresses * @param exportMode Export mode @@ -395,6 +397,7 @@ public class ActionPush extends Action { /** * To string without quotes. + * * @param i Index * @return String */ @@ -431,6 +434,7 @@ public class ActionPush extends Action { /** * Converts the parameter to string. + * * @param i Index * @return String */ @@ -451,7 +455,7 @@ public class ActionPush extends Action { if (value instanceof Float) { fdString += "f"; } - ret = fdString; + ret = fdString; } else { ret = value.toString(); } @@ -468,6 +472,7 @@ public class ActionPush extends Action { /** * To string. + * * @param writer Writer * @return Writer */ @@ -500,7 +505,7 @@ public class ActionPush extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { int pos = 0; for (Object o : values) { GraphTargetItem toPush = null; @@ -547,7 +552,7 @@ public class ActionPush extends Action { } toPush.setPos(pos); stack.push(toPush); - pos++; + pos++; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java index ad5c9e092..8daa1932b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * RandomNumber action - Generates a random number. @@ -62,7 +63,7 @@ public class ActionRandomNumber extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem maximum = stack.pop(); stack.push(new RandomNumberActionItem(this, lineStartAction, maximum)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java index a96fddba8..c3f443a10 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java @@ -31,6 +31,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * RemoveSprite action - Removes a sprite from the display list. @@ -64,7 +65,7 @@ public class ActionRemoveSprite extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem target = stack.pop(); output.add(new RemoveSpriteActionItem(this, lineStartAction, target)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java index 9dfeed970..cf48c7caa 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java @@ -42,6 +42,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -82,7 +83,7 @@ public class ActionSetProperty extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop().getThroughDuplicate(); GraphTargetItem index = stack.pop().getThroughDuplicate(); GraphTargetItem target = stack.pop().getThroughDuplicate(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java index 98e51aa84..67f794675 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java @@ -29,6 +29,7 @@ import com.jpexs.decompiler.graph.TranslateStack; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * SetTarget2 action - Sets the target for the next action, stack-based. @@ -40,6 +41,7 @@ public class ActionSetTarget2 extends Action { /** * Constructor. + * * @param charset Charset */ public ActionSetTarget2(String charset) { @@ -63,7 +65,7 @@ public class ActionSetTarget2 extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem target = stack.pop(); output.add(new SetTarget2ActionItem(this, lineStartAction, target)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java index cf0a87a35..18837150e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java @@ -48,6 +48,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * SetVariable action - Sets a variable value. @@ -81,7 +82,7 @@ public class ActionSetVariable extends Action implements StoreTypeAction { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop().getThroughDuplicate(); GraphTargetItem name = stack.pop(); String nameStr; @@ -197,10 +198,10 @@ public class ActionSetVariable extends Action implements StoreTypeAction { } @Override - public String getVariableName(TranslateStack stack, ConstantPool cpool, SWF swf) { + public String getVariableName(Set usedDeobfuscations, TranslateStack stack, ConstantPool cpool, SWF swf) { if (stack.size() < 2) { return null; } - return stack.get(stack.size() - 2).toStringNoQuotes(LocalData.create(cpool, swf)); + return stack.get(stack.size() - 2).toStringNoQuotes(LocalData.create(cpool, swf, usedDeobfuscations)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java index ede54a307..db5afd83f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java @@ -34,6 +34,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * StartDrag action - Starts dragging a movie clip. @@ -65,7 +66,7 @@ public class ActionStartDrag extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem target = stack.pop(); GraphTargetItem lockCenter = stack.pop(); GraphTargetItem constrain = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringAdd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringAdd.java index 96f8491ef..80b8482d5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringAdd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringAdd.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * StringAdd action - Concatenates two strings. @@ -62,7 +63,7 @@ public class ActionStringAdd extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StringAddActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringEquals.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringEquals.java index 2b8bee3bf..4797ca260 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringEquals.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringEquals.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * StringEquals action - Compares two strings. @@ -62,7 +63,7 @@ public class ActionStringEquals extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StringEqActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringExtract.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringExtract.java index da51d62f4..5878c6809 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringExtract.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringExtract.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * StringExtract action - Extracts a substring from a string. @@ -62,7 +63,7 @@ public class ActionStringExtract extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem count = stack.pop(); GraphTargetItem index = stack.pop(); GraphTargetItem value = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLength.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLength.java index 9471fd9ee..b5d083748 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLength.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLength.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * StringLength action - Gets the length of a string. @@ -62,7 +63,7 @@ public class ActionStringLength extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new StringLengthActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLess.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLess.java index 8b6b7ace4..00b92f494 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLess.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLess.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * StringLess action - Compares two strings - less than. @@ -62,7 +63,7 @@ public class ActionStringLess extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StringLtActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSubtract.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSubtract.java index 7fb6cd019..9f12ba01d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSubtract.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSubtract.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Subtract action - Subtracts two numbers. @@ -62,7 +63,7 @@ public class ActionSubtract extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new SubtractActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionToInteger.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionToInteger.java index 2cf3f89ad..c3f212690 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionToInteger.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionToInteger.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * ToInteger action - Converts a value to an integer. @@ -62,7 +63,7 @@ public class ActionToInteger extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new ToIntegerActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java index 96f9a9fa9..2b02b82f7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Trace action - Outputs a string to the debugger. @@ -62,7 +63,7 @@ public class ActionTrace extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop(); output.add(new TraceActionItem(this, lineStartAction, value)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java index 8e77f8492..eef0d908c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java @@ -43,6 +43,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.Set; /** * WaitForFrame2 action - Waits for a frame to be loaded, stack-based. @@ -64,6 +65,7 @@ public class ActionWaitForFrame2 extends Action implements ActionStore { /** * Constructor. + * * @param skipCount Number of actions to skip * @param charset Charset */ @@ -86,6 +88,7 @@ public class ActionWaitForFrame2 extends Action implements ActionStore { /** * Constructor. + * * @param actionLength Action length * @param sis SWF input stream * @throws IOException On I/O error @@ -126,6 +129,7 @@ public class ActionWaitForFrame2 extends Action implements ActionStore { /** * Constructor. + * * @param lexer Flasm lexer * @param charset Charset * @throws IOException On I/O error @@ -176,19 +180,19 @@ public class ActionWaitForFrame2 extends Action implements ActionStore { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { GraphTargetItem frame = stack.pop(); List body; HashMap variablesBackup = new LinkedHashMap<>(variables); HashMap functionsBackup = new LinkedHashMap<>(functions); try { - body = ActionGraph.translateViaGraph(false, uninitializedClassTraits, null, insideDoInitAction, true, regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path, getCharset(), 0); + body = ActionGraph.translateViaGraph(usedDeobfuscations, false, uninitializedClassTraits, null, insideDoInitAction, true, regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path, getCharset(), 0); } catch (SecondPassException spe) { variables.clear(); variables.putAll(variablesBackup); functions.clear(); functions.putAll(functionsBackup); - body = ActionGraph.translateViaGraph(false, uninitializedClassTraits, spe.getData(), insideDoInitAction, true, regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path, getCharset(), 0); + body = ActionGraph.translateViaGraph(usedDeobfuscations, false, uninitializedClassTraits, spe.getData(), insideDoInitAction, true, regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path, getCharset(), 0); } output.add(new IfFrameLoadedActionItem(frame, body, this, lineStartAction)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionAdd2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionAdd2.java index b099e1d58..b7596045b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionAdd2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionAdd2.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Add2 action - Add two numbers or strings together. @@ -62,7 +63,7 @@ public class ActionAdd2 extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new AddActionItem(this, lineStartAction, b, a, true)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitAnd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitAnd.java index 0043b0e70..59493a724 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitAnd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitAnd.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * BitAnd action - Bitwise AND. @@ -62,7 +63,7 @@ public class ActionBitAnd extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new BitAndActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitLShift.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitLShift.java index c42c24f5c..b18ec0517 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitLShift.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitLShift.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * BitLShift action - Bitwise left shift. @@ -62,7 +63,7 @@ public class ActionBitLShift extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new LShiftActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitOr.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitOr.java index c0b409dab..3607dc605 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitOr.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitOr.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * BitOr action - Bitwise OR. @@ -62,7 +63,7 @@ public class ActionBitOr extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new BitOrActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitRShift.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitRShift.java index 28808a328..ed3779192 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitRShift.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitRShift.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * BitRShift action - Bitwise right shift. @@ -62,7 +63,7 @@ public class ActionBitRShift extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new RShiftActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitURShift.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitURShift.java index 6466fe1d3..da668fbf2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitURShift.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitURShift.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * BitURShift action - Bitwise unsigned right shift. @@ -62,7 +63,7 @@ public class ActionBitURShift extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new URShiftActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitXor.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitXor.java index e38fbb66d..1a355799a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitXor.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitXor.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * BitXor action - Bitwise XOR. @@ -62,7 +63,7 @@ public class ActionBitXor extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new BitXorActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallFunction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallFunction.java index d0f4d3f63..b186a0f82 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallFunction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallFunction.java @@ -34,6 +34,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * CallFunction action - Call a function. @@ -75,7 +76,7 @@ public class ActionCallFunction extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem functionName = stack.pop(); long numArgs = popLong(stack); List args = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java index 74ea8c9df..88e1b9a4a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java @@ -33,6 +33,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * CallMethod action - Call a method on an object. @@ -84,7 +85,7 @@ public class ActionCallMethod extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem methodName = stack.pop(); GraphTargetItem scriptObject = stack.pop(); long numArgs = popLong(stack); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java index 1f51c1e4e..b4630295d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java @@ -36,6 +36,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * ConstantPool action - Sets the current constant pool. @@ -50,9 +51,9 @@ public class ActionConstantPool extends Action { */ public List constantPool = new ArrayList<>(); - /** * Constructor. + * * @param constantPool Constant pool * @param charset Charset */ @@ -63,6 +64,7 @@ public class ActionConstantPool extends Action { /** * Constructor. + * * @param actionLength Action length * @param sis SWF input stream * @param version SWF version @@ -79,6 +81,7 @@ public class ActionConstantPool extends Action { /** * Constructor. + * * @param lexer Lexer * @param charset Charset * @throws IOException On I/O error @@ -127,6 +130,7 @@ public class ActionConstantPool extends Action { /** * Calculates size of string converted to bytes + * * @param str String * @return Size */ @@ -136,6 +140,7 @@ public class ActionConstantPool extends Action { /** * Calculates the size of the action converted to bytes + * * @param strings Strings * @return Size */ @@ -168,6 +173,6 @@ public class ActionConstantPool extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDecrement.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDecrement.java index 550a392ab..815a60c34 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDecrement.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDecrement.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Decrement action - Decrement value by 1. @@ -62,7 +63,7 @@ public class ActionDecrement extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new DecrementActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java index 3132059d8..980c20e55 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java @@ -43,6 +43,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.Set; /** * DefineFunction action - Defines a function. @@ -98,6 +99,7 @@ public class ActionDefineFunction extends Action implements GraphSourceItemConta /** * Constructor. + * * @param functionName Function name * @param paramNames Parameter names * @param codeSize Code size @@ -114,6 +116,7 @@ public class ActionDefineFunction extends Action implements GraphSourceItemConta /** * Constructor. + * * @param actionLength Action length * @param sis SWF input stream * @param version Version @@ -132,6 +135,7 @@ public class ActionDefineFunction extends Action implements GraphSourceItemConta /** * Constructor. + * * @param lexer Flasm lexer * @param charset Charset * @throws IOException On I/O error @@ -209,7 +213,7 @@ public class ActionDefineFunction extends Action implements GraphSourceItemConta } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal.java index c4d278bda..b3873620f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal.java @@ -33,6 +33,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * DefineLocal action - Define local variable. @@ -66,7 +67,7 @@ public class ActionDefineLocal extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop(); GraphTargetItem name = stack.pop(); String nameStr; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java index 57cc557f6..2b5dfeb6d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java @@ -32,6 +32,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * DefineLocal2 action - Define local variable without setting its value. @@ -54,7 +55,7 @@ public class ActionDefineLocal2 extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem name = stack.pop(); output.add(new DefineLocalActionItem(this, lineStartAction, name, null)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java index 012130585..2f3114d56 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Delete action - Delete a named property of an object. @@ -63,7 +64,7 @@ public class ActionDelete extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem propertyName = stack.pop(); GraphTargetItem object = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java index 856a9e723..df6d90b0e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java @@ -32,6 +32,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Delete2 action - Delete a named property. @@ -69,7 +70,7 @@ public class ActionDelete2 extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem propertyName = stack.pop(); stack.push(new DeleteActionItem(this, lineStartAction, null, propertyName)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java index 23dae8926..d68ca35fb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java @@ -33,6 +33,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Enumerate action - Enumerate object members. @@ -75,7 +76,7 @@ public class ActionEnumerate extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); stack.push(new EnumeratedValueActionItem()); output.add(new EnumerateActionItem(this, lineStartAction, object)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEquals2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEquals2.java index 360396081..1e500d9e5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEquals2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEquals2.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Equals2 action - Compare two values for equality, knows about types. @@ -62,7 +63,7 @@ public class ActionEquals2 extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new EqActionItem(this, lineStartAction, b, a, true)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java index 9c9cb9dc4..867529453 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java @@ -32,6 +32,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * GetMember action - Get a named property of an object. @@ -71,7 +72,7 @@ public class ActionGetMember extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem memberName = stack.pop(); GraphTargetItem object = stack.pop(); stack.push(new GetMemberActionItem(this, lineStartAction, object, memberName)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionIncrement.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionIncrement.java index 485a62a4f..bb43168a9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionIncrement.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionIncrement.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Increment action - Increment value by 1. @@ -62,7 +63,7 @@ public class ActionIncrement extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new IncrementActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java index ee3a58da5..742375d1c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * InitArray action - Initialize array. @@ -69,7 +70,7 @@ public class ActionInitArray extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { long numArgs = popLong(stack); List args = new ArrayList<>(); for (int l = 0; l < numArgs; l++) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java index 22d5ab3ba..fb8c0076b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * InitObject action - Initialize object. @@ -76,7 +77,7 @@ public class ActionInitObject extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { long numArgs = popLong(stack); List values = new ArrayList<>(); List names = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionLess2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionLess2.java index ea4f74f04..3fecab650 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionLess2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionLess2.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Less2 action - Compare two values for less than, knows about types. @@ -62,7 +63,7 @@ public class ActionLess2 extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new LtActionItem(this, lineStartAction, b, a, true)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionModulo.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionModulo.java index 97d71ddae..7bd426791 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionModulo.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionModulo.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Modulo action - Modulo. @@ -62,7 +63,7 @@ public class ActionModulo extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new ModuloActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java index 2bc26f3fc..adde7e383 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java @@ -33,6 +33,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * NewMethod action - Invokes constructor method from object. @@ -80,7 +81,7 @@ public class ActionNewMethod extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem methodName = stack.pop(); GraphTargetItem scriptObject = stack.pop(); long numArgs = popLong(stack); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java index 52552085c..8603ac817 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * NewObject action - Invokes constructor function. @@ -80,7 +81,7 @@ public class ActionNewObject extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem objectName = stack.pop(); long numArgs = popLong(stack); List args = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java index 193ec90ef..bc6988f48 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java @@ -31,6 +31,7 @@ import com.jpexs.decompiler.graph.model.DuplicateItem; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * PushDuplicate action - Push duplicate of top stack value. @@ -42,6 +43,7 @@ public class ActionPushDuplicate extends Action { /** * Constructor. + * * @param charset Charset */ public ActionPushDuplicate(String charset) { @@ -64,7 +66,7 @@ public class ActionPushDuplicate extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.peek(); stack.push(new DuplicateItem(ActionGraphTargetDialect.INSTANCE, this, lineStartAction, value)); value.getMoreSrc().add(new GraphSourceItemPos(this, 0)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionReturn.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionReturn.java index b025e765e..a2b938342 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionReturn.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionReturn.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Return action - Return from function. @@ -64,7 +65,7 @@ public class ActionReturn extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop(); output.add(new ReturnActionItem(this, lineStartAction, value)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java index a28ef7bfe..9e10fa206 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java @@ -43,6 +43,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * SetMember action - Set member of object. @@ -81,7 +82,7 @@ public class ActionSetMember extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop().getThroughDuplicate(); GraphTargetItem memberName = stack.pop(); GraphTargetItem object = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStackSwap.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStackSwap.java index 488d190f5..e918a2ad7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStackSwap.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStackSwap.java @@ -29,6 +29,7 @@ import com.jpexs.decompiler.graph.TranslateStack; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * StackSwap action - Swap top two stack values. @@ -40,6 +41,7 @@ public class ActionStackSwap extends Action { /** * Constructor. + * * @param charset Charset */ public ActionStackSwap(String charset) { @@ -65,7 +67,7 @@ public class ActionStackSwap extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(a); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java index 53191082b..ff6abeda8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java @@ -49,6 +49,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * StoreRegister action - Store value in register. @@ -76,6 +77,7 @@ public class ActionStoreRegister extends Action implements StoreTypeAction { /** * Constructor. + * * @param registerNumber Register number * @param charset Charset */ @@ -86,6 +88,7 @@ public class ActionStoreRegister extends Action implements StoreTypeAction { /** * Constructor. + * * @param actionLength Action length * @param sis SWF input stream * @throws IOException On I/O error @@ -97,6 +100,7 @@ public class ActionStoreRegister extends Action implements StoreTypeAction { /** * Constructor. + * * @param lexer Flasm lexer * @param charset Charset * @throws IOException On I/O error @@ -128,7 +132,7 @@ public class ActionStoreRegister extends Action implements StoreTypeAction { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop(); RegisterNumber rn = new RegisterNumber(registerNumber); if (regNames.containsKey(registerNumber)) { @@ -219,7 +223,7 @@ public class ActionStoreRegister extends Action implements StoreTypeAction { } @Override - public String getVariableName(TranslateStack stack, ConstantPool cpool, SWF swf) { + public String getVariableName(Set usedDeobfuscations, TranslateStack stack, ConstantPool cpool, SWF swf) { return "__register" + registerNumber; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java index cf29df725..0314989f4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java @@ -31,6 +31,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * TargetPath action - Get the path of the object. @@ -71,7 +72,7 @@ public class ActionTargetPath extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); stack.push(new TargetPathActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToNumber.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToNumber.java index e92fe9ce3..554ab6364 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToNumber.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToNumber.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * ToNumber action - Converts a value to a number. @@ -62,7 +63,7 @@ public class ActionToNumber extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); stack.push(new ToNumberActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToString.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToString.java index 84e9da145..18c8af47d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToString.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToString.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * ToString action - Converts a value to a string. @@ -62,7 +63,7 @@ public class ActionToString extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); stack.push(new ToStringActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTypeOf.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTypeOf.java index b8b5d15ea..f46999df4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTypeOf.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTypeOf.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * TypeOf action - Returns the type of a value. @@ -62,7 +63,7 @@ public class ActionTypeOf extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); stack.push(new TypeOfActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionWith.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionWith.java index 9aec4934b..0ac17fac6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionWith.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionWith.java @@ -58,6 +58,7 @@ public class ActionWith extends Action implements GraphSourceItemContainer { /** * Constructor. + * * @param codeSize Code size * @param charset Charset */ @@ -86,6 +87,7 @@ public class ActionWith extends Action implements GraphSourceItemContainer { /** * Constructor. + * * @param actionLength Action length * @param sis SWF input stream * @param version Version @@ -99,6 +101,7 @@ public class ActionWith extends Action implements GraphSourceItemContainer { /** * Constructor. + * * @param lexer Lexer * @param charset Charset * @throws IOException On I/O error diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java index 73195efc2..dbc6adbe9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java @@ -33,6 +33,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Enumerate2 action - Enumerates the properties of an object. Object as stack @@ -56,7 +57,7 @@ public class ActionEnumerate2 extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); stack.push(new EnumeratedValueActionItem()); output.add(new EnumerateActionItem(this, lineStartAction, object)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionGreater.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionGreater.java index 7e20e106e..440a6af1a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionGreater.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionGreater.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Greater action - Greater than comparison. @@ -62,7 +63,7 @@ public class ActionGreater extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new GtActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java index f34876a04..638adfe82 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java @@ -31,6 +31,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * InstanceOf action - Checks if an object is an instance of a class. @@ -100,7 +101,7 @@ public class ActionInstanceOf extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new InstanceOfActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStrictEquals.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStrictEquals.java index 738288de2..4d9a0c7c2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStrictEquals.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStrictEquals.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * StrictEquals action - Strict equality comparison. @@ -62,7 +63,7 @@ public class ActionStrictEquals extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StrictEqActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStringGreater.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStringGreater.java index 73f9936df..34981a676 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStringGreater.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStringGreater.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * StringGreater action - Greater than comparison for strings. @@ -62,7 +63,7 @@ public class ActionStringGreater extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StringGtActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java index 0fcca7e08..15be01f80 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java @@ -33,6 +33,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * CastOp action - Casts an object to a specified type. @@ -72,7 +73,7 @@ public class ActionCastOp extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); GraphTargetItem constructor = stack.pop(); stack.push(new CastOpActionItem(this, lineStartAction, constructor, object)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java index 1caf321ce..0986d7107 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java @@ -44,6 +44,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.Set; /** * DefineFunction2 action - Defines a function. Additional features. @@ -160,6 +161,7 @@ public class ActionDefineFunction2 extends Action implements GraphSourceItemCont /** * Constructor. + * * @param functionName Function name * @param preloadParentFlag Preload parent flag * @param preloadRootFlag Preload root flag @@ -198,6 +200,7 @@ public class ActionDefineFunction2 extends Action implements GraphSourceItemCont /** * Constructor. + * * @param actionLength Action length * @param sis SWF input stream * @param version Version @@ -228,6 +231,7 @@ public class ActionDefineFunction2 extends Action implements GraphSourceItemCont /** * Constructor. + * * @param lexer Flasm lexer * @param charset Charset * @throws IOException On I/O error @@ -354,6 +358,7 @@ public class ActionDefineFunction2 extends Action implements GraphSourceItemCont /** * Gets the first register + * * @return First register */ public int getFirstRegister() { @@ -380,7 +385,7 @@ public class ActionDefineFunction2 extends Action implements GraphSourceItemCont } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java index afe348efc..b0c25e253 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java @@ -30,6 +30,7 @@ import com.jpexs.decompiler.graph.TranslateStack; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Extends action - Extends a class. @@ -41,6 +42,7 @@ public class ActionExtends extends Action { /** * Constructor. + * * @param charset Charset */ public ActionExtends(String charset) { @@ -72,7 +74,7 @@ public class ActionExtends extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem superclass = stack.pop(); GraphTargetItem subclass = stack.pop(); output.add(new ExtendsActionItem(this, lineStartAction, subclass, superclass)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java index 1c2fa581e..1c821cc67 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java @@ -31,6 +31,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * ImplementsOp action - Implements an interface. @@ -42,6 +43,7 @@ public class ActionImplementsOp extends Action { /** * Constructor. + * * @param charset Charset */ public ActionImplementsOp(String charset) { @@ -76,7 +78,7 @@ public class ActionImplementsOp extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem subclass = stack.pop(); long inCount = popLong(stack); List superclasses = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java index ae78c79b4..d9260f1a6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java @@ -30,6 +30,7 @@ import com.jpexs.helpers.utf8.Utf8Helper; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * Throw action - Throws an exception. @@ -58,7 +59,7 @@ public class ActionThrow extends Action { } @Override - public void translate(Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(Set usedDeobfuscations, Map> uninitializedClassTraits, SecondPassData secondPassData, boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); output.add(new ThrowActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java index affdc9091..8b66a6dbf 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java @@ -269,6 +269,7 @@ public class ActionTry extends Action implements GraphSourceItemContainer { /** * Gets the try size + * * @return Try size */ public long getTrySize() { @@ -277,7 +278,7 @@ public class ActionTry extends Action implements GraphSourceItemContainer { @Override public List getContainerSizes() { - List ret = new ArrayList<>(); + List ret = new ArrayList<>(); ret.add(trySize); if (catchBlockFlag) { ret.add(catchSize); @@ -306,7 +307,7 @@ public class ActionTry extends Action implements GraphSourceItemContainer { finallySize = size; } } - + if (index > pos) { throw new IllegalArgumentException("Valid indexes are 0 to " + pos + "."); } @@ -466,9 +467,9 @@ public class ActionTry extends Action implements GraphSourceItemContainer { catchCommands.add(body); } } - + List finallyCommands = new ArrayList<>(); - + if (finallyBlockFlag) { p++; finallyCommands = contents.get(p); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/AS3ScriptExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/AS3ScriptExporter.java index b75faf9e3..a57bbe48f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/AS3ScriptExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/AS3ScriptExporter.java @@ -141,7 +141,7 @@ public class AS3ScriptExporter { try { List callStack = new ArrayList<>(); callStack.add(pack.abc.findBody(method)); - pack.abc.findBody(method).convert(swfVersion, callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, method, pack.scriptIndex, cindex, pack.abc, t, new ScopeStack(), 0/*?*/, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>()); + pack.abc.findBody(method).convert(swfVersion, callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, method, pack.scriptIndex, cindex, pack.abc, t, new ScopeStack(), 0/*?*/, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>(), new LinkedHashSet<>()); List ci = pack.abc.findBody(method).convertedItems; if (!ci.isEmpty()) { @@ -163,7 +163,7 @@ public class AS3ScriptExporter { if (((SetLocalAVM2Item) asg).regIndex == ((LocalRegAVM2Item) sp.object).regIndex) { GraphTargetItem val = sp.value; if (sp.propertyName instanceof FullMultinameAVM2Item) { - String propName = pack.abc.constants.getMultiname(((FullMultinameAVM2Item) sp.propertyName).multinameIndex).getName(pack.abc, pack.abc.constants, new ArrayList<>(), true, true); + String propName = pack.abc.constants.getMultiname(((FullMultinameAVM2Item) sp.propertyName).multinameIndex).getName(new LinkedHashSet<>(), pack.abc, pack.abc.constants, new ArrayList<>(), true, true); if (val instanceof CallPropertyAVM2Item) { CallPropertyAVM2Item cap = (CallPropertyAVM2Item) val; if (cp.propertyName instanceof FullMultinameAVM2Item) { @@ -216,7 +216,7 @@ public class AS3ScriptExporter { try { List callStack = new ArrayList<>(); callStack.add(pack.abc.findBody(method)); - pack.abc.findBody(method).convert(swfVersion, callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, method, pack.scriptIndex, cindex, pack.abc, t, new ScopeStack(), 0/*?*/, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>()/*??*/, new ArrayList<>()); + pack.abc.findBody(method).convert(swfVersion, callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, method, pack.scriptIndex, cindex, pack.abc, t, new ScopeStack(), 0/*?*/, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>()/*??*/, new ArrayList<>(), new LinkedHashSet<>()); List ci = pack.abc.findBody(method).convertedItems; if (!ci.isEmpty() && (ci.get(0) instanceof DeclarationAVM2Item)) { @@ -253,7 +253,7 @@ public class AS3ScriptExporter { private String getTagName(ScriptPack pack, int classMIndex, int nameMindex, Map namespaces) { Multiname m = pack.abc.constants.getMultiname(classMIndex); Multiname mn = pack.abc.constants.getMultiname(nameMindex); - String parentName = mn.getName(pack.abc, pack.abc.constants, new ArrayList<>(), true, true); + String parentName = mn.getName(new LinkedHashSet<>(), pack.abc, pack.abc.constants, new ArrayList<>(), true, true); String pkg = m.getNamespace(pack.abc.constants).getName(pack.abc.constants).toRawString(); pkg += ".*"; String ns = null; @@ -309,13 +309,13 @@ public class AS3ScriptExporter { try { List callStack = new ArrayList<>(); callStack.add(pack.abc.findBody(iinit)); - pack.abc.findBody(iinit).convert(swfVersion, callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, iinit, pack.scriptIndex, cindex, pack.abc, t, new ScopeStack(), 0/*?*/, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>()); + pack.abc.findBody(iinit).convert(swfVersion, callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, iinit, pack.scriptIndex, cindex, pack.abc, t, new ScopeStack(), 0/*?*/, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>(), new LinkedHashSet<>()); List iinitBody = pack.abc.findBody(iinit).convertedItems; for (GraphTargetItem it : iinitBody) { if (it instanceof InitPropertyAVM2Item) { InitPropertyAVM2Item ip = (InitPropertyAVM2Item) it; if (ip.object instanceof ThisAVM2Item) { - String propName = pack.abc.constants.getMultiname(ip.propertyName.multinameIndex).getName(pack.abc, pack.abc.constants, new ArrayList<>(), true, true); + String propName = pack.abc.constants.getMultiname(ip.propertyName.multinameIndex).getName(new LinkedHashSet<>(), pack.abc, pack.abc.constants, new ArrayList<>(), true, true); GraphTargetItem val = ((InitPropertyAVM2Item) it).value; if (val instanceof CallPropertyAVM2Item) { CallPropertyAVM2Item cp = (CallPropertyAVM2Item) val; @@ -335,7 +335,7 @@ public class AS3ScriptExporter { ConstructPropAVM2Item cp = (ConstructPropAVM2Item) val; if (cp.propertyName instanceof FullMultinameAVM2Item) { Multiname m = pack.abc.constants.getMultiname(((FullMultinameAVM2Item) cp.propertyName).multinameIndex); - if ("mx.core.DeferredInstanceFromFunction".equals("" + m.getNameWithNamespace(pack.abc, pack.abc.constants, true))) { + if ("mx.core.DeferredInstanceFromFunction".equals("" + m.getNameWithNamespace(new LinkedHashSet<>(), pack.abc, pack.abc.constants, true))) { if (!cp.args.isEmpty()) { if (cp.args.get(0) instanceof GetPropertyAVM2Item) { GetPropertyAVM2Item gp = (GetPropertyAVM2Item) cp.args.get(0); @@ -411,7 +411,7 @@ public class AS3ScriptExporter { Set files = new HashSet<>(); String documentClass = swf.getDocumentClass(); StringBuffer includeClassesBuilder = new StringBuffer(); - String documentPkg = documentClass != null ? DottedChain.parseNoSuffix(documentClass).getWithoutLast().toPrintableString(swf, true) : null; + String documentPkg = documentClass != null ? DottedChain.parseNoSuffix(documentClass).getWithoutLast().toPrintableString(new LinkedHashSet<>(), swf, true) : null; StringBuilder importsBuilder = new StringBuilder(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/DependencyParser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/DependencyParser.java index 19a735741..b2e7e5828 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/DependencyParser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/DependencyParser.java @@ -43,6 +43,7 @@ import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.helpers.Reference; import java.util.ArrayList; import java.util.List; +import java.util.Set; /** * Dependency parser. @@ -111,6 +112,8 @@ public class DependencyParser { /** * Parses dependencies from multiname. + * + * @param usedDeobfuscations Used deobfuscations * @param abcIndex AbcIndexing * @param ignoredCustom Ignored custom * @param abc ABC @@ -121,21 +124,21 @@ public class DependencyParser { * @param dependencyType Dependency type * @param uses Uses */ - public static void parseDependenciesFromMultiname(AbcIndexing abcIndex, String ignoredCustom, ABC abc, List dependencies, Multiname m, DottedChain ignorePackage, List fullyQualifiedNames, DependencyType dependencyType, List uses) { + public static void parseDependenciesFromMultiname(Set usedDeobfuscations, AbcIndexing abcIndex, String ignoredCustom, ABC abc, List dependencies, Multiname m, DottedChain ignorePackage, List fullyQualifiedNames, DependencyType dependencyType, List uses) { if (m != null) { if (m.kind == Multiname.TYPENAME) { if (m.qname_index != 0) { - parseDependenciesFromMultiname(abcIndex, ignoredCustom, abc, dependencies, abc.constants.getMultiname(m.qname_index), ignorePackage, fullyQualifiedNames, dependencyType, uses); + parseDependenciesFromMultiname(usedDeobfuscations, abcIndex, ignoredCustom, abc, dependencies, abc.constants.getMultiname(m.qname_index), ignorePackage, fullyQualifiedNames, dependencyType, uses); } for (Integer i : m.params) { if (i != 0) { - parseDependenciesFromMultiname(abcIndex, ignoredCustom, abc, dependencies, abc.constants.getMultiname(i), ignorePackage, fullyQualifiedNames, dependencyType, uses); + parseDependenciesFromMultiname(usedDeobfuscations, abcIndex, ignoredCustom, abc, dependencies, abc.constants.getMultiname(i), ignorePackage, fullyQualifiedNames, dependencyType, uses); } } return; } Namespace ns = m.getNamespace(abc.constants); - String name = m.getName(abc, abc.constants, fullyQualifiedNames, true, true); + String name = m.getName(usedDeobfuscations, abc, abc.constants, fullyQualifiedNames, true, true); NamespaceSet nss = m.getNamespaceSet(abc.constants); if (ns != null) { parseDependenciesFromNS(abcIndex, ignoredCustom, abc, dependencies, m.namespace_index, ignorePackage, name, dependencyType, uses); @@ -150,6 +153,8 @@ public class DependencyParser { /** * Parses dependencies from method info. + * + * @param usedDeobfuscations Used deobfuscations * @param abcIndex AbcIndexing * @param trait Trait * @param scriptIndex Script index @@ -166,25 +171,25 @@ public class DependencyParser { * @param numberContextRef Number context reference * @throws InterruptedException On interrupt */ - public static void parseDependenciesFromMethodInfo(AbcIndexing abcIndex, Trait trait, int scriptIndex, int classIndex, boolean isStatic, String ignoredCustom, ABC abc, int method_index, List dependencies, DottedChain ignorePackage, List fullyQualifiedNames, List visitedMethods, List uses, Reference numberContextRef) throws InterruptedException { + public static void parseDependenciesFromMethodInfo(Set usedDeobfuscations, AbcIndexing abcIndex, Trait trait, int scriptIndex, int classIndex, boolean isStatic, String ignoredCustom, ABC abc, int method_index, List dependencies, DottedChain ignorePackage, List fullyQualifiedNames, List visitedMethods, List uses, Reference numberContextRef) throws InterruptedException { if ((method_index < 0) || (method_index >= abc.method_info.size())) { return; } visitedMethods.add(method_index); if (abc.method_info.get(method_index).ret_type != 0) { - parseDependenciesFromMultiname(abcIndex, ignoredCustom, abc, dependencies, abc.constants.getMultiname(abc.method_info.get(method_index).ret_type), ignorePackage, fullyQualifiedNames, DependencyType.SIGNATURE, uses); + parseDependenciesFromMultiname(usedDeobfuscations, abcIndex, ignoredCustom, abc, dependencies, abc.constants.getMultiname(abc.method_info.get(method_index).ret_type), ignorePackage, fullyQualifiedNames, DependencyType.SIGNATURE, uses); } for (int t : abc.method_info.get(method_index).param_types) { if (t != 0) { - parseDependenciesFromMultiname(abcIndex, ignoredCustom, abc, dependencies, abc.constants.getMultiname(t), ignorePackage, fullyQualifiedNames, DependencyType.SIGNATURE, uses); + parseDependenciesFromMultiname(usedDeobfuscations, abcIndex, ignoredCustom, abc, dependencies, abc.constants.getMultiname(t), ignorePackage, fullyQualifiedNames, DependencyType.SIGNATURE, uses); } } MethodBody body = abc.findBody(method_index); if (body != null && body.convertException == null) { body = body.convertMethodBodyCanUseLast(Configuration.autoDeobfuscate.get(), "", isStatic, scriptIndex, classIndex, abc, trait); - body.traits.getDependencies(abcIndex, scriptIndex, classIndex, isStatic, ignoredCustom, abc, dependencies, ignorePackage, fullyQualifiedNames, uses, numberContextRef); + body.traits.getDependencies(usedDeobfuscations, abcIndex, scriptIndex, classIndex, isStatic, ignoredCustom, abc, dependencies, ignorePackage, fullyQualifiedNames, uses, numberContextRef); for (ABCException ex : body.exceptions) { - parseDependenciesFromMultiname(abcIndex, ignoredCustom, abc, dependencies, abc.constants.getMultiname(ex.type_index), ignorePackage, fullyQualifiedNames, DependencyType.EXPRESSION /* or signature?*/, uses); + parseDependenciesFromMultiname(usedDeobfuscations, abcIndex, ignoredCustom, abc, dependencies, abc.constants.getMultiname(ex.type_index), ignorePackage, fullyQualifiedNames, DependencyType.EXPRESSION /* or signature?*/, uses); } boolean hasNewClass = false; @@ -245,7 +250,7 @@ public class DependencyParser { if (ins.definition instanceof NewFunctionIns) { if (ins.operands[0] != method_index) { if (!visitedMethods.contains(ins.operands[0])) { - parseDependenciesFromMethodInfo(abcIndex, trait, scriptIndex, classIndex, isStatic, ignoredCustom, abc, ins.operands[0], dependencies, ignorePackage, fullyQualifiedNames, visitedMethods, uses, numberContextRef); + parseDependenciesFromMethodInfo(usedDeobfuscations, abcIndex, trait, scriptIndex, classIndex, isStatic, ignoredCustom, abc, ins.operands[0], dependencies, ignorePackage, fullyQualifiedNames, visitedMethods, uses, numberContextRef); } } } @@ -271,7 +276,7 @@ public class DependencyParser { } if (classIndex > -1 && ins.definition instanceof GetOuterScopeIns) { if (ins.operands[0] > 0) { //first is global - DottedChain type = abc.instance_info.get(classIndex).getName(abc.constants).getNameWithNamespace(abc, abc.constants, true); + DottedChain type = abc.instance_info.get(classIndex).getName(abc.constants).getNameWithNamespace(usedDeobfuscations, abc, abc.constants, true); AbcIndexing.ClassIndex cls = abcIndex.findClass(new TypeItem(type), abc, scriptIndex); List clsList = new ArrayList<>(); cls = cls.parent; @@ -281,7 +286,7 @@ public class DependencyParser { } if (ins.operands[0] < 1 + clsList.size()) { AbcIndexing.ClassIndex cls2 = clsList.get(ins.operands[0] - 1); - DottedChain nimport = cls2.abc.instance_info.get(cls2.index).getName(cls2.abc.constants).getNameWithNamespace(cls2.abc, cls2.abc.constants, true); + DottedChain nimport = cls2.abc.instance_info.get(cls2.index).getName(cls2.abc.constants).getNameWithNamespace(usedDeobfuscations, cls2.abc, cls2.abc.constants, true); Dependency depExp = new Dependency(nimport, DependencyType.EXPRESSION); if (!dependencies.contains(depExp)) { dependencies.add(depExp); @@ -299,7 +304,7 @@ public class DependencyParser { if (ins.definition.operands[k] == AVM2Code.DAT_MULTINAME_INDEX) { int m = ins.operands[k]; if (m < abc.constants.getMultinameCount()) { - parseDependenciesFromMultiname(abcIndex, ignoredCustom, abc, dependencies, abc.constants.getMultiname(m), ignorePackage, fullyQualifiedNames, DependencyType.EXPRESSION, uses); + parseDependenciesFromMultiname(usedDeobfuscations, abcIndex, ignoredCustom, abc, dependencies, abc.constants.getMultiname(m), ignorePackage, fullyQualifiedNames, DependencyType.EXPRESSION, uses); } } if (ins.definition.operands[k] == AVM2Code.DAT_NUMBER_CONTEXT) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/LinkReportExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/LinkReportExporter.java index c3ba94c11..ca655676b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/LinkReportExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/LinkReportExporter.java @@ -33,6 +33,7 @@ import com.jpexs.helpers.Reference; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -128,7 +129,7 @@ public class LinkReportExporter { ns = abc.constants.getNamespace(nss.namespaces[0]); } String pkgName = ns == null ? "" : ns.getName(abc.constants).toRawString(); - String clsName = multiName.getName(abc, abc.constants, new ArrayList<>(), true, true); + String clsName = multiName.getName(new LinkedHashSet<>(), abc, abc.constants, new ArrayList<>(), true, true); return pkgName.isEmpty() ? clsName : pkgName + ":" + clsName; } @@ -174,7 +175,7 @@ public class LinkReportExporter { List dependencies = new ArrayList<>(); sb.append(indent(3)).append("").append(newLineChar); //Automatic - tc.getDependencies(swf.getAbcIndex(), scriptIndex, -1, false, null, abc, dependencies, new DottedChain(new String[]{"FAKE!PACKAGE"}), new ArrayList<>(), new ArrayList<>(), new Reference<>(null)); + tc.getDependencies(new LinkedHashSet<>(), swf.getAbcIndex(), scriptIndex, -1, false, null, abc, dependencies, new DottedChain(new String[]{"FAKE!PACKAGE"}), new ArrayList<>(), new ArrayList<>(), new Reference<>(null)); for (Dependency dependency : dependencies) { DottedChain dc = dependency.getId(); if (!"*".equals(dc.getLast())) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/swf/SwfToSwcExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/swf/SwfToSwcExporter.java index 07cdc13dc..312035663 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/swf/SwfToSwcExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/swf/SwfToSwcExporter.java @@ -42,6 +42,7 @@ import java.security.MessageDigest; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.zip.ZipEntry; @@ -167,7 +168,7 @@ public class SwfToSwcExporter { sb.append(" \n"); if (!skipDependencies) { List dependencies = new ArrayList<>(); - pack.abc.script_info.get(pack.scriptIndex).traits.getDependencies(swf.getAbcIndex(), pack.scriptIndex, -1, false, null, pack.abc, dependencies, new DottedChain(new String[]{"NO:PACKAGE"}), new ArrayList<>(), new ArrayList<>(), new Reference<>(null)); + pack.abc.script_info.get(pack.scriptIndex).traits.getDependencies(new LinkedHashSet<>(), swf.getAbcIndex(), pack.scriptIndex, -1, false, null, pack.abc, dependencies, new DottedChain(new String[]{"NO:PACKAGE"}), new ArrayList<>(), new ArrayList<>(), new Reference<>(null)); for (Dependency d : dependencies) { if ("*".equals(d.getId().getLast())) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/flexsdk/MxmlcAs3ScriptReplacer.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/flexsdk/MxmlcAs3ScriptReplacer.java index f4a1ec1ef..1cfc49497 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/flexsdk/MxmlcAs3ScriptReplacer.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/flexsdk/MxmlcAs3ScriptReplacer.java @@ -46,6 +46,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.regex.Matcher; @@ -112,11 +113,11 @@ public class MxmlcAs3ScriptReplacer extends MxmlcRunner implements As3ScriptRepl if (ii.deleted) { return true; } - if (ii.super_index != 0 && isParentDeleted(abc, allAbcs, abc.constants.getMultiname(ii.super_index).getNameWithNamespace(abc, abc.constants, false))) { + if (ii.super_index != 0 && isParentDeleted(abc, allAbcs, abc.constants.getMultiname(ii.super_index).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, false))) { return true; } for (int iface : ii.interfaces) { - if (isParentDeleted(abc, allAbcs, abc.constants.getMultiname(iface).getNameWithNamespace(abc, abc.constants, false))) { + if (isParentDeleted(abc, allAbcs, abc.constants.getMultiname(iface).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, false))) { return true; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/ABCSearchResult.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/ABCSearchResult.java index 218408117..831ed7751 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/ABCSearchResult.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/ABCSearchResult.java @@ -30,6 +30,7 @@ import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.Serializable; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -240,10 +241,10 @@ public class ABCSearchResult implements Serializable, ScriptSearchResult { boolean isStatic = traitId < staticTraitCount; if (isStatic) { - return abc.class_info.get(classIndex).static_traits.traits.get(traitId).getName(abc).getName(abc, abc.constants, null, false, true); + return abc.class_info.get(classIndex).static_traits.traits.get(traitId).getName(abc).getName(new LinkedHashSet<>(), abc, abc.constants, null, false, true); } else { int index = traitId - staticTraitCount; - return abc.instance_info.get(classIndex).instance_traits.traits.get(index).getName(abc).getName(abc, abc.constants, null, false, true); + return abc.instance_info.get(classIndex).instance_traits.traits.get(index).getName(abc).getName(new LinkedHashSet<>(), abc, abc.constants, null, false, true); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java index db2bdd2b2..b837e9831 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java @@ -74,6 +74,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -897,7 +898,7 @@ public class DefineEditTextTag extends TextTag { writer.append("leading ").append(leading).newLine(); } if (!variableName.isEmpty()) { - writer.append("variablename ").append(DottedChain.parseNoSuffix(variableName).toPrintableString(getSwf(), false)).newLine(); + writer.append("variablename ").append(DottedChain.parseNoSuffix(variableName).toPrintableString(new LinkedHashSet<>(), getSwf(), false)).newLine(); } writer.append("]"); if (hasText) { @@ -1610,7 +1611,7 @@ public class DefineEditTextTag extends TextTag { public Map getNameProperties() { Map ret = super.getNameProperties(); if (variableName != null && !variableName.isEmpty()) { - ret.put("vn", DottedChain.parseNoSuffix(variableName).toPrintableString(getSwf(), false)); + ret.put("vn", DottedChain.parseNoSuffix(variableName).toPrintableString(new LinkedHashSet<>(), getSwf(), false)); } return ret; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoActionTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoActionTag.java index b031411ae..1c0fb57db 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoActionTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoActionTag.java @@ -37,6 +37,7 @@ import com.jpexs.helpers.Helper; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; /** @@ -255,7 +256,7 @@ public class DoActionTag extends Tag implements ASMSource { @Override public List getActionsToTree() { try { - return Action.actionsToTree(false, new HashMap<>(), false, false, getActions(), swf.version, 0, getScriptName(), swf.getCharset()); + return Action.actionsToTree(new LinkedHashSet<>(), false, new HashMap<>(), false, false, getActions(), swf.version, 0, getScriptName(), swf.getCharset()); } catch (InterruptedException ex) { return new ArrayList<>(); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java index 1ce950fbb..bf7c55118 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java @@ -40,6 +40,7 @@ import com.jpexs.helpers.Helper; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -300,7 +301,7 @@ public class DoInitActionTag extends Tag implements CharacterIdTag, ASMSource { @Override public List getActionsToTree() { try { - return Action.actionsToTree(requiresUninitielizedClassTraitsDetection(), requiresUninitielizedClassTraitsDetection() ? swf.getUninitializedAs2ClassTraits() : new HashMap<>(), true, false, getActions(), swf.version, 0, getScriptName(), swf.getCharset()); + return Action.actionsToTree(new LinkedHashSet<>(),requiresUninitielizedClassTraitsDetection(), requiresUninitielizedClassTraitsDetection() ? swf.getUninitializedAs2ClassTraits() : new HashMap<>(), true, false, getActions(), swf.version, 0, getScriptName(), swf.getCharset()); } catch (InterruptedException ex) { return new ArrayList<>(); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ImportAssets2Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ImportAssets2Tag.java index 254af1781..a0eee514e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ImportAssets2Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ImportAssets2Tag.java @@ -32,6 +32,7 @@ import com.jpexs.helpers.Helper; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -164,7 +165,7 @@ public class ImportAssets2Tag extends Tag implements ImportTag { ret.put("chid", "" + tags.get(0)); String importName = names.get(0); if (importName.startsWith("__Packages.")) { - ret.put("imp", DottedChain.parseNoSuffix(importName).toPrintableString(getSwf(), false)); + ret.put("imp", DottedChain.parseNoSuffix(importName).toPrintableString(new LinkedHashSet<>(), getSwf(), false)); } else { ret.put("imp", "\"" + Helper.escapePCodeString(importName) + "\""); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ImportAssetsTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ImportAssetsTag.java index cf786817e..b91c96580 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ImportAssetsTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ImportAssetsTag.java @@ -31,6 +31,7 @@ import com.jpexs.helpers.Helper; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -142,7 +143,7 @@ public class ImportAssetsTag extends Tag implements ImportTag { String importName = names.get(0); if (importName.startsWith("__Packages.")) { - ret.put("imp", DottedChain.parseNoSuffix(importName).toPrintableString(getSwf(), false)); + ret.put("imp", DottedChain.parseNoSuffix(importName).toPrintableString(new LinkedHashSet<>(), getSwf(), false)); } else { ret.put("imp", "\"" + Helper.escapePCodeString(importName) + "\""); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java index bacd3f7a1..3ba1fb5a8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java @@ -38,6 +38,7 @@ import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.helpers.ByteArrayRange; import java.io.IOException; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -458,7 +459,7 @@ public class PlaceObject2Tag extends PlaceObjectTypeTag implements ASMSourceCont public Map getNameProperties() { Map ret = super.getNameProperties(); if (placeFlagHasName) { - ret.put("nm", DottedChain.parseNoSuffix(name).toPrintableString(getSwf(), false)); + ret.put("nm", DottedChain.parseNoSuffix(name).toPrintableString(new LinkedHashSet<>(), getSwf(), false)); } return ret; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java index 595b60fc8..1b7b582cf 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java @@ -44,6 +44,7 @@ import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.helpers.ByteArrayRange; import java.io.IOException; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -698,7 +699,7 @@ public class PlaceObject3Tag extends PlaceObjectTypeTag implements ASMSourceCont public Map getNameProperties() { Map ret = super.getNameProperties(); if (placeFlagHasName) { - ret.put("nm", DottedChain.parseNoSuffix(name).toPrintableString(getSwf(), false)); + ret.put("nm", DottedChain.parseNoSuffix(name).toPrintableString(new LinkedHashSet<>(), getSwf(), false)); } return ret; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject4Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject4Tag.java index ec65896ca..6502ac2f3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject4Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject4Tag.java @@ -45,6 +45,7 @@ import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.helpers.ByteArrayRange; import java.io.IOException; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -711,7 +712,7 @@ public class PlaceObject4Tag extends PlaceObjectTypeTag implements ASMSourceCont public Map getNameProperties() { Map ret = super.getNameProperties(); if (placeFlagHasName) { - ret.put("nm", DottedChain.parseNoSuffix(name).toPrintableString(getSwf(), false)); + ret.put("nm", DottedChain.parseNoSuffix(name).toPrintableString(new LinkedHashSet<>(), getSwf(), false)); } return ret; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonAction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonAction.java index 8323608a2..1ffccf366 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonAction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonAction.java @@ -32,6 +32,7 @@ import com.jpexs.helpers.ByteArrayRange; import com.jpexs.helpers.Helper; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; /** @@ -219,7 +220,7 @@ public class ButtonAction implements ASMSource { @Override public List getActionsToTree() { try { - return Action.actionsToTree(false, new HashMap<>(), false, false, getActions(), buttonTag.getSwf().version, 0, getScriptName(), buttonTag.getSwf().getCharset()); + return Action.actionsToTree(new LinkedHashSet<>(),false, new HashMap<>(), false, false, getActions(), buttonTag.getSwf().version, 0, getScriptName(), buttonTag.getSwf().getCharset()); } catch (InterruptedException ex) { return new ArrayList<>(); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/CharacterTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/CharacterTag.java index 3c4867e17..3ab322e78 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/CharacterTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/CharacterTag.java @@ -104,7 +104,7 @@ public abstract class CharacterTag extends Tag implements CharacterIdTag { if (!classNames.isEmpty()) { List escapedList = new ArrayList<>(); for (String className : classNames) { - escapedList.add(DottedChain.parseNoSuffix(className).toPrintableString(getSwf(), true)); + escapedList.add(DottedChain.parseNoSuffix(className).toPrintableString(new LinkedHashSet<>(), getSwf(), true)); } ret.put("cls", String.join(", ", escapedList)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/AS2Package.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/AS2Package.java index 0915af148..c76ca6481 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/AS2Package.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/AS2Package.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.flash.treeitems.Openable; import com.jpexs.decompiler.flash.treeitems.TreeItem; import com.jpexs.decompiler.graph.DottedChain; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -192,7 +193,7 @@ public class AS2Package implements TreeItem { if (defaultPackage) { return name; } - return DottedChain.parseNoSuffix(name).toPrintableString(swf, false); + return DottedChain.parseNoSuffix(name).toPrintableString(new LinkedHashSet<>(), swf, false); } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/AS3Package.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/AS3Package.java index 173023403..7173dacf9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/AS3Package.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/AS3Package.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.flash.abc.ScriptPack; import com.jpexs.decompiler.flash.treeitems.AS3ClassTreeItem; import com.jpexs.decompiler.flash.treeitems.Openable; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -355,7 +356,7 @@ public class AS3Package extends AS3ClassTreeItem { if (flat) { return packageName; } - return IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), true, packageName); + return IdentifiersDeobfuscation.printIdentifier(abc.getSwf(), new LinkedHashSet<>(), true, packageName); } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/treeitems/AS3ClassTreeItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/treeitems/AS3ClassTreeItem.java index 33e75fdba..b9996feae 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/treeitems/AS3ClassTreeItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/treeitems/AS3ClassTreeItem.java @@ -20,6 +20,7 @@ import com.jpexs.decompiler.flash.IdentifiersDeobfuscation; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.ClassPath; +import java.util.LinkedHashSet; /** * ActionScript 3 class TreeItem. @@ -85,7 +86,7 @@ public abstract class AS3ClassTreeItem implements TreeItem { swf = ((ABC) o).getSwf(); } - String ret = IdentifiersDeobfuscation.printIdentifier(swf, true, name); + String ret = IdentifiersDeobfuscation.printIdentifier(swf, new LinkedHashSet<>(), true, name); if (namespaceSuffix != null) { ret += namespaceSuffix; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/BUTTONCONDACTION.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/BUTTONCONDACTION.java index 9e45afc16..a2ab0d678 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/BUTTONCONDACTION.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/BUTTONCONDACTION.java @@ -40,6 +40,7 @@ import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; /** @@ -393,7 +394,7 @@ public class BUTTONCONDACTION implements ASMSource, Serializable, HasSwfAndTag { @Override public List getActionsToTree() { try { - return Action.actionsToTree(false, new HashMap<>(), false, false, getActions(), swf.version, 0, getScriptName(), swf.getCharset()); + return Action.actionsToTree(new LinkedHashSet<>(), false, new HashMap<>(), false, false, getActions(), swf.version, 0, getScriptName(), swf.getCharset()); } catch (InterruptedException ex) { return new ArrayList<>(); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/CLIPACTIONRECORD.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/CLIPACTIONRECORD.java index b047c84f4..041e6038f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/CLIPACTIONRECORD.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/CLIPACTIONRECORD.java @@ -39,6 +39,7 @@ import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; /** @@ -405,7 +406,7 @@ public class CLIPACTIONRECORD implements ASMSource, Serializable, HasSwfAndTag { @Override public List getActionsToTree() { try { - return Action.actionsToTree(false, new HashMap<>(), false, false, getActions(), swf.version, 0, getScriptName(), swf.getCharset()); + return Action.actionsToTree(new LinkedHashSet<>(),false, new HashMap<>(), false, false, getActions(), swf.version, 0, getScriptName(), swf.getCharset()); } catch (InterruptedException ex) { return new ArrayList<>(); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java index 65b70ba15..db8c19971 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java @@ -195,6 +195,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.IdentityHashMap; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Map; @@ -2846,7 +2847,7 @@ public class XFLConverter { try { List callStack = new ArrayList<>(); callStack.add(constructorBody); - constructorBody.convert(swfVersion, callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), GraphTextWriter.TRAIT_INSTANCE_INITIALIZER, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>()); + constructorBody.convert(swfVersion, callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), GraphTextWriter.TRAIT_INSTANCE_INITIALIZER, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>(), new LinkedHashSet<>()); if (constructorBody.convertedItems != null) { for (int j = 0; j < constructorBody.convertedItems.size(); j++) { GraphTargetItem ti = constructorBody.convertedItems.get(j); @@ -3039,7 +3040,7 @@ public class XFLConverter { try { List callStack = new ArrayList<>(); callStack.add(constructorBody); - constructorBody.convert(swfVersion, callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), GraphTextWriter.TRAIT_INSTANCE_INITIALIZER, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>()); + constructorBody.convert(swfVersion, callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), GraphTextWriter.TRAIT_INSTANCE_INITIALIZER, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>(), new LinkedHashSet<>()); List allFramesAccessibilityTraitNames = new ArrayList<>(); List frameTraitNames = new ArrayList<>(); if (constructorBody.convertedItems != null) { @@ -3060,14 +3061,14 @@ public class XFLConverter { if (callProp.arguments.get(i) instanceof IntegerValueAVM2Item) { if (callProp.arguments.get(i + 1) instanceof GetLexAVM2Item) { GetLexAVM2Item lex = (GetLexAVM2Item) callProp.arguments.get(i + 1); - frameTraitNames.add(lex.propertyName.getName(abc, abc.constants, new ArrayList<>(), false, true)); + frameTraitNames.add(lex.propertyName.getName(new LinkedHashSet<>(), abc, abc.constants, new ArrayList<>(), false, true)); } else if (callProp.arguments.get(i + 1) instanceof GetPropertyAVM2Item) { GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) callProp.arguments.get(i + 1); if (getProp.object instanceof ThisAVM2Item) { if (getProp.propertyName instanceof FullMultinameAVM2Item) { FullMultinameAVM2Item framePropName = (FullMultinameAVM2Item) getProp.propertyName; int multinameIndex = framePropName.multinameIndex; - frameTraitNames.add(abc.constants.getMultiname(multinameIndex).getName(abc, abc.constants, new ArrayList<>(), false, true)); + frameTraitNames.add(abc.constants.getMultiname(multinameIndex).getName(new LinkedHashSet<>(), abc, abc.constants, new ArrayList<>(), false, true)); } } } @@ -3083,7 +3084,7 @@ public class XFLConverter { List frameRangeAccessibilityTraitNames = new ArrayList<>(); for (Trait t : instanceInfo.instance_traits.traits) { if (t instanceof TraitMethodGetterSetter) { - String traitName = t.getName(abc).getName(abc, abc.constants, new ArrayList<>(), true, false); + String traitName = t.getName(abc).getName(new LinkedHashSet<>(), abc, abc.constants, new ArrayList<>(), true, false); if ("__setTab_handler".equals(traitName) || "__setAcc_handler".equals(traitName)) { TraitMethodGetterSetter tm = (TraitMethodGetterSetter) t; @@ -3093,7 +3094,7 @@ public class XFLConverter { MethodBody traitBody = abc.findBody(tm.method_info); List traitCallStack = new ArrayList<>(); traitCallStack.add(traitBody); - traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>()); + traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>(), new LinkedHashSet<>()); if (traitBody.convertedItems == null) { continue; } @@ -3120,7 +3121,7 @@ public class XFLConverter { MethodBody traitBody = abc.findBody(tm.method_info); List traitCallStack = new ArrayList<>(); traitCallStack.add(traitBody); - traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>()); + traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>(), new LinkedHashSet<>()); if (traitBody.convertedItems != null) { for (int j = 0; j < traitBody.convertedItems.size(); j++) { GraphTargetItem ti = traitBody.convertedItems.get(j); @@ -3144,13 +3145,13 @@ public class XFLConverter { for (Trait t : instanceInfo.instance_traits.traits) { if (t instanceof TraitMethodGetterSetter) { - String traitName = t.getName(abc).getName(abc, abc.constants, new ArrayList<>(), true, false); + String traitName = t.getName(abc).getName(new LinkedHashSet<>(), abc, abc.constants, new ArrayList<>(), true, false); if (frameAccessibilityTraitNames.contains(traitName)) { TraitMethodGetterSetter tm = (TraitMethodGetterSetter) t; MethodBody traitBody = abc.findBody(tm.method_info); List traitCallStack = new ArrayList<>(); traitCallStack.add(traitBody); - traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>()); + traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>(), new LinkedHashSet<>()); if (traitBody.convertedItems != null) { if (!traitBody.convertedItems.isEmpty()) { if (traitBody.convertedItems.get(0) instanceof IfItem) { @@ -3252,7 +3253,7 @@ public class XFLConverter { MethodBody traitBody = abc.findBody(tm.method_info); List traitCallStack = new ArrayList<>(); traitCallStack.add(traitBody); - traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>()); + traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>(), new LinkedHashSet<>()); if (traitBody.convertedItems != null) { if (!traitBody.convertedItems.isEmpty()) { if (traitBody.convertedItems.get(0) instanceof IfItem) { @@ -3367,13 +3368,13 @@ public class XFLConverter { } for (Trait t : instanceInfo.instance_traits.traits) { - if (allFramesAccessibilityTraitNames.contains(t.getName(abc).getName(abc, abc.constants, new ArrayList<>(), true, false))) { + if (allFramesAccessibilityTraitNames.contains(t.getName(abc).getName(new LinkedHashSet<>(), abc, abc.constants, new ArrayList<>(), true, false))) { if (t instanceof TraitMethodGetterSetter) { TraitMethodGetterSetter tm = (TraitMethodGetterSetter) t; MethodBody traitBody = abc.findBody(tm.method_info); List traitCallStack = new ArrayList<>(); traitCallStack.add(traitBody); - traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>()); + traitBody.convert(swfVersion, traitCallStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>(), new LinkedHashSet<>()); if (traitBody.convertedItems != null) { for (int j = 0; j < traitBody.convertedItems.size(); j++) { GraphTargetItem ti = traitBody.convertedItems.get(j); @@ -3479,7 +3480,7 @@ public class XFLConverter { try { List callStack = new ArrayList<>(); callStack.add(constructorBody); - constructorBody.convert(swfVersion, callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), GraphTextWriter.TRAIT_INSTANCE_INITIALIZER, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>()); + constructorBody.convert(swfVersion, callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, constructorMethodIndex, pack.scriptIndex, classIndex, abc, null, new ScopeStack(), GraphTextWriter.TRAIT_INSTANCE_INITIALIZER, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>(), new LinkedHashSet<>()); Map frameToTraitName = new HashMap<>(); @@ -3511,14 +3512,14 @@ public class XFLConverter { int frame = frameItem.intValue(); if (callProp.arguments.get(i + 1) instanceof GetLexAVM2Item) { GetLexAVM2Item lex = (GetLexAVM2Item) callProp.arguments.get(i + 1); - frameToTraitName.put(frame, lex.propertyName.getName(abc, abc.constants, new ArrayList<>(), true, false)); + frameToTraitName.put(frame, lex.propertyName.getName(new LinkedHashSet<>(), abc, abc.constants, new ArrayList<>(), true, false)); } else if (callProp.arguments.get(i + 1) instanceof GetPropertyAVM2Item) { GetPropertyAVM2Item getProp = (GetPropertyAVM2Item) callProp.arguments.get(i + 1); if (getProp.object instanceof ThisAVM2Item) { if (getProp.propertyName instanceof FullMultinameAVM2Item) { FullMultinameAVM2Item framePropName = (FullMultinameAVM2Item) getProp.propertyName; int multinameIndex = framePropName.multinameIndex; - frameToTraitName.put(frame, abc.constants.getMultiname(multinameIndex).getName(abc, abc.constants, new ArrayList<>(), true, false)); + frameToTraitName.put(frame, abc.constants.getMultiname(multinameIndex).getName(new LinkedHashSet<>(), abc, abc.constants, new ArrayList<>(), true, false)); } } } @@ -3532,7 +3533,7 @@ public class XFLConverter { Map multinameToMethodTrait = new HashMap<>(); for (Trait trait : instanceInfo.instance_traits.traits) { if (trait instanceof TraitMethodGetterSetter) { - multinameToMethodTrait.put(abc.constants.getMultiname(trait.name_index).getName(abc, abc.constants, new ArrayList<>(), true, false), (TraitMethodGetterSetter) trait); + multinameToMethodTrait.put(abc.constants.getMultiname(trait.name_index).getName(new LinkedHashSet<>(), abc, abc.constants, new ArrayList<>(), true, false), (TraitMethodGetterSetter) trait); } } @@ -3547,7 +3548,7 @@ public class XFLConverter { callStack = new ArrayList<>(); callStack.add(frameBody); - frameBody.convert(swfVersion, callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, methodIndex, pack.scriptIndex, classIndex, abc, methodTrait, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>()); + frameBody.convert(swfVersion, callStack, abcIndex, new ConvertData(), "??", ScriptExportMode.AS, false, methodIndex, pack.scriptIndex, classIndex, abc, methodTrait, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), new Traits(), true, new HashSet<>(), new ArrayList<>(), new LinkedHashSet<>()); if (frameBody.convertedItems != null) { for (int i = 0; i < frameBody.convertedItems.size(); i++) { @@ -3569,7 +3570,7 @@ public class XFLConverter { } StringBuilderTextWriter writer = new StringBuilderTextWriter(Configuration.getCodeFormatting(), scriptBuilder); - frameBody.toString(swfVersion, callStack, abcIndex, "??", ScriptExportMode.AS, abc, methodTrait, writer, new ArrayList<>(), new HashSet<>()); + frameBody.toString(new LinkedHashSet<>(), swfVersion, callStack, abcIndex, "??", ScriptExportMode.AS, abc, methodTrait, writer, new ArrayList<>(), new HashSet<>()); String script = scriptBuilder.toString(); ret.put(frame, script); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/DottedChain.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/DottedChain.java index f7d940974..e3a02865e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/DottedChain.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/DottedChain.java @@ -23,8 +23,10 @@ import java.io.File; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; +import java.util.Set; /** * Dotted chain class. Represents a chain of names separated by dots. @@ -450,13 +452,14 @@ public class DottedChain implements Serializable, Comparable { /** * To string. * + * @param usedDeobfuscations Used deobfuscations * @param swf SWF * @param as3 Whether to print as AS3 * @param raw Whether to print raw (without deobfuscation) * @param withSuffix Whether to print with suffix * @return String */ - protected String toString(SWF swf, boolean as3, boolean raw, boolean withSuffix) { + protected String toString(Set usedDeobfuscations, SWF swf, boolean as3, boolean raw, boolean withSuffix) { if (parts.isEmpty()) { return ""; } @@ -471,7 +474,7 @@ public class DottedChain implements Serializable, Comparable { } String part = parts.get(i).name; boolean lastStar = i == parts.size() - 1 && "*".equals(part); - ret.append((raw || lastStar) ? part : IdentifiersDeobfuscation.printIdentifier(swf, as3, part)); + ret.append((raw || lastStar) ? part : IdentifiersDeobfuscation.printIdentifier(swf, usedDeobfuscations, as3, part)); if (withSuffix) { ret.append(parts.get(i).namespaceSuffix); } @@ -497,7 +500,7 @@ public class DottedChain implements Serializable, Comparable { ret.append(File.separator); } - ret.append(Helper.makeFileName(IdentifiersDeobfuscation.printIdentifier(swf, true, parts.get(i).name))); + ret.append(Helper.makeFileName(IdentifiersDeobfuscation.printIdentifier(swf, new LinkedHashSet<>(), true, parts.get(i).name))); } return ret.toString(); } @@ -519,11 +522,12 @@ public class DottedChain implements Serializable, Comparable { * To printable string. * * @param swf SWF + * @param usedDeobfuscations Used deobfuscations * @param as3 Whether to print as AS3 * @return Printable string */ - public String toPrintableString(SWF swf, boolean as3) { - return toString(swf, as3, false, true); + public String toPrintableString(Set usedDeobfuscations, SWF swf, boolean as3) { + return toString(usedDeobfuscations, swf, as3, false, true); } /** @@ -533,7 +537,7 @@ public class DottedChain implements Serializable, Comparable { * @return Raw string */ public String toRawString() { //Is SUFFIX correctly handled? - return toString(null, false/*ignored*/, true, true); + return toString(new LinkedHashSet<>(), null, false/*ignored*/, true, true); } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TypeItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TypeItem.java index 24818570e..80f7928b2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TypeItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TypeItem.java @@ -163,9 +163,9 @@ public class TypeItem extends GraphTargetItem { boolean as3 = localData.constantsAvm2 != null; if (localData.fullyQualifiedNames.contains(DottedChain.parseWithSuffix(fullTypeName.getLast()))) { - writer.hilightSpecial(fullTypeName.toPrintableString(localData.swf, as3), HighlightSpecialType.TYPE_NAME, fullTypeName.toRawString()); + writer.hilightSpecial(fullTypeName.toPrintableString(localData.usedDeobfuscations, localData.swf, as3), HighlightSpecialType.TYPE_NAME, fullTypeName.toRawString()); } else { - writer.hilightSpecial(IdentifiersDeobfuscation.printIdentifier(localData.swf, as3, fullTypeName.getLast()), HighlightSpecialType.TYPE_NAME, fullTypeName.toRawString()); + writer.hilightSpecial(IdentifiersDeobfuscation.printIdentifier(localData.swf, localData.usedDeobfuscations, as3, fullTypeName.getLast()), HighlightSpecialType.TYPE_NAME, fullTypeName.toRawString()); } return writer; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LocalData.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LocalData.java index b9afdb5f2..8de00f0d7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LocalData.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LocalData.java @@ -26,6 +26,7 @@ import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; import com.jpexs.decompiler.graph.DottedChain; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -41,6 +42,11 @@ public class LocalData { */ public static LocalData empty = new LocalData(); + /** + * Used deobfuscations + */ + public Set usedDeobfuscations; + /** * SWF */ @@ -100,12 +106,15 @@ public class LocalData { * Creates a new local data * * @param constants Constant pool + * @param swf SWF + * @param usedDeobfuscations Used deobfuscations * @return Local data */ - public static LocalData create(ConstantPool constants, SWF swf) { + public static LocalData create(ConstantPool constants, SWF swf, Set usedDeobfuscations) { LocalData localData = new LocalData(); localData.constants = constants; localData.swf = swf; + localData.usedDeobfuscations = usedDeobfuscations; return localData; } @@ -119,9 +128,10 @@ public class LocalData { * @param seenMethods Seen methods * @param exportMode Export mode * @param swfVersion SWF version + * @param usedDeobfuscations Used deobfuscations * @return Local data */ - public static LocalData create(List callStack, AbcIndexing abcIndex, ABC abc, HashMap localRegNames, List fullyQualifiedNames, Set seenMethods, ScriptExportMode exportMode, int swfVersion) { + public static LocalData create(List callStack, AbcIndexing abcIndex, ABC abc, HashMap localRegNames, List fullyQualifiedNames, Set seenMethods, ScriptExportMode exportMode, int swfVersion, Set usedDeobfuscations) { LocalData localData = new LocalData(); localData.abc = abc; localData.constantsAvm2 = abc.constants; @@ -133,6 +143,7 @@ public class LocalData { localData.exportMode = exportMode; localData.swfVersion = swfVersion; localData.swf = abc.getSwf(); + localData.usedDeobfuscations = usedDeobfuscations; return localData; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/helpers/Helper.java b/libsrc/ffdec_lib/src/com/jpexs/helpers/Helper.java index 1129ba7e1..8b52a13bc 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/helpers/Helper.java +++ b/libsrc/ffdec_lib/src/com/jpexs/helpers/Helper.java @@ -58,6 +58,7 @@ import java.util.Base64; import java.util.BitSet; import java.util.Collection; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Scanner; @@ -248,7 +249,7 @@ public class Helper { */ public static String escapeExportname(SWF swf, String s, boolean quote) { if (s.startsWith("__Packages.")) { - return DottedChain.parseNoSuffix(s).toPrintableString(swf, false); + return DottedChain.parseNoSuffix(s).toPrintableString(new LinkedHashSet<>(), swf, false); } return (quote ? "\"" : "") + escapePCodeString(s) + (quote ? "\"" : ""); } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DecompileTestBase.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DecompileTestBase.java index 9d6515ee4..5330f2c77 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DecompileTestBase.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DecompileTestBase.java @@ -35,8 +35,10 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; @@ -107,9 +109,10 @@ public abstract class ActionScript3DecompileTestBase extends ActionScriptTestBas List callStack = new ArrayList<>(); callStack.add(abc.bodies.get(bodyIndex)); - abc.bodies.get(bodyIndex).convert(swf.version, callStack, swf.getAbcIndex(), new ConvertData(), "run", ScriptExportMode.AS, isStatic, abc.bodies.get(bodyIndex).method_info, scriptIndex, clsIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), abc.instance_info.get(clsIndex).instance_traits, true, new HashSet<>(), new ArrayList<>()); + Set usedDeobfuscations = new LinkedHashSet<>(); + abc.bodies.get(bodyIndex).convert(swf.version, callStack, swf.getAbcIndex(), new ConvertData(), "run", ScriptExportMode.AS, isStatic, abc.bodies.get(bodyIndex).method_info, scriptIndex, clsIndex, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), abc.instance_info.get(clsIndex).instance_traits, true, new HashSet<>(), new ArrayList<>(), usedDeobfuscations); writer = new HighlightedTextWriter(new CodeFormatting(), false); - abc.bodies.get(bodyIndex).toString(swf.version, callStack, swf.getAbcIndex(), "run", ScriptExportMode.AS, abc, null, writer, new ArrayList<>(), new HashSet<>()); + abc.bodies.get(bodyIndex).toString(usedDeobfuscations, swf.version, callStack, swf.getAbcIndex(), "run", ScriptExportMode.AS, abc, null, writer, new ArrayList<>(), new HashSet<>()); } catch (InterruptedException ex) { fail(); return; diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DeobfuscatorTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DeobfuscatorTest.java index 853a151c7..3015549a2 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DeobfuscatorTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3DeobfuscatorTest.java @@ -52,6 +52,7 @@ import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.concurrent.TimeoutException; import macromedia.asc.util.Decimal128; @@ -168,7 +169,7 @@ public class ActionScript3DeobfuscatorTest extends ActionScriptTestBase { code.removeTraps(null, 0, b, abc, 0, -1, true, pCode); code.removeLabelsAndDebugLine(b); HighlightedTextWriter writer = new HighlightedTextWriter(new CodeFormatting(), false); - String actual = b.toSource(10, new ArrayList<>(), swf.getAbcIndex(), 0, new HashSet<>()); + String actual = b.toSource(new LinkedHashSet<>(), 10, new ArrayList<>(), swf.getAbcIndex(), 0, new HashSet<>()); actual = actual.replace("\r\n", "\n"); assertEquals(actual, expected); } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3OptionalParametersTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3OptionalParametersTest.java index 040afc7a3..e8647729f 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3OptionalParametersTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3OptionalParametersTest.java @@ -24,6 +24,7 @@ import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.graph.DottedChain; import java.io.IOException; import java.util.ArrayList; +import java.util.LinkedHashSet; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import org.testng.annotations.BeforeClass; @@ -65,7 +66,7 @@ public class ActionScript3OptionalParametersTest extends ActionScript3DecompileT assertTrue(methodInfo > -1); assertTrue(bodyIndex > -1); HighlightedTextWriter writer = new HighlightedTextWriter(new CodeFormatting(), false); - abc.method_info.get(methodInfo).getParamStr(writer, abc.constants, abc.bodies.get(bodyIndex), abc, new ArrayList<>()); + abc.method_info.get(methodInfo).getParamStr(writer, abc.constants, abc.bodies.get(bodyIndex), abc, new ArrayList<>(), new LinkedHashSet<>()); writer.finishHilights(); String actualResult = writer.toString().replaceAll("[ \r\n]", ""); String expectedResult = "p1:Event=null,p2:Number=1,p3:Number=-1,p4:Number=-1.1,p5:Number=-1.1,p6:String=\"a\""; diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java index 712761046..38f99e8a5 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java @@ -38,8 +38,10 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.TreeMap; /** @@ -127,7 +129,7 @@ public class AS3Generator { for (Trait t : abc.instance_info.get(classId).instance_traits.traits) { if (t instanceof TraitMethodGetterSetter) { - String name = t.getName(abc).getName(abc, abc.constants, null, true, true); + String name = t.getName(abc).getName(new LinkedHashSet<>(), abc, abc.constants, null, true, true); String clsName = pack.getClassPath().className; String lower = clsName.substring(0, 1).toLowerCase() + clsName.substring(1); String identifier = swfAndIdentifierList[0][1]; @@ -159,8 +161,9 @@ public class AS3Generator { List callStack = new ArrayList<>(); callStack.add(b); - b.convert(swf.version, callStack, swf.getAbcIndex(), new ConvertData(), "", ScriptExportMode.AS, false, ((TraitMethodGetterSetter) t).method_info, pack.scriptIndex, classId, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), abc.instance_info.get(classId).instance_traits, true, new HashSet<>(), new ArrayList<>()); - b.toString(swf.version, callStack, swf.getAbcIndex(), "", ScriptExportMode.AS, abc, null, src, new ArrayList<>(), new HashSet<>()); + Set usedDeobfuscations = new LinkedHashSet<>(); + b.convert(swf.version, callStack, swf.getAbcIndex(), new ConvertData(), "", ScriptExportMode.AS, false, ((TraitMethodGetterSetter) t).method_info, pack.scriptIndex, classId, abc, null, new ScopeStack(), 0, new NulWriter(), new ArrayList<>(), abc.instance_info.get(classId).instance_traits, true, new HashSet<>(), new ArrayList<>(), usedDeobfuscations); + b.toString(usedDeobfuscations, swf.version, callStack, swf.getAbcIndex(), "", ScriptExportMode.AS, abc, null, src, new ArrayList<>(), new HashSet<>()); src.finishHilights(); String[] srcs = src.toString().split("[\r\n]+"); for (int i = 0; i < srcs.length; i++) { diff --git a/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java b/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java index bfd67b1c5..a5a7a8643 100644 --- a/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java +++ b/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java @@ -231,6 +231,7 @@ import java.util.GregorianCalendar; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Map; @@ -4354,9 +4355,9 @@ public class CommandLineArgumentParser { if (dcs != null) { if (dcs.contains(".")) { DottedChain dc = DottedChain.parseWithSuffix(dcs); - pw.println("documentClass=" + dc.toPrintableString(swf, true)); + pw.println("documentClass=" + dc.toPrintableString(new LinkedHashSet<>(), swf, true)); } else { - pw.println("documentClass=" + IdentifiersDeobfuscation.printIdentifier(swf, true, dcs)); + pw.println("documentClass=" + IdentifiersDeobfuscation.printIdentifier(swf, new LinkedHashSet<>(), true, dcs)); } } else { pw.println("documentClass="); diff --git a/src/com/jpexs/decompiler/flash/easygui/LibraryTreeTable.java b/src/com/jpexs/decompiler/flash/easygui/LibraryTreeTable.java index 0a8871008..9aa533476 100644 --- a/src/com/jpexs/decompiler/flash/easygui/LibraryTreeTable.java +++ b/src/com/jpexs/decompiler/flash/easygui/LibraryTreeTable.java @@ -41,6 +41,7 @@ import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import javax.swing.JLabel; @@ -397,7 +398,7 @@ public class LibraryTreeTable extends JTreeTable { if (!classNames.isEmpty()) { List escapedList = new ArrayList<>(); for (String className : classNames) { - escapedList.add(DottedChain.parseNoSuffix(className).toPrintableString(ct.getSwf(), true)); + escapedList.add(DottedChain.parseNoSuffix(className).toPrintableString(new LinkedHashSet<>(), ct.getSwf(), true)); } return String.join(", ", escapedList); } diff --git a/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java b/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java index c2a9ab962..96af02f28 100644 --- a/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java +++ b/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java @@ -53,6 +53,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -755,7 +756,7 @@ public class DebuggerHandler implements DebugConnectionListener { pkg = pkg.substring(pkg.indexOf(":") + 1); } - name = swfHash + ":" + DottedChain.parseWithSuffix(pkg).addWithSuffix(clsNameWithSuffix).toPrintableString(Main.getRunningSWF()/*???*/, con.isAS3); + name = swfHash + ":" + DottedChain.parseWithSuffix(pkg).addWithSuffix(clsNameWithSuffix).toPrintableString(new LinkedHashSet<>(), Main.getRunningSWF()/*???*/, con.isAS3); } } else { if (name.contains(":")) { diff --git a/src/com/jpexs/decompiler/flash/gui/FolderListPanel.java b/src/com/jpexs/decompiler/flash/gui/FolderListPanel.java index adabd6724..899f47eab 100644 --- a/src/com/jpexs/decompiler/flash/gui/FolderListPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/FolderListPanel.java @@ -37,6 +37,7 @@ import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Map; @@ -258,7 +259,7 @@ public class FolderListPanel extends JPanel { if (expName != null && !expName.isEmpty()) { String[] pathParts = expName.contains(".") ? expName.split("\\.") : new String[]{expName}; if (expName.startsWith("__Packages.")) { - s = IdentifiersDeobfuscation.printIdentifier(tag.getSwf(), false, pathParts[pathParts.length - 1]); + s = IdentifiersDeobfuscation.printIdentifier(tag.getSwf(), new LinkedHashSet<>(), false, pathParts[pathParts.length - 1]); } else { s = Helper.escapeExportname(tag.getSwf(), expName, false); } diff --git a/src/com/jpexs/decompiler/flash/gui/GenericTagTreePanel.java b/src/com/jpexs/decompiler/flash/gui/GenericTagTreePanel.java index 1d6ff87fb..16708690a 100644 --- a/src/com/jpexs/decompiler/flash/gui/GenericTagTreePanel.java +++ b/src/com/jpexs/decompiler/flash/gui/GenericTagTreePanel.java @@ -84,6 +84,7 @@ import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.EventObject; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -916,7 +917,7 @@ public class GenericTagTreePanel extends GenericTagPanel { if (di.exportName()) { valStr += " = " + escapeHtml(Helper.escapeExportname(swf, val.toString(), true)); } else { - valStr += " = " + escapeHtml(DottedChain.parseNoSuffix(val.toString()).toPrintableString(swf, di.as3())); + valStr += " = " + escapeHtml(DottedChain.parseNoSuffix(val.toString()).toPrintableString(new LinkedHashSet<>(), swf, di.as3())); } } else if (val instanceof byte[]) { valStr += " = " + ((byte[]) val).length + " byte"; diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 27b8be3a3..e2abc9702 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -2010,7 +2010,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se if (!oldName.equals(newName)) { if (oldName.equals(abcPanel.decompiledTextArea.getScriptLeaf().getClassPath().className)) { - scriptName = abcPanel.decompiledTextArea.getScriptLeaf().getClassPath().packageStr.add(newName, "").toPrintableString(swf, true); + scriptName = abcPanel.decompiledTextArea.getScriptLeaf().getClassPath().packageStr.add(newName, "").toPrintableString(new LinkedHashSet<>(), swf, true); } final String fScriptName = scriptName; @@ -2849,7 +2849,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se String documentClass = swf.getDocumentClass(); if (documentClass != null && currentView != VIEW_DUMP) { - String documentClassPrintable = DottedChain.parseNoSuffix(documentClass).toPrintableString(swf, true); + String documentClassPrintable = DottedChain.parseNoSuffix(documentClass).toPrintableString(new LinkedHashSet<>(), swf, true); List abcList = swf.getAbcList(); if (!abcList.isEmpty()) { ABCPanel abcPanel = getABCPanel(); diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ABCExplorerDialog.java b/src/com/jpexs/decompiler/flash/gui/abc/ABCExplorerDialog.java index 54134d834..5e392b780 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ABCExplorerDialog.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ABCExplorerDialog.java @@ -82,6 +82,7 @@ import java.util.ArrayDeque; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -965,11 +966,11 @@ public class ABCExplorerDialog extends AppDialog { } } if (found) { - DottedChain scriptNameDc = abc.script_info.get(scriptIndex).getSimplePackName(abc); + DottedChain scriptNameDc = abc.script_info.get(scriptIndex).getSimplePackName(abc, new LinkedHashSet<>()); if (scriptNameDc == null && scriptTraitIndex > -1) { - scriptNameDc = abc.script_info.get(scriptIndex).traits.traits.get(scriptTraitIndex).getName(abc).getNameWithNamespace(abc, abc.constants, false); + scriptNameDc = abc.script_info.get(scriptIndex).traits.traits.get(scriptTraitIndex).getName(abc).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, false); } - String scriptName = (scriptNameDc == null ? "script_" + scriptIndex : scriptNameDc.toPrintableString(abc.getSwf(), true)); + String scriptName = (scriptNameDc == null ? "script_" + scriptIndex : scriptNameDc.toPrintableString(new LinkedHashSet<>(), abc.getSwf(), true)); //mainPanel.gotoScriptTrait(abc.getSwf(), scriptName, classIndex, globalTraitIndex); mainPanel.gotoScriptMethod(abc.getSwf(), scriptName, searchMethodInfo); } @@ -999,8 +1000,8 @@ public class ABCExplorerDialog extends AppDialog { switch (vwi.type) { case SCRIPT_INFO: scriptIndex = vwi.getIndex(); - DottedChain scriptNameDc = abc.script_info.get(scriptIndex).getSimplePackName(abc); - String scriptName = (scriptNameDc == null ? "script_" + scriptIndex : scriptNameDc.toPrintableString(abc.getSwf(), true)); + DottedChain scriptNameDc = abc.script_info.get(scriptIndex).getSimplePackName(abc, new LinkedHashSet<>()); + String scriptName = (scriptNameDc == null ? "script_" + scriptIndex : scriptNameDc.toPrintableString(new LinkedHashSet<>(), abc.getSwf(), true)); mainPanel.gotoScriptName(abc.getSwf(), scriptName); break; case METHOD_BODY: @@ -1031,11 +1032,11 @@ public class ABCExplorerDialog extends AppDialog { } } if (scriptIndex != -1) { - DottedChain scriptNameDc2 = abc.script_info.get(scriptIndex).getSimplePackName(abc); + DottedChain scriptNameDc2 = abc.script_info.get(scriptIndex).getSimplePackName(abc, new LinkedHashSet<>()); if (scriptNameDc2 == null && scriptTraitIndex != -1) { - scriptNameDc2 = abc.script_info.get(scriptIndex).traits.traits.get(scriptTraitIndex).getName(abc).getNameWithNamespace(abc, abc.constants, false); + scriptNameDc2 = abc.script_info.get(scriptIndex).traits.traits.get(scriptTraitIndex).getName(abc).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, false); } - String scriptName2 = (scriptNameDc2 == null ? "script_" + scriptIndex : scriptNameDc2.toPrintableString(abc.getSwf(), true)); + String scriptName2 = (scriptNameDc2 == null ? "script_" + scriptIndex : scriptNameDc2.toPrintableString(new LinkedHashSet<>(), abc.getSwf(), true)); mainPanel.gotoScriptTrait(abc.getSwf(), scriptName2, classIndex, GraphTextWriter.TRAIT_CLASS_INITIALIZER); } break; @@ -1084,12 +1085,12 @@ public class ABCExplorerDialog extends AppDialog { } if (scriptIndex != -1) { - DottedChain scriptNameDc = abc.script_info.get(scriptIndex).getSimplePackName(abc); + DottedChain scriptNameDc = abc.script_info.get(scriptIndex).getSimplePackName(abc, new LinkedHashSet<>()); if (scriptNameDc == null && scriptTraitIndex != -1) { - scriptNameDc = abc.script_info.get(scriptIndex).traits.traits.get(scriptTraitIndex).getName(abc).getNameWithNamespace(abc, abc.constants, false); + scriptNameDc = abc.script_info.get(scriptIndex).traits.traits.get(scriptTraitIndex).getName(abc).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, false); } - String scriptName = (scriptNameDc == null ? "script_" + scriptIndex : scriptNameDc.toPrintableString(abc.getSwf(), true)); + String scriptName = (scriptNameDc == null ? "script_" + scriptIndex : scriptNameDc.toPrintableString(new LinkedHashSet<>(), abc.getSwf(), true)); mainPanel.gotoScriptTrait(abc.getSwf(), scriptName, classIndex, globalTraitIndex); } @@ -1654,7 +1655,7 @@ public class ABCExplorerDialog extends AppDialog { StringBuilder miStrSb = new StringBuilder(); miStrSb.append("("); StringBuilderTextWriter miParamStrSbW = new StringBuilderTextWriter(new CodeFormatting(), miStrSb); - mi.getParamStr(miParamStrSbW, abc.constants, null, abc, new ArrayList<>()); + mi.getParamStr(miParamStrSbW, abc.constants, null, abc, new ArrayList<>(), new LinkedHashSet<>()); miStrSb.append("): "); String miReturnType = mi.getReturnTypeRaw(abc, abc.constants, new ArrayList<>()); miStrSb.append(miReturnType); @@ -1678,7 +1679,7 @@ public class ABCExplorerDialog extends AppDialog { if (ii.name_index >= abc.constants.getMultinameCount() || ii.getName(abc.constants).namespace_index >= abc.constants.getNamespaceCount()) { iiName = ""; } else { - iiName = "\"" + Helper.escapePCodeString(ii.getName(abc.constants).getNameWithNamespace(abc, abc.constants, false).toRawString()) + "\""; + iiName = "\"" + Helper.escapePCodeString(ii.getName(abc.constants).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, false).toRawString()) + "\""; } return new ValueWithIndex(parent, currentLevelIndex, index, TreeType.INSTANCE_INFO, ii, iiName + (ii.instance_traits.traits.isEmpty() ? "" : ", " + ii.instance_traits.traits.size() + " traits"), title); case CLASS_INFO: @@ -1694,7 +1695,7 @@ public class ABCExplorerDialog extends AppDialog { ScriptInfo si = abc.script_info.get(index); String siName = ""; try { - DottedChain simplePackName = si.getSimplePackName(abc); + DottedChain simplePackName = si.getSimplePackName(abc, new LinkedHashSet<>()); if (simplePackName != null) { siName = " (\"" + Helper.escapePCodeString(simplePackName.toRawString()) + "\")"; } diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java index 37db64d99..35aebd9d6 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java @@ -121,6 +121,7 @@ import java.io.StringReader; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -936,9 +937,9 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener -1) { - scriptName = newAbc.instance_info.get(classIndex).getName(newAbc.constants).getNameWithNamespace(newAbc, newAbc.constants, true).toPrintableString(newAbc.getSwf(), true); + scriptName = newAbc.instance_info.get(classIndex).getName(newAbc.constants).getNameWithNamespace(new LinkedHashSet<>(), newAbc, newAbc.constants, true).toPrintableString(new LinkedHashSet<>(), newAbc.getSwf(), true); } else if (scriptIndex > -1) { - scriptName = newAbc.script_info.get(classIndex).getSimplePackName(newAbc).toPrintableString(newAbc.getSwf(), true); + scriptName = newAbc.script_info.get(classIndex).getSimplePackName(newAbc, new LinkedHashSet<>()).toPrintableString(new LinkedHashSet<>(), newAbc.getSwf(), true); } else { scriptName = ""; } @@ -1011,7 +1012,7 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener(), ci.abc.getSwf(), true); if (swfRef.getVal() == abc.getSwf()) { hilightScript(getOpenable(), scriptNamePrintable); @@ -1147,7 +1148,7 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener getClassTraits(Path className, boolean getStatic, boolean getInstance, boolean getInheritance) { List propertyDefList = new ArrayList<>(); List isStaticList = new ArrayList<>(); - abc.getSwf().getAbcIndex().getClassTraits(new TypeItem(className.toString()), abc, decompiledTextArea.getScriptIndex(), getStatic, getInstance, getInheritance, propertyDefList, isStaticList); + abc.getSwf().getAbcIndex().getClassTraits(new LinkedHashSet<>(), new TypeItem(className.toString()), abc, decompiledTextArea.getScriptIndex(), getStatic, getInstance, getInheritance, propertyDefList, isStaticList); List ret = new ArrayList<>(); for (int i = 0; i < propertyDefList.size(); i++) { AbcIndexing.PropertyDef def = propertyDefList.get(i); @@ -1166,7 +1167,7 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener(), ti.abc, ti.abc.constants, false).getStringParts()); callType = null; } else { continue; diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ClassesListTreeModel.java b/src/com/jpexs/decompiler/flash/gui/abc/ClassesListTreeModel.java index b77452a49..933a08131 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ClassesListTreeModel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ClassesListTreeModel.java @@ -29,6 +29,7 @@ import com.jpexs.decompiler.flash.treeitems.AS3ClassTreeItem; import com.jpexs.decompiler.flash.treeitems.Openable; import com.jpexs.decompiler.graph.DottedChain; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import javax.swing.event.TreeModelEvent; @@ -156,7 +157,7 @@ public class ClassesListTreeModel extends AS3ClassTreeItem implements TreeModel } if (flat) { - String fullName = packageStr.toPrintableString(abc.getSwf(), true); + String fullName = packageStr.toPrintableString(new LinkedHashSet<>(), abc.getSwf(), true); boolean defaultPackage = false; if (fullName.length() == 0) { fullName = AppResources.translate("package.default"); diff --git a/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java b/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java index 98b18ad3e..7f574ec9b 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java @@ -53,6 +53,7 @@ import com.jpexs.helpers.Reference; import java.awt.Point; import java.awt.event.MouseEvent; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; import java.util.Timer; import java.util.TimerTask; @@ -314,7 +315,7 @@ public class DecompiledEditorPane extends DebuggableEditorPane implements CaretL Highlighting ch = Highlighting.searchPos(highlightedText.getClassHighlights(), pos); int cindex = (int) ch.getProperties().index; ABC abc = getABC(); - type.setVal(abc.instance_info.get(cindex).getName(abc.constants).getNameWithNamespace(abc, abc.constants, true)); + type.setVal(abc.instance_info.get(cindex).getName(abc.constants).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, true)); linkTypeRef.setVal(LinkType.LINK_THIS_SCRIPT); return ch.startPos; } @@ -599,7 +600,7 @@ public class DecompiledEditorPane extends DebuggableEditorPane implements CaretL for (int i = 1; i < abc.constants.getMultinameCount(); i++) { Multiname m = abc.constants.getMultiname(i); if (m != null) { - if (typeName.equals(m.getNameWithNamespace(abc, abc.constants, true).toRawString())) { + if (typeName.equals(m.getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, true).toRawString())) { return i; } } @@ -660,7 +661,7 @@ public class DecompiledEditorPane extends DebuggableEditorPane implements CaretL if (tm != null) { String name = ""; if (classIndex > -1) { - name = abc.instance_info.get(classIndex).getName(abc.constants).getNameWithNamespace(abc, abc.constants, true).toPrintableString(abc.getSwf(), true); + name = abc.instance_info.get(classIndex).getName(abc.constants).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, true).toPrintableString(new LinkedHashSet<>(), abc.getSwf(), true); } Trait currentTrait = null; @@ -671,7 +672,7 @@ public class DecompiledEditorPane extends DebuggableEditorPane implements CaretL currentTrait = getCurrentTrait(); isStatic = abc.isStaticTraitId(classIndex, lastTraitIndex); if (currentTrait != null) { - name += ":" + currentTrait.getName(abc).getName(abc, abc.constants, null, false, true); + name += ":" + currentTrait.getName(abc).getName(new LinkedHashSet<>(), abc, abc.constants, null, false, true); } if (currentTrait instanceof TraitSlotConst) { @@ -729,14 +730,14 @@ public class DecompiledEditorPane extends DebuggableEditorPane implements CaretL } currentMethodHighlight = null; //currentTrait = null; - String name = classIndex == -1 ? "" : abc.instance_info.get(classIndex).getName(abc.constants).getNameWithNamespace(abc, abc.constants, true).toPrintableString(abc.getSwf(), true); + String name = classIndex == -1 ? "" : abc.instance_info.get(classIndex).getName(abc.constants).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, true).toPrintableString(new LinkedHashSet<>(), abc.getSwf(), true); currentTrait = getCurrentTrait(); isStatic = abc.isStaticTraitId(classIndex, lastTraitIndex); if (currentTrait != null) { if (!name.isEmpty()) { name += ":"; } - name += currentTrait.getName(abc).getName(abc, abc.constants, null, false, true); + name += currentTrait.getName(abc).getName(new LinkedHashSet<>(), abc, abc.constants, null, false, true); } int methodId; diff --git a/src/com/jpexs/decompiler/flash/gui/abc/DetailPanel.java b/src/com/jpexs/decompiler/flash/gui/abc/DetailPanel.java index 244121652..543dd4c43 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/DetailPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/DetailPanel.java @@ -35,6 +35,7 @@ import java.awt.FlowLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.util.HashMap; +import java.util.LinkedHashSet; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JComponent; @@ -303,7 +304,7 @@ public class DetailPanel extends JPanel implements TagEditorPanel { traitNameLabel.setText("-"); } else if (abcPanel != null) { Multiname traitName = trait.getName(abc); - String traitNameStr = traitName == null ? "" : traitName.getName(abc, abc.constants, null, false, true); + String traitNameStr = traitName == null ? "" : traitName.getName(new LinkedHashSet<>(), abc, abc.constants, null, false, true); traitNameLabel.setText(traitNameStr); } }); diff --git a/src/com/jpexs/decompiler/flash/gui/abc/TraitsListItem.java b/src/com/jpexs/decompiler/flash/gui/abc/TraitsListItem.java index 9657d49f1..3c7de8e18 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/TraitsListItem.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/TraitsListItem.java @@ -27,6 +27,7 @@ import com.jpexs.decompiler.flash.helpers.NulWriter; import com.jpexs.decompiler.flash.search.ABCSearchResult; import com.jpexs.decompiler.graph.DottedChain; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -80,9 +81,9 @@ public class TraitsListItem { return "__" + STR_SCRIPT_INITIALIZER; } if (isStatic) { - return abc.class_info.get(classIndex).static_traits.traits.get(index).getName(abc).getName(abc, abc.constants, null, false, true); + return abc.class_info.get(classIndex).static_traits.traits.get(index).getName(abc).getName(new LinkedHashSet<>(), abc, abc.constants, null, false, true); } else { - return abc.instance_info.get(classIndex).instance_traits.traits.get(index).getName(abc).getName(abc, abc.constants, null, false, true); + return abc.instance_info.get(classIndex).instance_traits.traits.get(index).getName(abc).getName(new LinkedHashSet<>(), abc, abc.constants, null, false, true); } } @@ -105,13 +106,13 @@ public class TraitsListItem { return ""; } Trait trait = traits.get(index); - trait.convertHeader(-1, null, convertData, "", abc, true, ScriptExportMode.AS, scriptIndex, classIndex, new NulWriter(), new ArrayList<>(), false); + trait.convertHeader(new LinkedHashSet<>(), -1, null, convertData, "", abc, true, ScriptExportMode.AS, scriptIndex, classIndex, new NulWriter(), new ArrayList<>(), false); HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), false); boolean insideInterface = false; if (classIndex > -1) { insideInterface = abc.instance_info.get(classIndex).isInterface(); } - trait.toStringHeader(-1, null, DottedChain.EMPTY /*??*/, convertData, "", abc, true, ScriptExportMode.AS, scriptIndex, classIndex, writer, new ArrayList<>(), false, insideInterface); + trait.toStringHeader(new LinkedHashSet<>(), -1, null, DottedChain.EMPTY /*??*/, convertData, "", abc, true, ScriptExportMode.AS, scriptIndex, classIndex, writer, new ArrayList<>(), false, insideInterface); writer.finishHilights(); s = writer.toString(); } else { @@ -121,13 +122,13 @@ public class TraitsListItem { return ""; } Trait trait = traits.get(index); - trait.convertHeader(-1, null, convertData, "", abc, false, ScriptExportMode.AS, scriptIndex, classIndex, new NulWriter(), new ArrayList<>(), false); + trait.convertHeader(new LinkedHashSet<>(), -1, null, convertData, "", abc, false, ScriptExportMode.AS, scriptIndex, classIndex, new NulWriter(), new ArrayList<>(), false); HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), false); boolean insideInterface = false; if (classIndex > -1) { insideInterface = abc.instance_info.get(classIndex).isInterface(); } - trait.toStringHeader(-1, null, DottedChain.EMPTY /*??*/, convertData, "", abc, false, ScriptExportMode.AS, scriptIndex, classIndex, writer, new ArrayList<>(), false, insideInterface); + trait.toStringHeader(new LinkedHashSet<>(), -1, null, DottedChain.EMPTY /*??*/, convertData, "", abc, false, ScriptExportMode.AS, scriptIndex, classIndex, writer, new ArrayList<>(), false, insideInterface); writer.finishHilights(); s = writer.toString(); } diff --git a/src/com/jpexs/decompiler/flash/gui/abc/UsageFrame.java b/src/com/jpexs/decompiler/flash/gui/abc/UsageFrame.java index f3c58ee4c..47a3f9910 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/UsageFrame.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/UsageFrame.java @@ -36,6 +36,7 @@ import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; +import java.util.LinkedHashSet; import java.util.List; import java.util.Timer; import java.util.TimerTask; @@ -106,7 +107,7 @@ public class UsageFrame extends AppDialog implements MouseListener { cont.add(new FasterScrollPane(usageList), BorderLayout.CENTER); cont.add(buttonsPanel, BorderLayout.SOUTH); setSize(400, 300); - setTitle((definitions ? translate("dialog.title.declaration") : translate("dialog.title")) + abc.constants.getMultiname(multinameIndex).getNameWithNamespace(abc, abc.constants, true).toPrintableString(abc.getSwf(), true)); + setTitle((definitions ? translate("dialog.title.declaration") : translate("dialog.title")) + abc.constants.getMultiname(multinameIndex).getNameWithNamespace(new LinkedHashSet<>(), abc, abc.constants, true).toPrintableString(new LinkedHashSet<>(), abc.getSwf(), true)); View.centerScreen(this); View.setWindowIcon(this); } @@ -164,9 +165,9 @@ public class UsageFrame extends AppDialog implements MouseListener { decompiledTextArea.addScriptListener(setTrait); String scriptName; if (icu.getClassIndex() > -1) { - scriptName = icu.getAbc().instance_info.get(icu.getClassIndex()).getName(icu.getAbc().constants).getNameWithNamespace(icu.getAbc(), icu.getAbc().constants, true).toPrintableString(icu.getAbc().getSwf(), true); + scriptName = icu.getAbc().instance_info.get(icu.getClassIndex()).getName(icu.getAbc().constants).getNameWithNamespace(new LinkedHashSet<>(), icu.getAbc(), icu.getAbc().constants, true).toPrintableString(new LinkedHashSet<>(), icu.getAbc().getSwf(), true); } else if (icu.getScriptIndex() > -1) { - scriptName = icu.getAbc().script_info.get(icu.getScriptIndex()).getSimplePackName(icu.getAbc()).toPrintableString(icu.getAbc().getSwf(), true); + scriptName = icu.getAbc().script_info.get(icu.getScriptIndex()).getSimplePackName(icu.getAbc(), new LinkedHashSet<>()).toPrintableString(new LinkedHashSet<>(), icu.getAbc().getSwf(), true); } else { scriptName = ""; } diff --git a/src/com/jpexs/decompiler/flash/gui/abc/tablemodels/MultinameTableModel.java b/src/com/jpexs/decompiler/flash/gui/abc/tablemodels/MultinameTableModel.java index 5acc7cc4f..547bb852d 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/tablemodels/MultinameTableModel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/tablemodels/MultinameTableModel.java @@ -17,6 +17,7 @@ package com.jpexs.decompiler.flash.gui.abc.tablemodels; import com.jpexs.decompiler.flash.abc.ABC; +import java.util.LinkedHashSet; import javax.swing.event.TableModelListener; import javax.swing.table.TableModel; @@ -130,7 +131,7 @@ public class MultinameTableModel implements TableModel { if (abc.constants.getMultiname(rowIndex).name_index == -1) { return ""; } - return abc.constants.getMultiname(rowIndex).getName(abc, abc.constants, null, true, true); + return abc.constants.getMultiname(rowIndex).getName(new LinkedHashSet<>(), abc, abc.constants, null, true, true); case 3: if (rowIndex == 0) { return ""; diff --git a/src/com/jpexs/decompiler/flash/gui/debugger/DebuggerTools.java b/src/com/jpexs/decompiler/flash/gui/debugger/DebuggerTools.java index 96b5a6400..3caa2f87e 100644 --- a/src/com/jpexs/decompiler/flash/gui/debugger/DebuggerTools.java +++ b/src/com/jpexs/decompiler/flash/gui/debugger/DebuggerTools.java @@ -30,6 +30,7 @@ import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.helpers.Helper; import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedHashSet; import java.util.List; import java.util.Random; import java.util.logging.Level; @@ -106,9 +107,9 @@ public class DebuggerTools { int debuggerNs = a.constants.getNamespaceId(Namespace.KIND_PACKAGE, debuggerPkg, 0, true); for (int i = 1; i < a.constants.getMultinameCount(); i++) { Multiname m = a.constants.getMultiname(i); - String rawNsName = m.getNameWithNamespace(a, a.constants, true).toRawString(); + String rawNsName = m.getNameWithNamespace(new LinkedHashSet<>(), a, a.constants, true).toRawString(); if (m.kind == Multiname.MULTINAME) { - String simpleName = m.getName(a, a.constants, new ArrayList<>(), true, false); + String simpleName = m.getName(new LinkedHashSet<>(), a, a.constants, new ArrayList<>(), true, false); String nsToSearch; if (displayTypes.contains(simpleName)) { nsToSearch = "flash.display"; @@ -132,7 +133,7 @@ public class DebuggerTools { m.kind = Multiname.QNAME; m.namespace_index = nsFoundId; m.namespace_set_index = 0; - rawNsName = m.getNameWithNamespace(a, a.constants, true).toRawString(); + rawNsName = m.getNameWithNamespace(new LinkedHashSet<>(), a, a.constants, true).toRawString(); } } if (null != rawNsName) { @@ -177,7 +178,7 @@ public class DebuggerTools { ABC a = ct.getABC(); for (int i = 1; i < a.constants.getMultinameCount(); i++) { Multiname m = a.constants.getMultiname(i); - if ("trace".equals(m.getNameWithNamespace(a, a.constants, true).toRawString())) { + if ("trace".equals(m.getNameWithNamespace(new LinkedHashSet<>(), a, a.constants, true).toRawString())) { m.namespace_index = a.constants.getNamespaceId(Namespace.KIND_PACKAGE, debuggerPkg, 0, true); m.name_index = a.constants.getStringId(fname, true); ((Tag) ct).setModified(true); @@ -200,7 +201,7 @@ public class DebuggerTools { ABC a = ct.getABC(); for (int i = 1; i < a.constants.getMultinameCount(); i++) { Multiname m = a.constants.getMultiname(i); - String packageStr = m.getNameWithNamespace(a, a.constants, true).toString(); + String packageStr = m.getNameWithNamespace(new LinkedHashSet<>(), a, a.constants, true).toString(); if (isDebuggerClass(packageStr, "debugTrace") || isDebuggerClass(packageStr, "debugAlert") || isDebuggerClass(packageStr, "debugSocket") diff --git a/src/com/jpexs/decompiler/flash/gui/generictageditors/StringEditor.java b/src/com/jpexs/decompiler/flash/gui/generictageditors/StringEditor.java index d97fff762..58f481571 100644 --- a/src/com/jpexs/decompiler/flash/gui/generictageditors/StringEditor.java +++ b/src/com/jpexs/decompiler/flash/gui/generictageditors/StringEditor.java @@ -26,6 +26,7 @@ import java.awt.Dimension; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.lang.reflect.Field; +import java.util.LinkedHashSet; import java.util.Objects; import javax.swing.JTextArea; @@ -95,7 +96,7 @@ public class StringEditor extends JTextArea implements GenericTagEditor { if (di.exportName()) { newValue = Helper.escapeExportname(swf, newValue, false); } else { - newValue = DottedChain.parseNoSuffix(newValue).toPrintableString(swf, di.as3()); + newValue = DottedChain.parseNoSuffix(newValue).toPrintableString(new LinkedHashSet<>(), swf, di.as3()); } } setText(newValue); diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java index 546efee4f..c8e40a7d2 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java @@ -99,6 +99,7 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -352,7 +353,7 @@ public class TagTree extends AbstractTagTree { if (expName != null && !expName.isEmpty()) { String[] pathParts = expName.contains(".") ? expName.split("\\.") : new String[]{expName}; if (expName.startsWith("__Packages.")) { - return IdentifiersDeobfuscation.printIdentifier(tag.getSwf(), false, pathParts[pathParts.length - 1]); + return IdentifiersDeobfuscation.printIdentifier(tag.getSwf(), new LinkedHashSet<>(), false, pathParts[pathParts.length - 1]); } else { return Helper.escapeExportname(tag.getSwf(), expName, false); } diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java index ed2306379..ffc3b537c 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java @@ -3071,7 +3071,7 @@ public class TagTreeContextMenu extends JPopupMenu { DottedChain classDottedChain = new DottedChain(parts); try { - List regActions = regParser.actionsFromString("Object.registerClass(\"" + Helper.escapePCodeString(identifier) + "\"," + classDottedChain.toPrintableString(swf, false) + ");", swf.getCharset()); + List regActions = regParser.actionsFromString("Object.registerClass(\"" + Helper.escapePCodeString(identifier) + "\"," + classDottedChain.toPrintableString(new LinkedHashSet<>(), swf, false) + ");", swf.getCharset()); regDoInit.setActions(regActions); } catch (ActionParseException | IOException | CompilationException | InterruptedException ex) { //ignore @@ -3116,7 +3116,7 @@ public class TagTreeContextMenu extends JPopupMenu { DottedChain dcParent = new DottedChain(partsParent); try { - List actions = parser.actionsFromString("class " + classDottedChain.toPrintableString(swf, false) + (classParent.isEmpty() ? "" : " extends " + dcParent.toPrintableString(swf, false)) + "{}", swf.getCharset()); + List actions = parser.actionsFromString("class " + classDottedChain.toPrintableString(new LinkedHashSet<>(), swf, false) + (classParent.isEmpty() ? "" : " extends " + dcParent.toPrintableString(new LinkedHashSet<>(), swf, false)) + "{}", swf.getCharset()); classDoInit.setActions(actions); } catch (ActionParseException | IOException | CompilationException | InterruptedException ex) { //ignore @@ -3259,9 +3259,9 @@ public class TagTreeContextMenu extends JPopupMenu { ActionScript3Parser parser = new ActionScript3Parser(abcIndex); DottedChain dc = new DottedChain(pkgParts); - String script = "package " + dc.toPrintableString(swf, true) + " {" + String script = "package " + dc.toPrintableString(new LinkedHashSet<>(), swf, true) + " {" + (parentClassName.isEmpty() ? "" : "import " + parentClassName + ";") - + "public class " + IdentifiersDeobfuscation.printIdentifier(swf, true, classSimpleName) + (parentClassName.isEmpty() ? "" : " extends " + parentClassName) + " {" + + "public class " + IdentifiersDeobfuscation.printIdentifier(swf, new LinkedHashSet<>(), true, classSimpleName) + (parentClassName.isEmpty() ? "" : " extends " + parentClassName) + " {" + " }" + "}"; parser.addScript(script, fileName, 0, 0, swf.getDocumentClass(), selectedAbcContainer.getABC()); @@ -3361,7 +3361,7 @@ public class TagTreeContextMenu extends JPopupMenu { while (it instanceof AS2Package) { pkg = (AS2Package) it; if (!pkg.isDefaultPackage()) { - pkgParts.add(0, DottedChain.parseNoSuffix(pkg.getName()).toPrintableString(swf, false)); + pkgParts.add(0, DottedChain.parseNoSuffix(pkg.getName()).toPrintableString(new LinkedHashSet<>(), swf, false)); } it = model.getParent(it); } @@ -3489,8 +3489,8 @@ public class TagTreeContextMenu extends JPopupMenu { ActionScript3Parser parser = new ActionScript3Parser(abcIndex); DottedChain dc = new DottedChain(pkgParts); - String script = "package " + dc.toPrintableString(doAbc.getSwf(), true) + " {" - + "public class " + IdentifiersDeobfuscation.printIdentifier(swf, true, classSimpleName) + " {" + String script = "package " + dc.toPrintableString(new LinkedHashSet<>(), doAbc.getSwf(), true) + " {" + + "public class " + IdentifiersDeobfuscation.printIdentifier(swf, new LinkedHashSet<>(), true, classSimpleName) + " {" + " }" + "}"; parser.addScript(script, fileName, 0, 0, swf.getDocumentClass(), doAbc.getABC()); @@ -3946,7 +3946,7 @@ public class TagTreeContextMenu extends JPopupMenu { DottedChain dc = new DottedChain(parts); try { - List actions = parser.actionsFromString("class " + dc.toPrintableString(swf, false) + "{}", swf.getCharset()); + List actions = parser.actionsFromString("class " + dc.toPrintableString(new LinkedHashSet<>(), swf, false) + "{}", swf.getCharset()); doInit.setActions(actions); } catch (ActionParseException | IOException | CompilationException | InterruptedException ex) { diff --git a/test/com/jpexs/decompiler/flash/gui/FlashPlayerTest.java b/test/com/jpexs/decompiler/flash/gui/FlashPlayerTest.java index a6b507f1d..ff47466a4 100644 --- a/test/com/jpexs/decompiler/flash/gui/FlashPlayerTest.java +++ b/test/com/jpexs/decompiler/flash/gui/FlashPlayerTest.java @@ -87,6 +87,7 @@ import java.io.FilenameFilter; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Random; import static org.testng.Assert.assertEquals; @@ -559,7 +560,7 @@ public class FlashPlayerTest { task.actions = newActions; List output = new ArrayList<>(); - ActionLocalData localData = new ActionLocalData(null, false, new HashMap<>()); + ActionLocalData localData = new ActionLocalData(null, false, new HashMap<>(), new LinkedHashSet<>()); TranslateStack stack = new TranslateStack(""); for (Action a : newActions) { a.translate(localData, stack, output, 0, "");