From 8f8db771e8f5e91577f92b29039f82d5f9df7ca4 Mon Sep 17 00:00:00 2001 From: "honfika@gmail.com" Date: Sat, 11 Jul 2015 13:27:44 +0200 Subject: [PATCH 1/3] command line remove fix, show tag number in dumpSWF --- .../src/com/jpexs/decompiler/flash/SWFInputStream.java | 9 ++++++--- .../flash/console/CommandLineArgumentParser.java | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFInputStream.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFInputStream.java index 33b18496e..9e2877a39 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFInputStream.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFInputStream.java @@ -992,11 +992,13 @@ public class SWFInputStream implements AutoCloseable { return ret; } - private static void dumpTag(PrintStream out, int version, Tag tag, int level) { + private static void dumpTag(PrintStream out, Tag tag, int index, int level) { StringBuilder sb = new StringBuilder(); sb.append(Helper.formatHex((int) tag.getPos(), 8)); sb.append(": "); sb.append(Helper.indent(level, "", " ")); + sb.append(Helper.formatInt(index, 4)); + sb.append(". "); sb.append(Helper.format(tag.toString(), 25 - 2 * level)); sb.append(" tagId="); sb.append(Helper.formatInt(tag.getId(), 3)); @@ -1007,8 +1009,9 @@ public class SWFInputStream implements AutoCloseable { out.println(sb.toString()); // out.println(Utils.formatHex((int)tag.getPos(), 8) + ": " + Utils.indent(level, "") + Utils.format(tag.toString(), 25 - 2*level) + " tagId="+tag.getId()+" len="+tag.getOrigDataLength()+": "+Utils.bytesToHexString(64, tag.getData(version), 0)); if (tag instanceof DefineSpriteTag) { + int i = 0; for (Tag subTag : ((DefineSpriteTag) tag).getSubTags()) { - dumpTag(out, version, subTag, level + 1); + dumpTag(out, subTag, i++, level + 1); } } } @@ -1108,7 +1111,7 @@ public class SWFInputStream implements AutoCloseable { tags.add(tag); } if (Configuration.dumpTags.get() && level == 0) { - dumpTag(System.out, swf.version, tag, level); + dumpTag(System.out, tag, tags.size() - 1, level); } boolean doParse; diff --git a/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java b/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java index a319dbe43..7148241be 100644 --- a/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java +++ b/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java @@ -2024,7 +2024,7 @@ public class CommandLineArgumentParser { Collections.sort(tagNumbersToRemove); for (int i = tagNumbersToRemove.size() - 1; i >= 0; i--) { - swf.tags.remove(tagNumbersToRemove.get(i)); + swf.tags.remove((int) tagNumbersToRemove.get(i)); } try { From fa6b85416f685d824da82d8bdbb80e3eb81f6cb5 Mon Sep 17 00:00:00 2001 From: "honfika@gmail.com" Date: Sat, 11 Jul 2015 19:20:43 +0200 Subject: [PATCH 2/3] export fix --- .../com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java | 3 +-- .../src/com/jpexs/decompiler/graph/GraphTargetItem.java | 4 ++++ .../ffdec_lib/src/com/jpexs/decompiler/graph/Loop.java | 4 ++-- .../src/com/jpexs/decompiler/graph/model/LoopItem.java | 9 +++++---- .../flash/console/CommandLineArgumentParser.java | 4 ++-- 5 files changed, 14 insertions(+), 10 deletions(-) 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 bb171d99f..7096854ee 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 @@ -299,7 +299,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.TreeMap; import java.util.logging.Level; import java.util.logging.Logger; @@ -2268,7 +2267,7 @@ public class AVM2Code implements Cloneable { new AVM2DeobfuscatorSimple().deobfuscate(path, classIndex, isStatic, scriptIndex, abc, constants, trait, info, body); new AVM2DeobfuscatorRegisters().deobfuscate(path, classIndex, isStatic, scriptIndex, abc, constants, trait, info, body); new AVM2DeobfuscatorJumps().deobfuscate(path, classIndex, isStatic, scriptIndex, abc, constants, trait, info, body); - //body.getCode().checkValidOffsets(body); // todo: only for debugging. checkValidOffsets can be made private later + //body.getCode().checkValidOffsets(body); // todo: only for debugging. checkValidOffsets can be made private later return 1; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java index 1ebaa7d72..7181adccb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java @@ -161,6 +161,10 @@ public abstract class GraphTargetItem implements Serializable, Cloneable { } public GraphTextWriter toStringSemicoloned(GraphTextWriter writer, LocalData localData) throws InterruptedException { + if (Thread.currentThread().isInterrupted()) { + throw new InterruptedException(); + } + writer.startOffset(src, getPos(), srcData); appendTo(writer, localData); if (needsSemicolon()) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Loop.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Loop.java index 19062f7eb..01e9c2f09 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Loop.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Loop.java @@ -32,9 +32,9 @@ public class Loop implements Serializable { public GraphPart loopPreContinue; - public List breakCandidates = new ArrayList<>(); + public final List breakCandidates = new ArrayList<>(); - public List breakCandidatesLevels = new ArrayList<>(); + public final List breakCandidatesLevels = new ArrayList<>(); public long id; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LoopItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LoopItem.java index 3f2636e25..996476a4b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LoopItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/LoopItem.java @@ -1,18 +1,19 @@ /* * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.graph.model; import com.jpexs.decompiler.graph.GraphSourceItem; diff --git a/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java b/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java index 7148241be..05670831c 100644 --- a/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java +++ b/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java @@ -1295,10 +1295,10 @@ public class CommandLineArgumentParser { scriptExportSettings.singleFileWriter = writer; if (!as3classes.isEmpty()) { for (String as3class : as3classes) { - exportOK = exportOK && swf.exportAS3Class(as3class, scriptsFolder, scriptExportSettings, parallel, evl); + exportOK = swf.exportAS3Class(as3class, scriptsFolder, scriptExportSettings, parallel, evl) && exportOK; } } else { - exportOK = exportOK && swf.exportActionScript(handler, scriptsFolder, scriptExportSettings, parallel, evl) != null; + exportOK = swf.exportActionScript(handler, scriptsFolder, scriptExportSettings, parallel, evl) != null && exportOK; } } } From 480af129e881ccf70477563ece1247042c47730c Mon Sep 17 00:00:00 2001 From: "honfika@gmail.com" Date: Sat, 11 Jul 2015 21:43:32 +0200 Subject: [PATCH 3/3] trait is cloneable now --- .../decompiler/flash/abc/avm2/AVM2Code.java | 8 ++++++-- .../flash/abc/types/MethodBody.java | 19 ++++++++++++++---- .../flash/abc/types/traits/Trait.java | 12 ++++++++++- .../flash/abc/types/traits/TraitClass.java | 6 ++++++ .../flash/abc/types/traits/TraitFunction.java | 6 ++++++ .../types/traits/TraitMethodGetterSetter.java | 6 ++++++ .../abc/types/traits/TraitSlotConst.java | 6 ++++++ .../flash/abc/types/traits/Traits.java | 20 ++++++++++++++++++- 8 files changed, 75 insertions(+), 8 deletions(-) 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 7096854ee..a129b0937 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 @@ -1468,7 +1468,7 @@ public class AVM2Code implements Cloneable { //if(true) return ""; toSourceCount++; if (toSourceLimit > 0) { - if (toSourceCount > toSourceLimit) { + if (toSourceCount >= toSourceLimit) { throw new ConvertException("Limit of subs(" + toSourceLimit + ") was reached", start); } } @@ -2897,7 +2897,6 @@ public class AVM2Code implements Cloneable { for (int i = 0; i < code.size(); i++) { code.get(i).mappedOffset = ofs; ofs += code.get(i).getBytesLength(); - } } @@ -3353,6 +3352,11 @@ public class AVM2Code implements Cloneable { } ret.code = codeCopy; } + + cacheActual = false; + ignoredIns = new ArrayList<>(); + killedRegs = new HashMap<>(); + unknownJumps = new ArrayList<>(); return ret; } } 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 78dddb48a..6fdfaa16f 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 @@ -286,8 +286,9 @@ public final class MethodBody implements Cloneable { public Void call() throws InterruptedException { MethodBody converted = convertMethodBody(path, isStatic, scriptIndex, classIndex, abc, trait, constants, method_info, scopeStack, isStaticInitializer, fullyQualifiedNames, initTraits); HashMap localRegNames = getLocalRegNames(abc); - convertedItems = converted.getCode().toGraphTargetItems(path, isStatic, scriptIndex, classIndex, abc, constants, method_info, converted, localRegNames, scopeStack, isStaticInitializer, fullyQualifiedNames, initTraits, Graph.SOP_USE_STATIC, new HashMap<>(), converted.getCode().visitCode(converted)); - Graph.graphToString(convertedItems, writer, LocalData.create(constants, localRegNames, fullyQualifiedNames)); + List convertedItems1 = converted.getCode().toGraphTargetItems(path, isStatic, scriptIndex, classIndex, abc, constants, method_info, converted, localRegNames, scopeStack, isStaticInitializer, fullyQualifiedNames, initTraits, Graph.SOP_USE_STATIC, new HashMap<>(), converted.getCode().visitCode(converted)); + Graph.graphToString(convertedItems1, writer, LocalData.create(constants, localRegNames, fullyQualifiedNames)); + convertedItems = convertedItems1; return null; } }; @@ -359,7 +360,11 @@ public final class MethodBody implements Cloneable { throw ex; } catch (Throwable ex) { //ignore - return this; + body = clone(); + code = body.getCode(); + code.markMappedOffsets(); + code.fixJumps(path, body); + return body; } } @@ -381,7 +386,13 @@ public final class MethodBody implements Cloneable { } } - //maybe deep clone traits + // maybe deep clone traits + /*if (traits != null) { + ret.traits = traits.clone(); + }*/ + convertedItems = null; + convertException = null; + return ret; } catch (CloneNotSupportedException ex) { throw new RuntimeException(); 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 c71c05bd2..4f419cc1f 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 @@ -29,7 +29,7 @@ import com.jpexs.helpers.Helper; import java.io.Serializable; import java.util.List; -public abstract class Trait implements Serializable { +public abstract class Trait implements Cloneable, Serializable { private static final int[] EMPTY_METADATA_ARRAY = new int[0]; @@ -193,4 +193,14 @@ public abstract class Trait implements Serializable { String objectName = name.getName(abc.constants, null, false); return new ClassPath(packageName, objectName); //assume not null name } + + @Override + public Trait clone() { + try { + Trait ret = (Trait) super.clone(); + return ret; + } catch (CloneNotSupportedException ex) { + throw new RuntimeException(); + } + } } 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 dc2dae693..0e29d9df5 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 @@ -595,4 +595,10 @@ public class TraitClass extends Trait implements TraitWithSlot { ret += classInfo.static_traits.removeTraps(scriptIndex, class_info, true, abc, path); return ret; } + + @Override + public TraitClass clone() { + TraitClass ret = (TraitClass) super.clone(); + return ret; + } } 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 e1b2e06d0..e7b41acb6 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 @@ -109,4 +109,10 @@ public class TraitFunction extends Trait implements TraitWithSlot { } return 0; } + + @Override + public TraitFunction clone() { + TraitFunction ret = (TraitFunction) super.clone(); + return ret; + } } 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 80d583215..c15f42a4c 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 @@ -114,4 +114,10 @@ public class TraitMethodGetterSetter extends Trait { } return 0; } + + @Override + public TraitMethodGetterSetter clone() { + TraitMethodGetterSetter ret = (TraitMethodGetterSetter) super.clone(); + return ret; + } } 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 d5b6cbe25..ae2d114f6 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 @@ -181,4 +181,10 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { //do nothing return 0; } + + @Override + public TraitSlotConst clone() { + TraitSlotConst ret = (TraitSlotConst) super.clone(); + return ret; + } } 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 f1fd02df6..c9cb189cb 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 @@ -32,7 +32,7 @@ import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; -public class Traits implements Serializable { +public class Traits implements Cloneable, Serializable { public List traits; @@ -213,4 +213,22 @@ public class Traits implements Serializable { executor.shutdown(); } } + + @Override + public Traits clone() { + try { + Traits ret = (Traits) super.clone(); + + if (traits != null) { + ret.traits = new ArrayList<>(traits.size()); + for (int i = 0; i < traits.size(); i++) { + ret.traits.add(traits.get(i).clone()); + } + } + + return ret; + } catch (CloneNotSupportedException ex) { + throw new RuntimeException(); + } + } }