From d4f6ae2a8610ae16c709f5cbee46a29a0bd58d0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Sat, 6 Jul 2013 21:15:23 +0200 Subject: [PATCH] Issue #190 AS3: Rename instance names --- trunk/src/com/jpexs/decompiler/flash/SWF.java | 128 +++++++++++++----- .../decompiler/flash/helpers/Helper.java | 14 +- .../flash/tags/PlaceObject2Tag.java | 12 ++ .../flash/tags/PlaceObject3Tag.java | 13 ++ .../decompiler/flash/tags/PlaceObjectTag.java | 11 ++ .../flash/tags/PlaceObjectTypeTag.java | 4 + 6 files changed, 147 insertions(+), 35 deletions(-) diff --git a/trunk/src/com/jpexs/decompiler/flash/SWF.java b/trunk/src/com/jpexs/decompiler/flash/SWF.java index 0662ec6a5..49266e107 100644 --- a/trunk/src/com/jpexs/decompiler/flash/SWF.java +++ b/trunk/src/com/jpexs/decompiler/flash/SWF.java @@ -1503,54 +1503,117 @@ public class SWF { } } + public void deobfuscateInstanceNames(RenameType renameType, List tags, Map selected) { + for (Tag t : tags) { + if (t instanceof DefineSpriteTag) { + deobfuscateInstanceNames(renameType, ((DefineSpriteTag) t).subTags, selected); + } + if (t instanceof PlaceObjectTypeTag) { + PlaceObjectTypeTag po = (PlaceObjectTypeTag) t; + String name = po.getInstanceName(); + if (name != null) { + String changedName = deobfuscateName(name, false, "instance", renameType, selected); + if (changedName != null) { + po.setInstanceName(changedName); + } + } + String className = po.getClassName(); + if (className != null) { + String changedClassName = deobfuscateNameWithPackage(className, renameType, selected); + if (changedClassName != null) { + po.setClassName(changedClassName); + } + } + } + } + } + + public String deobfuscatePackage(String pkg, RenameType renameType, Map selected) { + if (deobfuscated.containsKey(pkg)) { + return deobfuscated.get(pkg); + } + String parts[] = null; + if (pkg.contains(".")) { + parts = pkg.split("\\."); + } else { + parts = new String[]{pkg}; + } + String ret = ""; + boolean isChanged = false; + for (int p = 0; p < parts.length; p++) { + if (p > 0) { + ret += "."; + } + String partChanged = deobfuscateName(parts[p], false, "package", renameType, selected); + if (partChanged != null) { + ret += partChanged; + isChanged = true; + } else { + ret += parts[p]; + } + } + if (isChanged) { + deobfuscated.put(pkg, ret); + return ret; + } + return null; + } + + public String deobfuscateNameWithPackage(String n, RenameType renameType, Map selected) { + String pkg = null; + String name = ""; + if (n.contains(".")) { + pkg = n.substring(0, n.lastIndexOf(".")); + name = n.substring(n.lastIndexOf(".") + 1); + } else { + name = n; + } + boolean changed = false; + if ((pkg != null) && (!pkg.equals(""))) { + String changedPkg = deobfuscatePackage(pkg, renameType, selected); + if (changedPkg != null) { + changed = true; + pkg = changedPkg; + } + } + String changedName = deobfuscateName(name, true, "class", renameType, selected); + if (changedName != null) { + changed = true; + name = changedName; + } + if (changed) { + String newClassName = ""; + if (pkg == null) { + newClassName = name; + } else { + newClassName = pkg + "." + name; + } + return newClassName; + } + return null; + } + public int deobfuscateAS3Identifiers(RenameType renameType) { - HashMap namesMap = new HashMap<>(); for (Tag tag : tags) { if (tag instanceof ABCContainerTag) { - ((ABCContainerTag) tag).getABC().deobfuscateIdentifiers(namesMap, renameType, true); + ((ABCContainerTag) tag).getABC().deobfuscateIdentifiers(deobfuscated, renameType, true); } } for (Tag tag : tags) { if (tag instanceof ABCContainerTag) { - ((ABCContainerTag) tag).getABC().deobfuscateIdentifiers(namesMap, renameType, false); + ((ABCContainerTag) tag).getABC().deobfuscateIdentifiers(deobfuscated, renameType, false); } } for (Tag tag : tags) { if (tag instanceof SymbolClassTag) { SymbolClassTag sc = (SymbolClassTag) tag; for (int i = 0; i < sc.classNames.length; i++) { - String pkg = null; - String name = ""; - if (sc.classNames[i].contains(".")) { - pkg = sc.classNames[i].substring(0, sc.classNames[i].lastIndexOf(".")); - name = sc.classNames[i].substring(sc.classNames[i].lastIndexOf(".") + 1); - } else { - name = sc.classNames[i]; - } - boolean changed = false; - if ((pkg != null) && (!pkg.equals(""))) { - if (namesMap.containsKey(pkg)) { - changed = true; - pkg = namesMap.get(pkg); - } - } - if (namesMap.containsKey(name)) { - changed = true; - name = namesMap.get(name); - } - if (changed) { - String newClassName = ""; - if (pkg == null) { - newClassName = name; - } else { - newClassName = pkg + "." + name; - } - sc.classNames[i] = newClassName; - } + sc.classNames[i] = deobfuscateNameWithPackage(sc.classNames[i], renameType, deobfuscated); } } } - return namesMap.size(); + deobfuscateInstanceNames(renameType, tags, new HashMap()); + return deobfuscated.size(); } HashMap typeCounts = new HashMap<>(); @@ -1791,6 +1854,7 @@ public class SWF { actionsMap.put(src, Action.removeNops(0, actionsMap.get(src), version, 0)); src.setActions(actionsMap.get(src), version); } + deobfuscateInstanceNames(renameType, tags, selected); return ret; } diff --git a/trunk/src/com/jpexs/decompiler/flash/helpers/Helper.java b/trunk/src/com/jpexs/decompiler/flash/helpers/Helper.java index 1c916b79f..8289bee28 100644 --- a/trunk/src/com/jpexs/decompiler/flash/helpers/Helper.java +++ b/trunk/src/com/jpexs/decompiler/flash/helpers/Helper.java @@ -25,6 +25,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.BitSet; import java.util.List; @@ -414,9 +415,16 @@ public class Helper { } public static String strToHex(String s) { - String sn = ""; - for (int i = 0; i < s.length(); i++) { - sn += "0x" + Integer.toHexString(s.charAt(i)) + " "; + byte bs[]; + try { + bs = s.getBytes("utf-8"); + } catch (UnsupportedEncodingException ex) { + bs = new byte[0]; + Logger.getLogger(Helper.class.getName()).log(Level.SEVERE, null, ex); + } + String sn=""; + for (int i = 0; i < bs.length; i++) { + sn += "0x" + Integer.toHexString(bs[i]&0xff) + " "; } return sn; } diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java index 123a2b5bc..920437359 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java @@ -200,6 +200,7 @@ public class PlaceObject2Tag extends Tag implements Container, PlaceObjectTypeTa * * @param data Data bytes * @param version SWF version + * @param pos * @throws IOException */ public PlaceObject2Tag(byte data[], int version, long pos) throws IOException { @@ -355,4 +356,15 @@ public class PlaceObject2Tag extends Tag implements Container, PlaceObjectTypeTa } return ratio; } + + @Override + public void setInstanceName(String name) { + placeFlagHasName = true; + this.name = name; + } + + @Override + public void setClassName(String className) { + //not supported + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java index 54ce834d1..cd1d93b9c 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java @@ -272,6 +272,7 @@ public class PlaceObject3Tag extends Tag implements Container, PlaceObjectTypeTa * * @param data Data bytes * @param version SWF version + * @param pos * @throws IOException */ public PlaceObject3Tag(byte data[], int version, long pos) throws IOException { @@ -471,4 +472,16 @@ public class PlaceObject3Tag extends Tag implements Container, PlaceObjectTypeTa } return ratio; } + + @Override + public void setInstanceName(String name) { + placeFlagHasName = true; + this.name = name; + } + + @Override + public void setClassName(String className) { + placeFlagHasClassName = true; + this.className = className; + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObjectTag.java b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObjectTag.java index b7d2a01c6..ea15cbba0 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObjectTag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObjectTag.java @@ -93,6 +93,7 @@ public class PlaceObjectTag extends Tag implements PlaceObjectTypeTag { * * @param data Data bytes * @param version SWF version + * @param pos * @throws IOException */ public PlaceObjectTag(byte data[], int version, long pos) throws IOException { @@ -185,4 +186,14 @@ public class PlaceObjectTag extends Tag implements PlaceObjectTypeTag { public int getRatio() { return -1; } + + @Override + public void setInstanceName(String name) { + //not supported + } + + @Override + public void setClassName(String className) { + //not supported + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObjectTypeTag.java b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObjectTypeTag.java index cef0d4630..3fcc9fd86 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObjectTypeTag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObjectTypeTag.java @@ -20,6 +20,10 @@ public interface PlaceObjectTypeTag { public MATRIX getMatrix(); public String getInstanceName(); + + public void setInstanceName(String name); + + public void setClassName(String className); public CXFORM getColorTransform();