Записки о Flash

ClassExplorer

Класс ClassExplorer позволяет вам получать различную информацию о классах в загруженном SWF-ролике в формате XML.
С помощью этого класса вы можете выяснить, какие классы имеются в ролике, их имена, имена пакетов, права доступа, методы (имя, права доступа, передаваемые параметры и т.п.), геттеры/сеттеры, константы (даже их значения, если тип константы простой) и переменные класса, также другую информацию.

Пример выдаваемого XML (использовался thief.swf из ResourceThiefExample).

В целом, ничего, кроме XML демонстрировать нечего, поэтому я просто выложил исходники ClassExplorer.
Пожелания, комментарии к работе и предложения — велкам!

Если вам нужно получить только список имен классов, то есть вариант попроще — getDefinitionNames.


38 comments

38 Comments so far

  1. Denius July 31st, 2007 15:50

    И какая практическая ценность этого “чуда”?

  2. __etc July 31st, 2007 15:53

    Странный вопрос. Например, если загружается все время разный swf, то необходимо знать, что мы можем взять из данного swf, различные ресурсы и проч.
    В тех же играх будет полезно, например, грузить набор различных предметов, количество которых заранее неизвестно.

  3. Denius July 31st, 2007 15:56

    “В тех же играх будет полезно, например, грузить набор различных предметов, количество которых заранее неизвестно.”
    Читерство? :)

  4. __etc July 31st, 2007 16:08

    Ничего подобного. Есть, скажем, магазин по продаже различных предметов. Они могут со временем добавляться. Скажем, нам нужны весь список классов из этого SWF, наследуемых от, скажем, класса ShopItem. ClassExplorer решает данную задачу влет.

  5. iv August 7th, 2007 23:40

    Посмотрел реализацию.
    Охренеть дайте две!
    Представляю сколько времени ты рыл доки.
    Респект.

  6. __etc August 8th, 2007 00:59

    Не так уж и долго, несколько дней всего.
    Ты ещё декомпилятора не видел :D
    Но его надо переписывать, ибо я попал в «творческий» тупик.

  7. FSB August 10th, 2007 15:01

    реализация и в самом деле поражает ) А можно ли используя подобный парсер переназначить значение переменной в коде подгружаемого swf, вот только формат avm1 – это в догонку к теме передачи параметра из avm2 в avm1 при загрузке avm1 через loadBytes.

  8. __etc August 10th, 2007 15:48

    В принципе да. Только изначально число должно быть достаточно большим и умещалось в пять байт.

  9. [...] ClassExplorer, ResourceThief, FontLoader. В результате иной работы readMultibyte в [...]

  10. [...] ClassExplorer. Кто ещё не знает, ClassExplorer — класс, который позволяет [...]

  11. [...] p.S.: Функция находит только имена всех классов, функции пока за бортом. p.p.S.: Решение для тех, кто хочет знать о подгруженном swf боль

  12. Волгоградец February 4th, 2009 10:45

    Привет! Я смогу с помощью ClassExplorer достучаться до свойства или вызвать функцию одного из классов, не являющегося главным?

  13. etc February 4th, 2009 10:59

    Можно, но сначала нужно создать экземпляр нужного класса.

  14. Волгоградец February 4th, 2009 11:50

    Что-то я запутался. Вот у меня есть XML со списком классов и методов. Допустим есть такой узел:

    Как мне вызвать этот метод.
    И что значит информация в тэгах classTrait?

    Спасибо.

  15. Волгоградец February 4th, 2009 11:51
  16. etc February 4th, 2009 12:05

    Это вообще информация о том, какие классы существуют в загруженном SWF, какие у них методы, свойства и т. п.
    Чтобы иметь возможность вызывать нужные методы, нужно сначала создать экземпляр соответствующего класса, например, по имени, полученному из XML и вызвать метод.

  17. Волгоградец February 4th, 2009 12:08

    Понятно. Спасибо.

  18. MaxZ April 1st, 2009 17:52

    Добрый день!
    Такой вопрос – можно ли в avm1 клипе, загруженном в avm2, вызвать функцию, зная её имя и параметры. Ситуация такая, что функция в первом фрейме avm1 клипа описана. Использую такое обращение:
    loader.contentLoaderInfo.applicationDomain.getDefinition(“имя функции”)что вызывает следующую ошибку:

    ReferenceError: Error #1065: Переменная createInstance не определена.
    at flash.system::ApplicationDomain/getDefinition()
    at Main/onContentLoad()

    Подскажите пожалуйста в чём ошибка.

  19. etc April 1st, 2009 17:55

    AVM1 не совместима с AVM2 на подобном уровне. Максимум общение можно организовать по LocalConnection.

  20. MaxZ April 1st, 2009 19:26

    Пробую организовать это но натыкаюсь на грабли:
    а avm1 ролике пишу:
    var receiving_lc:LocalConnection = new LocalConnection();
    receiving_lc.methodToExecute = function(){
    this.attachMovie(“spr0_499477843″, “name1″, 1);
    }
    receiving_lc.connect(“lc_name”);

    в avm2:
    var lc:LocalConnection = new LocalConnection();
    lc.send(“lc_name”,”methodToExecute”);

    Получаю Error #2044: Необработанный StatusEvent:. level=error, code=
    Подскажите пожалуйста в чём ошибка.

  21. etc April 1st, 2009 21:16

    Это ошибки lc-соединения в avm2, нужно подписываться на событие статуса и искать причину.

  22. MaxZ April 1st, 2009 22:21

    ясно.Спасибо

  23. [...] я использовал ClassExplorer, за что отдельное спасибо автору. Для наших целей пришлось немного его подправить. Не [...]

  24. makc February 10th, 2010 02:24

    вот же ж фак, ArgumentError: Error #1063: Argument count mismatch on ru.etcs.utils::ClassExplorer/completeHandler(). Expected 1, got 0.

    это при loadBytes.

    замена setTimeout(this.completeHandler, 5); на setTimeout(this.completeHandler, 5, null); приводит к ожидаемой ошибке :( вобщем, надо допиливать.

  25. etc February 10th, 2010 05:02

    А, гм, loadBytes я вроде и не протестировал :)
    Ну поправим, как время будет.

  26. makc February 10th, 2010 16:02

    прописав там Event, опять же заставил его работать на 3х из 4х файлов, а на том же проблемном файле выдало некую хардкорную ошибку:
    Error: Error #2030: End of file was encountered.
    at flash.utils::ByteArray/readUnsignedByte()
    at ASTag/buildMethodTable()[D:\code\makc\flash\obfuscator\src\ru\etcs\utils\ClassExplorer.as:1381]
    at ASTag/parse()[D:\code\makc\flash\obfuscator\src\ru\etcs\utils\ClassExplorer.as:831]
    at ASTag/buildDefinition()[D:\code\makc\flash\obfuscator\src\ru\etcs\utils\ClassExplorer.as:687]
    at ru.etcs.utils::ClassExplorer/getDefinitionInfo()[D:\code\makc\flash\obfuscator\src\ru\etcs\utils\ClassExplorer.as:245]

    файл по любому целый, рабочий. Видать, тут какой-то глобальный мах в парсере.

  27. etc February 10th, 2010 18:39

    Не факт. А можно мне swf-ку на мыло?

  28. makc February 10th, 2010 20:11

    отослал

  29. etc February 12th, 2010 12:20

    ОК, посмотрю в ближайшее время.

  30. Andrey April 27th, 2010 12:28

    Класс очень крут. Помоги, плиз, со связанной задачкой. Хочу понять, реализуема ли она. Необходимо подгружать разные as3 флешки как bytearray и потом находить в них конструктор класса документа, чтобы его разбивать на конструктор и метод (вставив в нужное место определенные байты). Менять следующим видом:

    был конструктор типа:
    public function MainClass (){
    blah, blah, blah
    }

    делать из него
    public function MainClass (){
    }
    public function myMethod ():void{
    blah, blah, blah
    }

    Возможно ли такое сделать с bytearray и будет ли эта флешка работать? Как считаешь, будет ли работать если она пропущена через обфускатор?

  31. etc April 27th, 2010 15:10

    В теории возможно, на практике довольно геморройно. Обфускатор роли не играет.

  32. Don IndulgencI0 May 1st, 2010 02:00

    Ну а, скажем, перезатирать у закачанной флешки конструктор своим собственным можно? Получится ли? Типа, надо избавиться от кода в конструкторе залитой флешки, если он там есть. Перезатереть обычным с super() и всё. И вызвать.

  33. etc May 1st, 2010 13:55

    Можно попробовать создать классов с тем же пакетом и именем, что в подгружаемом ролике и загрузить в текущий ApplicationDomain. Тогда классы в подгруженном ролике не будут работать.

  34. Don IndulgencI0 May 3rd, 2010 17:52

    Ой-ой… Нам-то как раз надо, шоб работало все загруженное! Только соблюсти _чистый_ конструктор хотим, так как выпущен циркуляр НИЧЕГО НЕ ПИСАТь В КОНСТРУКТОР. И шоб девелоперы таки не писали уже, надо намеренно затирать… А дергаться будут запротоколированные методы… Как-то так..

  35. etc May 3rd, 2010 19:34

    В таком случае придется чего-нибудь хорошего скурить.

  36. PeSH June 24th, 2010 11:42

    А могу ли я собрать измененный хмл обратно во флэшку и использовать ее в ролике? Просто я не нашел функции, которая берет XML и превращает его в ByteArray объект, поэтому и спрашиваю.

  37. etc June 24th, 2010 11:47

    Нет, такой возможности нет.

  38. poco August 18th, 2010 11:06

    Отличный класс, полезная вещь

Leave a reply