Замена строк внутри SWF - PullRequest
       11

Замена строк внутри SWF

7 голосов
/ 23 сентября 2008

У нас есть десятки версий SWF, модифицированных для разных заказчиков большого проекта Flash, и теперь нам придется заменить некоторые строки, встроенные в скрипты, в каждой копии. FLA-файл для некоторых из них очень трудно найти или даже отсутствует (я унаследовал этот беспорядок, и рефакторинг в настоящее время не вариант).

Существует ли (бесплатный) инструмент для замены строк, используемых в ActionScript? Я попытался swfmill конвертировать файлы в XML и обратно, но он не может обрабатывать международные символы, содержащиеся в строках, поэтому я смог преобразовать их только частично. Большинство строк были правильно извлечены, поэтому другой инструмент мог бы выполнить эту работу.

Ответы [ 11 ]

2 голосов
/ 25 января 2010

Вы можете использовать Аппарат для такого рода задач. Это позволяет изменять байт-код ActionScript 3 в файлах SWF и SWC.

Я бы предпочел ветку исходного кода 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 голосов
/ 02 октября 2008

Вы можете попробовать Burak URL Action Editor - там написано URL, но я уверен, что он позволяет вам редактировать любой текст в SWF. Я не использовал его, но я использовал его ActionScript Viewer, который прекрасно работает.

1 голос
/ 26 февраля 2014

Это тоже очень хорошо работает и бесплатно:

http://www.free -decompiler.com / вспышка /

1 голос
/ 12 октября 2008

Если файлы используют ActionScript 2, возможно, вы можете разобрать и собрать, используя http://flasm.sourceforge.net/ (И, конечно, измените строки перед повторной сборкой). Для as3 Adobe предоставляет декомпилятор, который может быть использован для достижения того же, но я не думаю, что ваша флэш-память будет as3, если вы унаследовали ее.

1 голос
/ 23 сентября 2008

Ну, единственный совет, который я могу придумать, это исправить swfmill для поддержки международных символов. Возможно, вы захотите спросить в списке рассылки swfmill (насколько я знаю, swfmill@swfmill.org), как это сделать, не должно быть слишком сложно, если вы немного знаете C / C ++.

0 голосов
/ 26 июля 2016

Аппарат отлично сработал для этого (у меня есть несколько устаревших файлов, которые нужно было изменить). Я не смог заставить работать код Scala Джоа, поэтому я в итоге реализовал его решение на Java.

  1. Скачать двоичные файлы .
  2. Убедитесь, что Scala установлена ​​(библиотеки по-прежнему требуются, хотя решение находится на чистой Java).
  3. Скомпилируйте и запустите приведенный ниже код, используя соответствующий путь к классу (указывая на папку с бинарными файлами Apparat, а также ваши библиотеки Scala).
    1. javac -classpath ".;apparat/*;C:/path/to/scala/lib/*" SwfEditor.java
    2. java -classpath ".;apparat/*;C:/path/to/scala/lib/*" SwfEditor
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");
  }
}
0 голосов
/ 15 сентября 2011

Вы можете попробовать Swiffotron , который включает возможность замены текста как на сцене, так и в ActionScript.

Вот файл ввода модульного теста из проекта , который показывает, как это можно сделать:

0 голосов
/ 25 января 2010

Мне кажется, что swfmill обновил свой инструмент для поддержки международных символов, по крайней мере, для латышского языка (который требует UTF-8). Строки кодируются как HTML-объекты.

Решены некоторые похожие проблемы с устаревшим SWF-файлом.

0 голосов
/ 15 ноября 2009

Как насчет этого? http://code.google.com/p/swfreplacer/wiki/Intro

0 голосов
/ 23 сентября 2008

Сложный - вы пробовали декомпилятор Sothink ? Если это не сработает, я бы сказал, попробуйте загрузить SWF в другой SWF, затем разверните и измените содержимое текстового поля - что-то вроде _root.loadedswf.clip1.box2.textField.text = "New text"; Очевидно, это может не сработать, если приложение сложное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...