ClassExplorer
Класс ClassExplorer позволяет вам получать различную информацию о классах в загруженном SWF-ролике в формате XML.
С помощью этого класса вы можете выяснить, какие классы имеются в ролике, их имена, имена пакетов, права доступа, методы (имя, права доступа, передаваемые параметры и т.п.), геттеры/сеттеры, константы (даже их значения, если тип константы простой) и переменные класса, также другую информацию.
Пример выдаваемого XML (использовался thief.swf из ResourceThiefExample).
В целом, ничего, кроме XML демонстрировать нечего, поэтому я просто выложил исходники ClassExplorer.
Пожелания, комментарии к работе и предложения — велкам!
Если вам нужно получить только список имен классов, то есть вариант попроще — getDefinitionNames.
38 comments
38 Comments so far
Leave a reply
И какая практическая ценность этого “чуда”?
Странный вопрос. Например, если загружается все время разный swf, то необходимо знать, что мы можем взять из данного swf, различные ресурсы и проч.
В тех же играх будет полезно, например, грузить набор различных предметов, количество которых заранее неизвестно.
“В тех же играх будет полезно, например, грузить набор различных предметов, количество которых заранее неизвестно.”
Читерство?
Ничего подобного. Есть, скажем, магазин по продаже различных предметов. Они могут со временем добавляться. Скажем, нам нужны весь список классов из этого SWF, наследуемых от, скажем, класса ShopItem. ClassExplorer решает данную задачу влет.
Посмотрел реализацию.
Охренеть дайте две!
Представляю сколько времени ты рыл доки.
Респект.
Не так уж и долго, несколько дней всего.
Ты ещё декомпилятора не видел
Но его надо переписывать, ибо я попал в «творческий» тупик.
реализация и в самом деле поражает ) А можно ли используя подобный парсер переназначить значение переменной в коде подгружаемого swf, вот только формат avm1 – это в догонку к теме передачи параметра из avm2 в avm1 при загрузке avm1 через loadBytes.
В принципе да. Только изначально число должно быть достаточно большим и умещалось в пять байт.
[...] ClassExplorer, ResourceThief, FontLoader. В результате иной работы readMultibyte в [...]
[...] ClassExplorer. Кто ещё не знает, ClassExplorer — класс, который позволяет [...]
[...] p.S.: Функция находит только имена всех классов, функции пока за бортом. p.p.S.: Решение для тех, кто хочет знать о подгруженном swf боль
Привет! Я смогу с помощью ClassExplorer достучаться до свойства или вызвать функцию одного из классов, не являющегося главным?
Можно, но сначала нужно создать экземпляр нужного класса.
Что-то я запутался. Вот у меня есть XML со списком классов и методов. Допустим есть такой узел:
Как мне вызвать этот метод.
И что значит информация в тэгах classTrait?
Спасибо.
Это вообще информация о том, какие классы существуют в загруженном SWF, какие у них методы, свойства и т. п.
Чтобы иметь возможность вызывать нужные методы, нужно сначала создать экземпляр соответствующего класса, например, по имени, полученному из XML и вызвать метод.
Понятно. Спасибо.
Добрый день!
Такой вопрос – можно ли в avm1 клипе, загруженном в avm2, вызвать функцию, зная её имя и параметры. Ситуация такая, что функция в первом фрейме avm1 клипа описана. Использую такое обращение:
loader.contentLoaderInfo.applicationDomain.getDefinition(“имя функции”)что вызывает следующую ошибку:
ReferenceError: Error #1065: Переменная createInstance не определена.
at flash.system::ApplicationDomain/getDefinition()
at Main/onContentLoad()
Подскажите пожалуйста в чём ошибка.
AVM1 не совместима с AVM2 на подобном уровне. Максимум общение можно организовать по LocalConnection.
Пробую организовать это но натыкаюсь на грабли:
а 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=
Подскажите пожалуйста в чём ошибка.
Это ошибки lc-соединения в avm2, нужно подписываться на событие статуса и искать причину.
ясно.Спасибо
[...] я использовал ClassExplorer, за что отдельное спасибо автору. Для наших целей пришлось немного его подправить. Не [...]
вот же ж фак, 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); приводит к ожидаемой ошибке
вобщем, надо допиливать.
А, гм, loadBytes я вроде и не протестировал
Ну поправим, как время будет.
прописав там 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]
файл по любому целый, рабочий. Видать, тут какой-то глобальный мах в парсере.
Не факт. А можно мне swf-ку на мыло?
отослал
ОК, посмотрю в ближайшее время.
Класс очень крут. Помоги, плиз, со связанной задачкой. Хочу понять, реализуема ли она. Необходимо подгружать разные as3 флешки как bytearray и потом находить в них конструктор класса документа, чтобы его разбивать на конструктор и метод (вставив в нужное место определенные байты). Менять следующим видом:
был конструктор типа:
public function MainClass (){
blah, blah, blah
}
делать из него
public function MainClass (){
}
public function myMethod ():void{
blah, blah, blah
}
Возможно ли такое сделать с bytearray и будет ли эта флешка работать? Как считаешь, будет ли работать если она пропущена через обфускатор?
В теории возможно, на практике довольно геморройно. Обфускатор роли не играет.
Ну а, скажем, перезатирать у закачанной флешки конструктор своим собственным можно? Получится ли? Типа, надо избавиться от кода в конструкторе залитой флешки, если он там есть. Перезатереть обычным с super() и всё. И вызвать.
Можно попробовать создать классов с тем же пакетом и именем, что в подгружаемом ролике и загрузить в текущий ApplicationDomain. Тогда классы в подгруженном ролике не будут работать.
Ой-ой… Нам-то как раз надо, шоб работало все загруженное! Только соблюсти _чистый_ конструктор хотим, так как выпущен циркуляр НИЧЕГО НЕ ПИСАТь В КОНСТРУКТОР. И шоб девелоперы таки не писали уже, надо намеренно затирать… А дергаться будут запротоколированные методы… Как-то так..
В таком случае придется чего-нибудь хорошего скурить.
А могу ли я собрать измененный хмл обратно во флэшку и использовать ее в ролике? Просто я не нашел функции, которая берет XML и превращает его в ByteArray объект, поэтому и спрашиваю.
Нет, такой возможности нет.
Отличный класс, полезная вещь