From 0302b259c1b66c8aa3b857963e4d66e7d8cd974a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Fri, 19 Jul 2013 17:54:00 +0200 Subject: [PATCH] Issue #236 AS3 Uneccessary renaming identifiers --- .../com/jpexs/decompiler/flash/abc/ABC.java | 65 +++++++++++-------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java b/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java index 2cd962763..49cb59779 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java @@ -215,7 +215,7 @@ public class ABC { 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); + deobfuscatePackageName(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) { @@ -231,38 +231,47 @@ public class ABC { } for (int i = 1; i < constants.constant_namespace.length; i++) { informListeners("deobfuscate", "namespace " + i + "/" + constants.constant_namespace.length); - constants.constant_namespace[i].name_index = deobfuscateNameSpace(stringUsageTypes, stringUsages, namesMap, constants.constant_namespace[i].name_index, renameType); + if (constants.constant_namespace[i].kind != Namespace.KIND_PACKAGE) { //only packages + continue; + } + constants.constant_namespace[i].name_index = deobfuscatePackageName(stringUsageTypes, stringUsages, namesMap, constants.constant_namespace[i].name_index, renameType); } //process reflection using getDefinitionByName too for (MethodBody body : bodies) { for (int ip = 0; ip < body.code.code.size(); ip++) { if (body.code.code.get(ip).definition instanceof CallPropertyIns) { - if (ip > 0) { - if (body.code.code.get(ip - 1).definition instanceof PushStringIns) { - int strIndex = body.code.code.get(ip - 1).operands[0]; - String fullname = constants.constant_string[strIndex]; - String pkg = ""; - String name = fullname; - if (fullname.contains(".")) { - pkg = fullname.substring(0, fullname.lastIndexOf(".")); - name = fullname.substring(fullname.lastIndexOf(".") + 1); + int mIndex = body.code.code.get(ip).operands[0]; + if (mIndex > 0) { + Multiname m = constants.constant_multiname[mIndex]; + if (m.getNameWithNamespace(constants).equals("flash.utils.getDefinitionByName")) { + if (ip > 0) { + if (body.code.code.get(ip - 1).definition instanceof PushStringIns) { + int strIndex = body.code.code.get(ip - 1).operands[0]; + String fullname = constants.constant_string[strIndex]; + String pkg = ""; + String name = fullname; + if (fullname.contains(".")) { + pkg = fullname.substring(0, fullname.lastIndexOf(".")); + name = fullname.substring(fullname.lastIndexOf(".") + 1); + } + if (!pkg.equals("")) { + int pkgStrIndex = constants.forceGetStringId(pkg); + pkgStrIndex = deobfuscatePackageName(stringUsageTypes, stringUsages, namesMap, pkgStrIndex, renameType); + pkg = constants.constant_string[pkgStrIndex]; + } + int nameStrIndex = constants.forceGetStringId(name); + nameStrIndex = deobfuscateName(stringUsageTypes, stringUsages, namespaceUsages, namesMap, nameStrIndex, true, renameType); + name = constants.constant_string[nameStrIndex]; + String fullChanged = ""; + if (!pkg.equals("")) { + fullChanged = pkg + "."; + } + fullChanged += name; + strIndex = constants.forceGetStringId(fullChanged); + body.code.code.get(ip - 1).operands[0] = strIndex; + } } - if (!pkg.equals("")) { - int pkgStrIndex = constants.forceGetStringId(pkg); - pkgStrIndex = deobfuscateNameSpace(stringUsageTypes, stringUsages, namesMap, pkgStrIndex, renameType); - pkg = constants.constant_string[pkgStrIndex]; - } - int nameStrIndex = constants.forceGetStringId(name); - nameStrIndex = deobfuscateName(stringUsageTypes, stringUsages, namespaceUsages, namesMap, nameStrIndex, true, renameType); - name = constants.constant_string[nameStrIndex]; - String fullChanged = ""; - if (!pkg.equals("")) { - fullChanged = pkg + "."; - } - fullChanged += name; - strIndex = constants.forceGetStringId(fullChanged); - body.code.code.get(ip - 1).operands[0] = strIndex; } } } @@ -876,7 +885,7 @@ public class ABC { return isValid; } - public int deobfuscateNameSpace(Map stringUsageTypes, Set stringUsages, HashMap namesMap, int strIndex, RenameType renameType) { + public int deobfuscatePackageName(Map stringUsageTypes, Set stringUsages, HashMap namesMap, int strIndex, RenameType renameType) { if (strIndex <= 0) { return strIndex; } @@ -902,7 +911,7 @@ public class ABC { ret += "."; } if (!isValidNSPart(parts[p])) { - ret += fooString(namesMap, constants.constant_string[strIndex], false, DEFAULT_FOO_SIZE, "package", renameType); + ret += fooString(namesMap, parts[p], false, DEFAULT_FOO_SIZE, "package", renameType); } else { ret += parts[p]; }