From 55ee4586de4287f69ff7cc096644fdc5e53e0bb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 26 Jul 2025 12:20:21 +0200 Subject: [PATCH] Replacements table in AS1/2, not much useful since eval() is used in most cases --- lib/jsyntaxpane-0.9.5.jar | Bin 609611 -> 609615 bytes .../flash/IdentifiersDeobfuscation.java | 107 +++++++++++++++++- .../src/com/jpexs/decompiler/flash/SWF.java | 18 +-- .../com/jpexs/decompiler/flash/abc/ABC.java | 7 +- .../decompiler/flash/abc/ScriptPack.java | 17 +-- .../flash/abc/avm2/AVM2Deobfuscation.java | 4 +- .../parser/script/ActionScript3Parser.java | 33 +----- .../jpexs/decompiler/flash/action/Action.java | 7 +- .../action/model/DefineLocalActionItem.java | 2 +- .../action/model/FunctionActionItem.java | 6 +- .../parser/script/ActionScript2Parser.java | 49 +++++--- .../flash/locales/AppResources.properties | 2 + .../flash/locales/AppResources_cs.properties | 2 + .../decompiler/graph/model/LocalData.java | 5 + .../jsyntaxpane/lexers/actionscript.flex | 2 +- 15 files changed, 177 insertions(+), 84 deletions(-) diff --git a/lib/jsyntaxpane-0.9.5.jar b/lib/jsyntaxpane-0.9.5.jar index d1549edd4f25f7ab50b3fc425f111ebb1a143b54..fecf0721a734a57adf2d56077ae0a9805e9d3b8e 100644 GIT binary patch delta 13830 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 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 9e561f9c8..9fc0a2f74 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/IdentifiersDeobfuscation.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/IdentifiersDeobfuscation.java @@ -17,12 +17,22 @@ package com.jpexs.decompiler.flash; import com.jpexs.decompiler.flash.abc.RenameType; +import com.jpexs.decompiler.flash.abc.avm2.AVM2Deobfuscation; +import com.jpexs.decompiler.flash.abc.avm2.parser.AVM2ParseException; +import com.jpexs.decompiler.flash.abc.avm2.parser.script.ActionScriptLexer; +import com.jpexs.decompiler.flash.abc.avm2.parser.script.ParsedSymbol; +import com.jpexs.decompiler.flash.abc.avm2.parser.script.SymbolType; +import com.jpexs.decompiler.flash.asdoc.ActionScriptDocParser; +import com.jpexs.decompiler.flash.asdoc.AsDocComment; +import com.jpexs.decompiler.flash.asdoc.AsDocTag; import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.flash.tags.DefineSpriteTag; import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.flash.tags.base.PlaceObjectTypeTag; import com.jpexs.decompiler.graph.DottedChain; +import com.jpexs.decompiler.graph.model.DocCommentItem; +import com.jpexs.decompiler.graph.model.LocalData; import com.jpexs.helpers.Cache; import com.jpexs.helpers.Helper; import java.util.ArrayList; @@ -34,6 +44,7 @@ import java.util.Map; import java.util.Random; import java.util.Set; import java.util.regex.Pattern; +import natorder.NaturalOrderComparator; /** * Identifiers deobfuscation. @@ -42,6 +53,11 @@ import java.util.regex.Pattern; */ public class IdentifiersDeobfuscation { + /** + * Prefix to be put instead of obfuscated name. It will by suffixed with a number. + */ + public static final String SAFE_STR_PREFIX = "_SafeStr_"; + /** * Random number generator. */ @@ -528,11 +544,27 @@ public class IdentifiersDeobfuscation { /** * Appends obfuscated identifier. * - * @param s String + * @param swf SWF + * @param used Used deobfuscations + * @param s String * @param writer Writer * @return Writer */ - public static GraphTextWriter appendObfuscatedIdentifier(String s, GraphTextWriter writer) { + public static GraphTextWriter appendObfuscatedIdentifier(SWF swf, Set used, String s, GraphTextWriter writer) { + Map map = new LinkedHashMap<>(); + if (Configuration.useSafeStr.get() && swf != null) { + map = swf.getObfuscatedIdentifiersMap(); + used.add(s); + if (map.containsKey(s)) { + writer.append(map.get(s)); + } else { + String ret = IdentifiersDeobfuscation.SAFE_STR_PREFIX + map.size(); + map.put(s, ret); + writer.append(ret); + } + return writer; + } + writer.append("\u00A7"); escapeOIdentifier(s, writer); return writer.append("\u00A7"); @@ -554,15 +586,22 @@ public class IdentifiersDeobfuscation { return ""; } - if (Configuration.useSafeStr.get() && as3) { + Map map = new LinkedHashMap<>(); + if (Configuration.useSafeStr.get()) { + + if (swf != null) { + map = swf.getObfuscatedIdentifiersMap(); + } - Map map = swf == null ? new LinkedHashMap<>() : swf.getAs3ObfuscatedIdentifiers(); if (map.containsKey(s)) { used.add(s); return map.get(s); } } - + + + + if (s.startsWith("\u00A7") && s.endsWith("\u00A7")) { // Assuming already printed - TODO:detect better return s; } @@ -584,6 +623,13 @@ public class IdentifiersDeobfuscation { return s; } + if (Configuration.useSafeStr.get()) { + String ret = IdentifiersDeobfuscation.SAFE_STR_PREFIX + map.size(); + map.put(s, ret); + used.add(s); + return ret; + } + String ret = "\u00A7" + escapeOIdentifier(s) + "\u00A7"; nameCache.put(s, ret); return ret; @@ -744,4 +790,55 @@ public class IdentifiersDeobfuscation { as2NameCache.clear(); as3NameCache.clear(); } + + @SuppressWarnings("unchecked") + public static GraphTextWriter writeCurrentScriptReplacements(GraphTextWriter writer, Set usedDeobfuscations, SWF swf) { + if (!usedDeobfuscations.isEmpty()) { + writer.newLine(); + List commentLines = new ArrayList<>(); + Map fullMap = swf.getObfuscatedIdentifiersMap(); + int i = 0; + for (String obfuscated : usedDeobfuscations) { + String deobfuscated = fullMap.get(obfuscated); + commentLines.add("@identifier " + deobfuscated + " = \"" + Helper.escapePCodeString(obfuscated) + "\""); + i++; + } + commentLines.sort(new NaturalOrderComparator()); + commentLines.add(0, AppResources.translate("decompilationWarning.obfuscatedIdentifiers")); + commentLines.add(1, AppResources.translate("decompilationWarning.replacementsFollow")); + String[] commentLinesArr = commentLines.toArray(new String[commentLines.size()]); + new DocCommentItem(commentLinesArr).appendTo(writer, LocalData.empty); + } + return writer; + } + + public static Map getReplacementsFromDoc(String s) throws Exception { + ActionScriptDocParser asd = new ActionScriptDocParser(); + List comments = asd.parse(s); + Map replacements = new LinkedHashMap<>(); + for (AsDocComment comment:comments) { + for (AsDocTag tag : comment.tags) { + if ("identifier".equals(tag.tagName)) { + String tagText = tag.tagText; + if (tagText != null && !tagText.isEmpty()) { + ActionScriptLexer lexer = new ActionScriptLexer(tagText); + ParsedSymbol symb = lexer.yylex(); + if (symb.type != SymbolType.IDENTIFIER) { + throw new Exception("Invalid @identifier AsDoc tag value. Identifier expected."); + } + ParsedSymbol symb2 = lexer.yylex(); + if (symb2.type != SymbolType.ASSIGN) { + throw new Exception("Invalid @identifier AsDoc tag value. Assign expected."); + } + ParsedSymbol symb3 = lexer.yylex(); + if (symb3.type != SymbolType.STRING) { + throw new Exception("Invalid @identifier AsDoc tag value. String expected."); + } + replacements.put(symb.value.toString(), symb3.value.toString()); + } + } + } + } + return replacements; + } } 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 2b3cf64e9..7607e6856 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -672,7 +672,7 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { /** * AS3 obfuscated identifiers map */ - private transient Map as3ObfuscatedIdentifiersMap = null; + private transient Map obfuscatedIdentifiersMap = null; /** * Lock for characters synchronization @@ -4002,21 +4002,23 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { } /** - * Gets all AS3 obfuscated identifiers in this SWF and their suggested SafeStr replacement + * Gets obfuscated identifiers map in this SWF and their suggested SafeStr replacement. + * For AS3 it calculates all replacements on first call. + * For AS1/2 it adds new items as they are opened in FFDec * @return Map source identifier to SafeStr replacement */ - public synchronized Map getAs3ObfuscatedIdentifiers() { - if (as3ObfuscatedIdentifiersMap != null) { - return as3ObfuscatedIdentifiersMap; + public synchronized Map getObfuscatedIdentifiersMap() { + if (obfuscatedIdentifiersMap != null) { + return obfuscatedIdentifiersMap; } - Map ret = new LinkedHashMap<>(); + Map ret = Collections.synchronizedMap(new LinkedHashMap<>()); for (Tag tag : getTags()) { if (tag instanceof ABCContainerTag) { ABCContainerTag abcTag = (ABCContainerTag) tag; abcTag.getABC().getObfuscatedIdentifiers(ret); } } - return as3ObfuscatedIdentifiersMap = ret; + return obfuscatedIdentifiersMap = ret; } /** @@ -4535,7 +4537,7 @@ public final class SWF implements SWFContainerItem, Timelined, Openable { asmsCache = null; asmsCacheExportFilenames = null; synchronized (this) { - as3ObfuscatedIdentifiersMap = null; + obfuscatedIdentifiersMap = null; } IdentifiersDeobfuscation.clearCache(); 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 d22f2c480..5992374fa 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 @@ -20,6 +20,7 @@ import com.jpexs.decompiler.flash.AppResources; import com.jpexs.decompiler.flash.DeobfuscationListener; import com.jpexs.decompiler.flash.EndOfStreamException; import com.jpexs.decompiler.flash.EventListener; +import com.jpexs.decompiler.flash.IdentifiersDeobfuscation; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; @@ -658,7 +659,7 @@ public class ABC implements Openable { return; } - ret.put(s, AVM2Deobfuscation.SAFE_STR_PREFIX + ret.size()); + ret.put(s, IdentifiersDeobfuscation.SAFE_STR_PREFIX + ret.size()); } private void getObfuscatedPackageIdentifier(int strIndex, Map ret) { @@ -680,8 +681,8 @@ public class ABC implements Openable { List deobfuscatedList = new ArrayList<>(); for (String part : parts) { if (!deobfuscation.isValidNSPart(part)) { - deobfuscatedList.add(AVM2Deobfuscation.SAFE_STR_PREFIX + ret.size()); - ret.put(part, AVM2Deobfuscation.SAFE_STR_PREFIX + ret.size()); + deobfuscatedList.add(IdentifiersDeobfuscation.SAFE_STR_PREFIX + ret.size()); + ret.put(part, IdentifiersDeobfuscation.SAFE_STR_PREFIX + ret.size()); } else { deobfuscatedList.add(part); } 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 163bfda53..9c2615fb3 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 @@ -16,6 +16,7 @@ */ package com.jpexs.decompiler.flash.abc; +import com.jpexs.decompiler.flash.IdentifiersDeobfuscation; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.abc.avm2.ConvertException; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; @@ -466,21 +467,7 @@ public class ScriptPack extends AS3ClassTreeItem { } } } - if (!usedDeobfuscations.isEmpty()) { - writer.newLine(); - List commentLines = new ArrayList<>(); - Map fullMap = abc.getSwf().getAs3ObfuscatedIdentifiers(); - int i = 0; - for (String obfuscated : usedDeobfuscations) { - String deobfuscated = fullMap.get(obfuscated); - commentLines.add("@identifier " + deobfuscated + " = \"" + Helper.escapePCodeString(obfuscated) + "\""); - i++; - } - commentLines.sort(new NaturalOrderComparator()); - commentLines.add(0, "The original code has obfuscated identifiers. List of replacements follows:"); - String[] commentLinesArr = commentLines.toArray(new String[commentLines.size()]); - new DocCommentItem(commentLinesArr).appendTo(writer, LocalData.empty); - } + IdentifiersDeobfuscation.writeCurrentScriptReplacements(writer, usedDeobfuscations, abc.getSwf()); } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Deobfuscation.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Deobfuscation.java index 9263b95f2..27b56823d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Deobfuscation.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Deobfuscation.java @@ -33,9 +33,7 @@ import java.util.regex.Pattern; * * @author JPEXS */ -public class AVM2Deobfuscation { - - public static final String SAFE_STR_PREFIX = "_SafeStr_"; +public class AVM2Deobfuscation { /** * Default size of random word. diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java index 64b97bf22..92f8134e3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java @@ -16,6 +16,7 @@ */ package com.jpexs.decompiler.flash.abc.avm2.parser.script; +import com.jpexs.decompiler.flash.IdentifiersDeobfuscation; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.abc.ABC; @@ -3023,33 +3024,11 @@ public class ActionScript3Parser { * @throws CompilationException On compilation error * @throws InterruptedException On interrupt */ - public void addScript(String s, String fileName, int classPos, int scriptIndex, String documentClass, ABC abc) throws AVM2ParseException, IOException, CompilationException, InterruptedException { - - replacements.clear(); - ActionScriptDocParser asd = new ActionScriptDocParser(); - List comments = asd.parse(s); - for (AsDocComment comment:comments) { - for (AsDocTag tag : comment.tags) { - if ("identifier".equals(tag.tagName)) { - String tagText = tag.tagText; - if (tagText != null && !tagText.isEmpty()) { - ActionScriptLexer lexer = new ActionScriptLexer(tagText); - ParsedSymbol symb = lexer.yylex(); - if (symb.type != SymbolType.IDENTIFIER) { - throw new AVM2ParseException("Invalid @identifier AsDoc tag value. Identifier expected.", 0); - } - ParsedSymbol symb2 = lexer.yylex(); - if (symb2.type != SymbolType.ASSIGN) { - throw new AVM2ParseException("Invalid @identifier AsDoc tag value. Assign expected.", 0); - } - ParsedSymbol symb3 = lexer.yylex(); - if (symb3.type != SymbolType.STRING) { - throw new AVM2ParseException("Invalid @identifier AsDoc tag value. String expected.", 0); - } - replacements.put(symb.value.toString(), symb3.value.toString()); - } - } - } + public void addScript(String s, String fileName, int classPos, int scriptIndex, String documentClass, ABC abc) throws AVM2ParseException, IOException, CompilationException, InterruptedException { + try { + replacements = IdentifiersDeobfuscation.getReplacementsFromDoc(s); + } catch (Exception ex) { + throw new AVM2ParseException(ex.getMessage(), -1); } List> allOpenedNamespaces = new ArrayList<>(); Reference numberContextRef = new Reference<>(null); 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 9212db367..419a4ccb8 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 @@ -19,6 +19,7 @@ package com.jpexs.decompiler.flash.action; import com.jpexs.decompiler.flash.AppResources; import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.DisassemblyListener; +import com.jpexs.decompiler.flash.IdentifiersDeobfuscation; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.SWFOutputStream; import com.jpexs.decompiler.flash.ValueTooLargeException; @@ -1002,7 +1003,7 @@ public abstract class Action implements GraphSourceItem { new ActionDeobfuscator().actionTreeCreated(tree, swf); } - Graph.graphToString(tree, new NulWriter(), new LocalData()); + Graph.graphToString(tree, new NulWriter(), LocalData.create(new ConstantPool(), swf, usedDeobfuscations)); return tree; } }, timeout, TimeUnit.SECONDS); @@ -1031,7 +1032,7 @@ public abstract class Action implements GraphSourceItem { asm.getActionSourcePrefix(writer); } if (convertException == null) { - Graph.graphToString(tree, writer, new LocalData()); + Graph.graphToString(tree, writer, LocalData.create(new ConstantPool(), swf, usedDeobfuscations)); } else if (convertException instanceof TimeoutException) { Helper.appendTimeoutCommentAs2(writer, timeout, actions.size()); } else { @@ -1041,7 +1042,7 @@ public abstract class Action implements GraphSourceItem { asm.getActionSourceSuffix(writer); } - //TODO: write the actual used deobfuscations !!! + IdentifiersDeobfuscation.writeCurrentScriptReplacements(writer, usedDeobfuscations, swf); return writer; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/DefineLocalActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/DefineLocalActionItem.java index 18a17608d..012d915d7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/DefineLocalActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/DefineLocalActionItem.java @@ -101,7 +101,7 @@ public class DefineLocalActionItem extends ActionItem implements SetTypeActionIt srcData.declaration = true; if (((name instanceof DirectValueActionItem)) && (((DirectValueActionItem) name).isString()) && (!IdentifiersDeobfuscation.isValidName(false, ((DirectValueActionItem) name).toStringNoQuotes(localData), "this", "super", "true", "false", "NaN", "null", "newline", "Infinity", "undefined", "get", "set", "each"))) { - IdentifiersDeobfuscation.appendObfuscatedIdentifier(((DirectValueActionItem) name).toStringNoQuotes(localData), writer); + IdentifiersDeobfuscation.appendObfuscatedIdentifier(localData.swf, localData.usedDeobfuscations, ((DirectValueActionItem) name).toStringNoQuotes(localData), writer); } else { stripQuotes(name, localData, writer); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/FunctionActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/FunctionActionItem.java index f673c350b..19af3495e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/FunctionActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/FunctionActionItem.java @@ -248,7 +248,7 @@ public class FunctionActionItem extends ActionItem implements BranchStackResista } if (!IdentifiersDeobfuscation.isValidName(false, fname)) { - IdentifiersDeobfuscation.appendObfuscatedIdentifier(fname, writer); + IdentifiersDeobfuscation.appendObfuscatedIdentifier(localData.swf, localData.usedDeobfuscations, fname, writer); } else { writer.append(fname); //calculatedFunctionName.appendToNoQuotes(writer, localData); @@ -265,7 +265,7 @@ public class FunctionActionItem extends ActionItem implements BranchStackResista } writer.append(" "); if (!IdentifiersDeobfuscation.isValidName(false, fname)) { - IdentifiersDeobfuscation.appendObfuscatedIdentifier(fname, writer); + IdentifiersDeobfuscation.appendObfuscatedIdentifier(localData.swf, localData.usedDeobfuscations, fname, writer); } else { writer.append(fname); } @@ -298,7 +298,7 @@ public class FunctionActionItem extends ActionItem implements BranchStackResista d.declaration = true; if (!IdentifiersDeobfuscation.isValidName(false, pname)) { - IdentifiersDeobfuscation.appendObfuscatedIdentifier(pname, writer); + IdentifiersDeobfuscation.appendObfuscatedIdentifier(localData.swf, localData.usedDeobfuscations, pname, writer); } else { writer.append(pname); } 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 5775efae9..a7531610d 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 @@ -16,6 +16,7 @@ */ package com.jpexs.decompiler.flash.action.parser.script; +import com.jpexs.decompiler.flash.IdentifiersDeobfuscation; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.action.Action; @@ -173,6 +174,7 @@ import java.io.StringReader; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -259,6 +261,11 @@ public class ActionScript2Parser { * SWF */ private SWF swf; + + /** + * Obfuscation identifiers replacements + */ + private Map replacements = new LinkedHashMap<>(); /** * Constructor @@ -381,6 +388,11 @@ public class ActionScript2Parser { throw new InterruptedException(); } ParsedSymbol ret = lexer.lex(); + if (ret.type == SymbolType.IDENTIFIER) { + if (replacements.containsKey(ret.value.toString())) { + ret.value = replacements.get(ret.value.toString()); + } + } if (debugMode) { System.out.println(ret); } @@ -1129,7 +1141,7 @@ public class ActionScript2Parser { expectedType(SymbolType.CURLY_CLOSE); break; case FUNCTION: - s = lexer.lex(); + s = lex(); expectedIdentifier(s, lexer.yyline()); ret = (function(true, s.value.toString(), false, variables, functions, inTellTarget, hasEval)); break; @@ -1799,7 +1811,7 @@ public class ActionScript2Parser { //AS 1/2: //AS2: case "constant": - s = lexer.lex(); + s = lex(); expected(s, lexer.yyline(), SymbolType.INTEGER); ret = new UnresolvedConstantActionItem((int) (long) (Long) s.value); break; @@ -1819,7 +1831,7 @@ public class ActionScript2Parser { allowMemberOrCall = true; break; case "strict": - s = lexer.lex(); + s = lex(); expected(s, lexer.yyline(), SymbolType.INTEGER); ret = new StrictModeActionItem(null, null, (int) (long) (Long) s.value); break; @@ -2198,6 +2210,13 @@ public class ActionScript2Parser { * @throws InterruptedException On interrupt */ public List treeFromString(String str, List constantPool) throws ActionParseException, IOException, InterruptedException { + + try { + replacements = IdentifiersDeobfuscation.getReplacementsFromDoc(str); + } catch (Exception ex) { + throw new ActionParseException(ex.getMessage(), -1); + } + List retTree = new ArrayList<>(); this.constantPool = constantPool; lexer = new ActionScriptLexer(new StringReader(str)); @@ -2208,12 +2227,12 @@ public class ActionScript2Parser { BUTTONCONDACTION newButtonCond = new BUTTONCONDACTION(); if (targetSource instanceof BUTTONCONDACTION) { - ParsedSymbol symb = lexer.lex(); + ParsedSymbol symb = lex(); if (symb.type != SymbolType.IDENTIFIER || !"on".equals(symb.value)) { throw new ActionParseException("on keyword expected but " + symb + " found", lexer.yyline()); } expectedType(SymbolType.PARENT_OPEN); - symb = lexer.lex(); + symb = lex(); boolean condEmpty = true; while (symb.type == SymbolType.IDENTIFIER) { condEmpty = false; @@ -2240,7 +2259,7 @@ public class ActionScript2Parser { newButtonCond.condOutDownToOverDown = true; break; case "keyPress": - symb = lexer.lex(); + symb = lex(); expected(symb, lexer.yyline(), SymbolType.STRING); Integer key = CLIPACTIONRECORD.stringToKey((String) symb.value); if (key == null) { @@ -2251,12 +2270,12 @@ public class ActionScript2Parser { default: throw new ActionParseException("Unrecognized event type", lexer.yyline()); } - symb = lexer.lex(); + symb = lex(); if (symb.type == SymbolType.PARENT_CLOSE) { break; } expected(symb, lexer.yyline(), SymbolType.COMMA); - symb = lexer.lex(); + symb = lex(); } expected(symb, lexer.yyline(), SymbolType.PARENT_CLOSE); if (condEmpty) { @@ -2268,13 +2287,13 @@ public class ActionScript2Parser { CLIPEVENTFLAGS newClipEventFlags = new CLIPEVENTFLAGS(); int newClipActionRecordKey = 0; if (targetSource instanceof CLIPACTIONRECORD) { - ParsedSymbol symb = lexer.lex(); + ParsedSymbol symb = lex(); if (symb.type != SymbolType.IDENTIFIER || (!"on".equals(symb.value) && !"onClipEvent".equals(symb.value))) { throw new ActionParseException("on or onClipEvent keyword expected but " + symb + " found", lexer.yyline()); } expectedType(SymbolType.PARENT_OPEN); if ("on".equals(symb.value)) { - symb = lexer.lex(); + symb = lex(); boolean condEmpty = true; while (symb.type == SymbolType.IDENTIFIER) { condEmpty = false; @@ -2308,7 +2327,7 @@ public class ActionScript2Parser { break; case "keyPress": - symb = lexer.lex(); + symb = lex(); expected(symb, lexer.yyline(), SymbolType.STRING); Integer key = CLIPACTIONRECORD.stringToKey((String) symb.value); if (key == null) { @@ -2320,19 +2339,19 @@ public class ActionScript2Parser { default: throw new ActionParseException("Unrecognized event type", lexer.yyline()); } - symb = lexer.lex(); + symb = lex(); if (symb.type == SymbolType.PARENT_CLOSE) { break; } expected(symb, lexer.yyline(), SymbolType.COMMA); - symb = lexer.lex(); + symb = lex(); } expected(symb, lexer.yyline(), SymbolType.PARENT_CLOSE); if (condEmpty) { throw new ActionParseException("condition must be non empty", lexer.yyline()); } } else if ("onClipEvent".equals(symb.value)) { - symb = lexer.lex(); + symb = lex(); expected(symb, lexer.yyline(), SymbolType.IDENTIFIER); switch ((String) symb.value) { @@ -2404,7 +2423,7 @@ public class ActionScript2Parser { expectedType(SymbolType.CURLY_CLOSE); } - if (lexer.lex().type != SymbolType.EOF) { + if (lex().type != SymbolType.EOF) { throw new ActionParseException("Parsing finished before end of the file", lexer.yyline()); } if (targetSource instanceof BUTTONCONDACTION) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/AppResources.properties b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/AppResources.properties index daa5fb3bb..76ed4688a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/AppResources.properties +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/AppResources.properties @@ -64,3 +64,5 @@ configuration.removed = WARNING: This configuration was REMOVED. It is unused. #after 24.0.1 decompilationWarning.as2.noUninitializedClassFieldsDetection = WARNING: This class was decompiled without detecting uninitialized class fields. +decompilationWarning.obfuscatedIdentifiers = WARNING: The original code has obfuscated identifiers. +decompilationWarning.replacementsFollow = List of replacements follows: \ No newline at end of file diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/AppResources_cs.properties b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/AppResources_cs.properties index 1fdc7d12b..185c22a64 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/AppResources_cs.properties +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/AppResources_cs.properties @@ -65,3 +65,5 @@ configuration.removed = VAROV\u00c1N\u00cd: Tato konfigurace byla ODSTRAN\u011aN #after 24.0.1 decompilationWarning.as2.noUninitializedClassFieldsDetection = VAROV\u00c1N\u00cd: Tato t\u0159\u00edda byla dekompilov\u00e1na bez detekce neinicializovan\u00fdch pol\u00ed t\u0159\u00edd. +decompilationWarning.obfuscatedIdentifiers = VAROV\u00c1N\u00cd: P\u016fvodn\u00ed k\u00f3d m\u00e1 obfuskovan\u00e9 identifik\u00e1tory. +decompilationWarning.replacementsFollow = N\u00e1sleduje seznam n\u00e1hrad: \ No newline at end of file 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 8de00f0d7..2cb4a5a7b 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 @@ -101,6 +101,11 @@ public class LocalData { * SWF version */ public int swfVersion; + + private LocalData() { + } + + /** * Creates a new local data diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex b/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex index a32ce1b42..e6b0e42ef 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex @@ -64,7 +64,7 @@ import java.util.List; this.offset = ofst; prevToken = null; Token t = yylex(); - if (t.type != TokenType.COMMENT) { + if (t != null && t.type != TokenType.COMMENT) { prevToken = t; } for (; t != null; t = yylex()) {