ClassExplorer

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

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

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

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

42 Responses to ClassExplorer

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

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

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

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

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

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

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

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

  9. Pingback: Записки о Flash » Обновление ClassExplorer, ResourceThief, FontLoader

  10. Pingback: Записки о Flash » Обновление ClassExplorer

  11. Pingback: Записки о Flash » getDefinitionNames

  12. Волгоградец

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

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

  14. Волгоградец

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

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

    Спасибо.

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

  17. Волгоградец

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

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

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

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

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

  20. Пробую организовать это но натыкаюсь на грабли:
    а 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. Это ошибки lc-соединения в avm2, нужно подписываться на событие статуса и искать причину.

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

  23. Pingback: Preloading in three frames system. « FlashImp

  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. А, гм, loadBytes я вроде и не протестировал :)
    Ну поправим, как время будет.

  26. прописав там 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. Не факт. А можно мне swf-ку на мыло?

  28. отослал

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

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

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

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

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

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

  32. Don IndulgencI0

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

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

  34. Don IndulgencI0

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

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

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

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

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

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

    Мужик, ну у тебя и запросы! :)

  40. Hi
    I used ClassExplorer in an application that analyzes in depth the contents of Flex apps and modules.
    With Flex4, and or last versions of FP, the class crashes, because information seems to be missing, such as multiname which may be null on some classes.
    If I patch your code to avoid crashes, with continue added inside loops, then I am only able to discover classes from flash/flex framework, not from my own SWF with its custom classes.
    This really breaks my app, and I really need it.
    Do you have a solution please ?
    Thanks very much for helping

  41. Hi
    I used ClassExplorer in an application that analyzes in depth the contents of Flex apps and modules.
    With Flex4, and or last versions of FP, the class crashes, because information seems to be missing, such as multiname which may be null on some classes.
    If I patch your code to avoid crashes, with continue added inside loops, then I am only able to discover classes from flash/flex framework, not from my own SWF with its custom classes.
    This really breaks my app, and I really need it.
    Do you have a solution please ?

    Thanks very much for helping

  42. Maybe on holidays

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>