From a800993fcf0fc3dc29105a5abc01cc47be82a247 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Fri, 5 Jul 2013 14:18:31 +0200 Subject: [PATCH] Issue #174 AS3 rename identifiers fix --- trunk/src/com/jpexs/decompiler/flash/SWF.java | 2 +- .../com/jpexs/decompiler/flash/abc/ABC.java | 29 +++++++++++++++---- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/trunk/src/com/jpexs/decompiler/flash/SWF.java b/trunk/src/com/jpexs/decompiler/flash/SWF.java index 41a91b2c5..3928b881a 100644 --- a/trunk/src/com/jpexs/decompiler/flash/SWF.java +++ b/trunk/src/com/jpexs/decompiler/flash/SWF.java @@ -349,7 +349,7 @@ public class SWF { } } - private void assignClassesToSymbols() { + public void assignClassesToSymbols() { HashMap classes = new HashMap<>(); for (Tag t : tags) { if (t instanceof SymbolClassTag) { diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java b/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java index 8acb4a522..2a6ccacdf 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java @@ -105,6 +105,14 @@ public class ABC { } } + public Set getNsStringUsages() { + Set ret = new HashSet<>(); + for (int n = 1; n < constants.constant_namespace.length; n++) { + ret.add(constants.constant_namespace[n].name_index); + } + return ret; + } + public Set getStringUsages() { Set ret = new HashSet<>(); for (MethodBody body : bodies) { @@ -187,8 +195,9 @@ public class ABC { throw new IllegalArgumentException("Multiname with index " + multinameIndex + " does not exist"); } Set stringUsages = getStringUsages(); + Set namespaceUsages = getNsStringUsages(); int strIndex = constants.constant_multiname[multinameIndex].name_index; - if (stringUsages.contains(strIndex)) { //name is used elsewhere as string literal + if (stringUsages.contains(strIndex) || namespaceUsages.contains(strIndex)) { //name is used elsewhere as string literal strIndex = constants.forceGetStringId(newname); constants.constant_multiname[multinameIndex].name_index = strIndex; } else { @@ -198,21 +207,26 @@ public class ABC { public void deobfuscateIdentifiers(HashMap namesMap, RenameType renameType) { Set stringUsages = getStringUsages(); + Set namespaceUsages = getNsStringUsages(); Map stringUsageTypes = new HashMap<>(); informListeners("deobfuscate", "Getting usage types..."); getStringUsageTypes(stringUsageTypes); for (int i = 1; i < instance_info.length; i++) { informListeners("deobfuscate", "class " + i + "/" + instance_info.length); if (instance_info[i].name_index != 0) { - constants.constant_multiname[instance_info[i].name_index].name_index = deobfuscateName(stringUsageTypes, stringUsages, namesMap, constants.constant_multiname[instance_info[i].name_index].name_index, true, renameType); + constants.constant_multiname[instance_info[i].name_index].name_index = deobfuscateName(stringUsageTypes, stringUsages, namespaceUsages, namesMap, constants.constant_multiname[instance_info[i].name_index].name_index, true, renameType); + if (constants.constant_multiname[instance_info[i].name_index].namespace_index != 0) { + constants.constant_namespace[constants.constant_multiname[instance_info[i].name_index].namespace_index].name_index = + deobfuscateNameSpace(stringUsageTypes, stringUsages, namesMap, constants.constant_namespace[constants.constant_multiname[instance_info[i].name_index].namespace_index].name_index, renameType); + } } if (instance_info[i].super_index != 0) { - constants.constant_multiname[instance_info[i].super_index].name_index = deobfuscateName(stringUsageTypes, stringUsages, namesMap, constants.constant_multiname[instance_info[i].super_index].name_index, true, renameType); + constants.constant_multiname[instance_info[i].super_index].name_index = deobfuscateName(stringUsageTypes, stringUsages, namespaceUsages, namesMap, constants.constant_multiname[instance_info[i].super_index].name_index, true, renameType); } } for (int i = 1; i < constants.constant_multiname.length; i++) { informListeners("deobfuscate", "name " + i + "/" + constants.constant_multiname.length); - constants.constant_multiname[i].name_index = deobfuscateName(stringUsageTypes, stringUsages, namesMap, constants.constant_multiname[i].name_index, false, renameType); + constants.constant_multiname[i].name_index = deobfuscateName(stringUsageTypes, stringUsages, namespaceUsages, namesMap, constants.constant_multiname[i].name_index, false, renameType); } for (int i = 1; i < constants.constant_namespace.length; i++) { informListeners("deobfuscate", "namespace " + i + "/" + constants.constant_namespace.length); @@ -864,6 +878,9 @@ public class ABC { return strIndex; } String s = constants.constant_string[strIndex]; + if (builtInNs(s) != null) { + return strIndex; + } boolean isValid = isValidNSPart(s); if (!isValid) { String newName; @@ -900,7 +917,7 @@ public class ABC { return strIndex; } - public int deobfuscateName(Map stringUsageTypes, Set stringUsages, HashMap namesMap, int strIndex, boolean firstUppercase, RenameType renameType) { + public int deobfuscateName(Map stringUsageTypes, Set stringUsages, Set namespaceUsages, HashMap namesMap, int strIndex, boolean firstUppercase, RenameType renameType) { if (strIndex <= 0) { return strIndex; } @@ -933,7 +950,7 @@ public class ABC { } else { newname = fooString(constants.constant_string[strIndex], firstUppercase, DEFAULT_FOO_SIZE, stringUsageTypes.get(strIndex), renameType); } - if (stringUsages.contains(strIndex)) { //this name is already referenced as String + if (stringUsages.contains(strIndex) || namespaceUsages.contains(strIndex)) { //this name is already referenced as String strIndex = constants.addString(s); //add new index } constants.constant_string[strIndex] = newname;