From c9fe0153e4e92eeca53e148f8b92870810e743e9 Mon Sep 17 00:00:00 2001 From: alterdekim Date: Tue, 31 Dec 2024 00:16:13 +0300 Subject: [PATCH] draft --- README.md | 0 .../com/alterdekim/flash/decompiler/Main.java | 2 +- .../flash/decompiler/action/ActionAdd.java | 10 ++++++++ .../decompiler/translator/Flash2Java.java | 25 +++++++++++++++++++ .../flash/decompiler/util/ActionField.java | 1 + 5 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 README.md create mode 100644 src/main/java/com/alterdekim/flash/decompiler/action/ActionAdd.java diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/alterdekim/flash/decompiler/Main.java b/src/main/java/com/alterdekim/flash/decompiler/Main.java index 05900dc..c270cde 100644 --- a/src/main/java/com/alterdekim/flash/decompiler/Main.java +++ b/src/main/java/com/alterdekim/flash/decompiler/Main.java @@ -12,7 +12,7 @@ import java.io.File; public class Main { public static void main(String[] args) throws Exception { FlashDecompiler decompiler = new FlashDecompiler(); - ShockwaveFile file = decompiler.loadFromFile(new File("catalogs.swf")); + ShockwaveFile file = decompiler.loadFromFile(new File("D:\\Documents\\rtmpSpring\\static\\swf\\cache\\rus\\resources.swf")); DoAction da = (DoAction) file.getTags() .stream() diff --git a/src/main/java/com/alterdekim/flash/decompiler/action/ActionAdd.java b/src/main/java/com/alterdekim/flash/decompiler/action/ActionAdd.java new file mode 100644 index 0000000..ab7d2d6 --- /dev/null +++ b/src/main/java/com/alterdekim/flash/decompiler/action/ActionAdd.java @@ -0,0 +1,10 @@ +package com.alterdekim.flash.decompiler.action; + +import com.alterdekim.flash.decompiler.util.ActionField; + +public class ActionAdd extends ByteCodeAction { + @Override + public ActionField getType() { + return ActionField.Add; + } +} diff --git a/src/main/java/com/alterdekim/flash/decompiler/translator/Flash2Java.java b/src/main/java/com/alterdekim/flash/decompiler/translator/Flash2Java.java index 87855cb..24a70d8 100644 --- a/src/main/java/com/alterdekim/flash/decompiler/translator/Flash2Java.java +++ b/src/main/java/com/alterdekim/flash/decompiler/translator/Flash2Java.java @@ -5,6 +5,7 @@ import com.alterdekim.flash.decompiler.item.ActionPushType; import com.alterdekim.flash.decompiler.action.ByteCodeAction; import com.alterdekim.flash.decompiler.item.ByteCodeItem; import com.alterdekim.flash.decompiler.item.PoolIndexItem; +import com.alterdekim.flash.decompiler.item.StringItem; import com.alterdekim.flash.decompiler.tag.DoAction; import com.alterdekim.flash.decompiler.util.ActionField; import lombok.extern.slf4j.Slf4j; @@ -20,6 +21,7 @@ public class Flash2Java { this.pool = doAction.getActionPool(); List actions = doAction.getActions(); + // convert stack from List to List and rewrite all code accordingly. List stack = new ArrayList<>(); Map vars = new HashMap<>(); for (ByteCodeAction action : actions) { @@ -37,6 +39,9 @@ public class Flash2Java { setMember(vars, stack); stack.clear(); break; + case Add: + reduceViaAdder(stack); + break; default: stack.add(action); } @@ -47,6 +52,24 @@ public class Flash2Java { return vars; } + private void reduceViaAdder(List stack) { + // get last 2 elements from stack + List si = new ArrayList<>(); + List g = new ArrayList<>(); + for( int i = stack.size()-1; i >= 0; i-- ) { + ByteCodeAction e = stack.get(i); + if( e.getType() != ActionField.Push ) continue; + ActionPush push = (ActionPush) e; + if( push.getItems().size() >= 2 ) { + StringItem from = (StringItem) push.getItems().get(push.getItems().size()-1); + StringItem to = (StringItem) push.getItems().get(push.getItems().size()-2); + push.getItems().remove() + ((String) to.getValue()) + ((String) from.getValue()) + } + } + + } + private void setMember(Map vars, List stack) { String varKey = vars.keySet().stream().filter(k -> vars.get(k).isActive()).findFirst().get(); FlashVar varVal = vars.get(varKey); @@ -71,6 +94,8 @@ public class Flash2Java { private Object valConverter(ByteCodeItem item) { if ( item.getType() == ActionPushType.POOL_INDEX ) { return fromPool( (Integer) item.getValue() ); + } else if ( item.getType() == ActionPushType.STRING ) { + return item.getValue(); } return item.getValue(); } diff --git a/src/main/java/com/alterdekim/flash/decompiler/util/ActionField.java b/src/main/java/com/alterdekim/flash/decompiler/util/ActionField.java index 7eba522..7519ce2 100644 --- a/src/main/java/com/alterdekim/flash/decompiler/util/ActionField.java +++ b/src/main/java/com/alterdekim/flash/decompiler/util/ActionField.java @@ -7,6 +7,7 @@ public enum ActionField { DefineLocal((byte) 0x3C), SetMember((byte)0x4F), GetVariable((byte) 0x1C), + Add((byte) 0x47), Unknown((byte) 0x00); public final byte id;