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

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

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

[UX] Категории и настройки внешнего вида Flash-сообщений
[UX] Категории и настройки внешнего вида Flash-сообщений
Flash-сообщение - это обычный веб-элемент, используемый для отправки короткого сообщения пользователю. Например, на странице входа в систему может...
7
0
10 416
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

сложно - это может быть не проще, но вы можете загрузить 'заблокированный' swf в тот, который вы контролируете, а затем пролистать его объекты, пока не нажмете TextBox, используя некоторые циклы for ... in - это было бы долгим, трудным процесс, чтобы отобразить их, а затем изменить их, особенно если предыдущий разработчик не назвал вещи полезным способом, но если это довольно простой .swf, тогда это может быть очень плохо ...

Кроме того, есть утилита только для Mac для декомпиляции swf-файлов, которую я помню, как клялся коллега, но я не помню имени ... кто-нибудь?

Что ж, единственный совет, который я могу дать, - это исправить swfmill для поддержки международных символов. Возможно, вы захотите спросить в списке рассылки swfmill ([email protected], насколько мне известно), как это сделать, не должно быть слишком сложно, если вы немного знаете C / C++.

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

Ответ принят как подходящий

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

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

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

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

Решены аналогичные проблемы с устаревшим файлом SWF.

Вы можете использовать Аппарат для такого рода задач. Он позволяет изменять байт-код 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"

Я получил apparat.abc.Abc OutputStream.write 30, когда он пытается записать замененную строку. Вы можете помочь?

Victor Kotseruba 22.06.2010 05:40

Я не мог заставить работать приведенный выше код Scala. В итоге я реализовал ту же концепцию на Java.

Fausto Morales 26.07.2016 20:56

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

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

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

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

Apparat отлично справился с этим (у меня есть несколько устаревших файлов, которые нужно изменить). Мне не удалось заставить работать код Joa 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");
  }
}

Другие вопросы по теме