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 324bdf93c..ad559c5ac 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -659,6 +659,7 @@ public final class SWF implements SWFContainerItem, Timelined { if (hasEndTag) { sos.writeUI16(0); } + sos.close(); os.write(Utf8Helper.getBytes(getHeaderBytes(compression, gfx))); os.write(version); @@ -711,6 +712,7 @@ public final class SWF implements SWFContainerItem, Timelined { } else if (compression == SWFCompression.ZLIB) { os = new DeflaterOutputStream(os); } + os.write(data); } finally { if (os != null) { @@ -2028,11 +2030,13 @@ public final class SWF implements SWFContainerItem, Timelined { ret++; } } + for (ASMSource src : actionsMap.keySet()) { actionsMap.get(src).removeNops(); src.setActions(actionsMap.get(src)); src.setModified(); } + deobfuscation.deobfuscateInstanceNames(false, deobfuscated, renameType, tags, selected); return ret; } 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 89c61d4c2..dd4f0c853 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFInputStream.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFInputStream.java @@ -17,7 +17,6 @@ package com.jpexs.decompiler.flash; import com.jpexs.decompiler.flash.action.Action; -import com.jpexs.decompiler.flash.action.model.ConstantPool; import com.jpexs.decompiler.flash.action.special.ActionEnd; import com.jpexs.decompiler.flash.action.special.ActionNop; import com.jpexs.decompiler.flash.action.swf3.ActionGetURL; @@ -1565,11 +1564,10 @@ public class SWFInputStream implements AutoCloseable { /** * Reads one Action from the stream * - * @param cpool * @return Action or null when ActionEndFlag or end of the stream * @throws IOException */ - public Action readAction(ConstantPool cpool) throws IOException { + public Action readAction() throws IOException { int actionCode = -1; try { @@ -1603,7 +1601,7 @@ public class SWFInputStream implements AutoCloseable { case 0x09: return new ActionStopSounds(); case 0x8A: - return new ActionWaitForFrame(actionLength, this, cpool); + return new ActionWaitForFrame(actionLength, this); case 0x8B: return new ActionSetTarget(actionLength, this, swf.version); case 0x8C: @@ -1684,7 +1682,7 @@ public class SWFInputStream implements AutoCloseable { case 0x28: return new ActionEndDrag(); case 0x8D: - return new ActionWaitForFrame2(actionLength, this, cpool); + return new ActionWaitForFrame2(actionLength, this); case 0x26: return new ActionTrace(); case 0x34: diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFOutputStream.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFOutputStream.java index e739f8361..eb82cc566 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFOutputStream.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFOutputStream.java @@ -153,11 +153,15 @@ public class SWFOutputStream extends OutputStream { /** * Writes UI8 (Unsigned 8bit integer) value to the stream * - * @param val UI8 value to write + * @param value UI8 value to write * @throws IOException */ - public void writeUI8(int val) throws IOException { - write(val); + public void writeUI8(int value) throws IOException { + if (value > 0xff) { + throw new Error("Value is too large for UI8: " + value); + } + + write(value); } /** @@ -167,7 +171,14 @@ public class SWFOutputStream extends OutputStream { * @throws IOException */ public void writeString(String value) throws IOException { - write(Utf8Helper.getBytes(value)); + byte[] data = Utf8Helper.getBytes(value); + for (int i = 0; i < data.length; i++) { + if (data[i] == 0) { + throw new IOException("String should not contain null character."); + } + } + + write(data); write(0); } @@ -178,6 +189,10 @@ public class SWFOutputStream extends OutputStream { * @throws IOException */ public void writeUI32(long value) throws IOException { + if (value > 0xffffffffL) { + throw new Error("Value is too large for UI32: " + value); + } + write((int) (value & 0xff)); write((int) ((value >> 8) & 0xff)); write((int) ((value >> 16) & 0xff)); @@ -191,6 +206,10 @@ public class SWFOutputStream extends OutputStream { * @throws IOException */ public void writeUI16(int value) throws IOException { + if (value > 0xffff) { + throw new Error("Value is too large for UI16: " + value); + } + write((int) (value & 0xff)); write((int) ((value >> 8) & 0xff)); } @@ -202,6 +221,10 @@ public class SWFOutputStream extends OutputStream { * @throws IOException */ public void writeSI32(long value) throws IOException { + if (value > 0x7fffffffL) { + throw new Error("Value is too large for SI32: " + value); + } + writeUI32(value); } @@ -212,6 +235,10 @@ public class SWFOutputStream extends OutputStream { * @throws IOException */ public void writeSI16(int value) throws IOException { + if (value > 0x7fff) { + throw new Error("Value is too large for SI16: " + value); + } + writeUI16(value); } @@ -222,6 +249,10 @@ public class SWFOutputStream extends OutputStream { * @throws IOException */ public void writeSI8(int value) throws IOException { + if (value > 0x7ff) { + throw new Error("Value is too large for SI8: " + value); + } + writeUI8(value); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionListReader.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionListReader.java index 78a09459e..6c2f8852d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionListReader.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionListReader.java @@ -1,16 +1,16 @@ /* * 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. */ @@ -131,13 +131,11 @@ public class ActionListReader { * @throws java.lang.InterruptedException */ public static ActionList readActionList(List listeners, SWFInputStream sis, int version, int ip, int endIp, String path, int deobfuscationMode) throws IOException, InterruptedException { - ConstantPool cpool = new ConstantPool(); - // Map of the actions. Use TreeMap to sort the keys in ascending order // actionMap and nextOffsets should contain exaclty the same keys Map actionMap = new TreeMap<>(); Map nextOffsets = new HashMap<>(); - Action entryAction = readActionListAtPos(listeners, cpool, + Action entryAction = readActionListAtPos(listeners, null, sis, actionMap, nextOffsets, ip, 0, endIp, path, false, new ArrayList()); @@ -238,12 +236,10 @@ public class ActionListReader { } public static List getOriginalActions(SWFInputStream sis, int startIp, int endIp) throws IOException, InterruptedException { - ConstantPool cpool = new ConstantPool(); - // Map of the actions. Use TreeMap to sort the keys in ascending order Map actionMap = new TreeMap<>(); Map nextOffsets = new HashMap<>(); - readActionListAtPos(new ArrayList(), cpool, + readActionListAtPos(new ArrayList(), null, sis, actionMap, nextOffsets, startIp, startIp, endIp + 1, "", false, new ArrayList()); @@ -690,7 +686,7 @@ public class ActionListReader { sis.seek((int) ip); Action a; - if ((a = sis.readAction(cpool)) == null) { + if ((a = sis.readAction()) == null) { break; } @@ -729,10 +725,7 @@ public class ActionListReader { if (a instanceof ActionPush && cpool != null) { ((ActionPush) a).constantPool = cpool.constants; } else if (a instanceof ActionConstantPool) { - if (cpool == null) { - cpool = new ConstantPool(); - } - cpool.setNew(((ActionConstantPool) a).constantPool); + cpool = new ConstantPool(((ActionConstantPool) a).constantPool); } else if (a instanceof ActionIf) { ActionIf aIf = (ActionIf) a; long nIp = ip + actionLengthWithHeader + aIf.getJumpOffset(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/pcode/ASMParser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/pcode/ASMParser.java index 569ce320a..2c1485919 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/pcode/ASMParser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/pcode/ASMParser.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.flash.action.parser.pcode; import com.jpexs.decompiler.flash.action.Action; @@ -128,14 +129,16 @@ import com.jpexs.helpers.Helper; import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Stack; import java.util.logging.Level; import java.util.logging.Logger; public class ASMParser { - public static ActionList parse(boolean ignoreNops, List