替换SWF中的字符串

时间:2008-09-23 07:55:17

标签: flash

我们已经为大型Flash项目的不同客户修改了几十个版本的SWF,现在必须替换每个副本中脚本中嵌入的一些字符串。其中一些的FLA文件很难找到甚至丢失(我继承了这个混乱,重构它目前不是一个选项)。

是否有(免费)工具替换ActionScript中使用的字符串?我尝试使用swfmill将文件转换为XML并返回但是它无法处理字符串中包含的国际字符,所以我只能部分转换它们。大多数字符串都被正确提取,因此另一个工具可以完成这项工作。

11 个答案:

答案 0 :(得分:2)

你可以尝试Burak的URL Action Editor - 它说URL,但我很确定它可以让你编辑SWF中的任何文本。我没有使用它,但是我使用了他的ActionScript Viewer,它运行得非常好。

答案 1 :(得分:2)

您可以使用Apparat执行此类任务。它允许您更改SWF和SWC文件中的ActionScript 3字节码。

我更喜欢Scala源代码分支来完成您的任务。基本上代码看起来像这样:

val swf = Swf from "in.swf"
for(tag <- swf.tags) {
  (Abc fromTag tag) match {
    case Some(abc) => {
      val strings = abc.cpool.strings
      for(i <- 1 until strings.length) {
        if(strings(i) == 'search) {
          strings(i) = 'replacement
        }
      }
      abc write tag
    }
    case None =>
}
swf write "out.swf"

答案 2 :(得分:1)

我能提出的唯一建议是修复swfmill以支持国际角色。你可能想在swfmill邮件列表中提问(据我所知,swfmill @ swfmill.org)以获得最好的方法,如果你对C / C ++有点了解应该不会太难。

答案 3 :(得分:1)

如果文件正在使用actionscript 2,你可以使用http://flasm.sourceforge.net/进行反汇编和重新组装(当然:在重新组装之前修改字符串)。对于as3,adobe提供了一个可用于实现相同功能的反编译器,但我不认为如果你继承了flash,你的flash就不会是as3。

答案 4 :(得分:1)

这个也很好用,它是免费的:

http://www.free-decompiler.com/flash/

答案 5 :(得分:0)

棘手 - 它可能不会更容易,但你可以将'锁定'swf加载到你控制的一个,然后蜘蛛穿过它的对象,直到你点击TextBox,使用一些for ... in循环 - 它是一个将它们映射出来然后改变它们的漫长而艰巨的过程,特别是如果以前的开发人员没有以有用的方式命名,但如果它是一个相当简单的.swf那么它可能太糟糕了......

此外,还有一个用于反编译swfs的mac-only实用程序,我记得有一个同事发誓,但我不记得这个名字......任何人?

答案 6 :(得分:0)

艰难的一个 - 你试过Sothink反编译器吗?如果这不起作用,我会说尝试将swf加载到另一个swf中,然后向下钻取并更改文本字段的内容 - 类似于_root.loadedswf.clip1.box2.textField.text = "New text"; 显然,如果应用程序很复杂,这可能不起作用。

答案 7 :(得分:0)

答案 8 :(得分:0)

在我看来,swfmill更新了他们的工具以支持国际角色,至少对于拉脱维亚语言(需要UTF-8)。字符串被编码为HTML实体。

解决了传统swf文件的一些类似问题。

答案 9 :(得分:0)

您可以尝试Swiffotron,其中包括在舞台和动作中替换文字的功能。

以下是unit test input file from the project,其中显示了如何完成此操作:

答案 10 :(得分:0)

最终为此工作做得很好(我有一些需要修改的遗留文件)。我无法使Joa的Scala代码工作,所以我最终用Java实现了他的解决方案。

  1. 下载binaries
  2. 确保安装了Scala(即使解决方案是纯Java,仍然需要库)。
  3. 使用适当的类路径编译并运行下面的代码(指向带有文件夹二进制文件的文件夹以及Scala库)。
    1. javac -classpath ".;apparat/*;C:/path/to/scala/lib/*" SwfEditor.java
    2. java -classpath ".;apparat/*;C:/path/to/scala/lib/*" SwfEditor
  4. import apparat.swf.Swf;
    import apparat.abc.Abc;
    import apparat.swf.SwfTag;
    import scala.collection.Iterator;
    import scala.Symbol;
    import apparat.swf.DoABC;
    
    class SwfEditor {
    
      public static void main(String[] args){
        Swf input = Swf.fromFile("in.swf");
        Iterator<SwfTag> iter = input.tags().iterator();
        while (iter.hasNext()) {
          SwfTag tag = iter.next();
          if(tag instanceof DoABC) {
            DoABC doABCTag = (DoABC) tag;
            Abc abc = Abc.fromTag(doABCTag).getOrElse(null);
            Symbol[] strings = abc.cpool().strings();
            for(int i=0; i<strings.length; i++) {
              String string = strings[i].toString();
              if(string == "'search")) {
                strings[i] = new Symbol("replacement");
              }
            }
            abc.write(doABCTag);
          }
        }
        input.write("out.swf");
      }
    }