2010-10-05 3 views
3

Вау, мое первое сообщение о переполнении стека. «Я приехал»?Временная интроспекция связанного SWC с использованием ActionScript 3.0 + Flash/Flex

Хорошо, это странный выбор. Я пытаюсь определить, может ли быть какой-то программный способ интроспекции классов внутри связанного SWC во время выполнения.

Чтобы дать немного больше фона (возможно, есть совершенно другой способ сделать это), я рассматриваю общую структуру для Font Embedding. В настоящее время для внедрения шрифтов (с использованием связанного SWC, а не метатега [embed]) вам необходимо встроить шрифт в свой SWC с помощью Flash IDE, а затем вам нужно жестко закодировать ссылку на класс ресурса библиотеки в своем кода (возможно, создается кем-то другим, например, с использованием другой среды IDE - FlashDevelop).

Теперь, если бы во время выполнения можно было исследовать SWC и проходить через классы, которые он предоставляет, теоретически можно запрограммировать/зарегистрировать эти шрифты программно, не зная (во время компиляции), какими могут быть эти шрифты.

Следовательно, возникает вопрос: может ли кто-нибудь узнать, каким образом получить доступ к SWC как сущности во время выполнения и изучить его уязвимые классы?


В качестве стороннего аргумента в пользу такого рода вещей является простое стремление к четкому разделению обязанностей по проектированию и логике приложений. Дизайнеру легко вставлять шрифт, автора и SWC, а также редактировать соответствующий внешний файл CSS. Гораздо опаснее рассчитывать на то, что они будут обновлять жесткие ссылки на классы в коде или рассчитывать на то, что клиент не изменит свое мнение об использовании шрифта после того, как задание было скомпилировано и выпущено.

+0

describeType() работает на множестве объектов во время выполнения и легко разбирается. Однако я не могу найти объект верхнего уровня, который содержит классы и свойства, выставленные скомпилированным SWC. Думаю, мне нужно узнать, в какую область загружены классы SWC. –

+0

Информация, полученная от Senocular, и другие, похоже, указывают, что классы внутри SWC не отображаются с FP10. –

ответ

1

Вы может загрузить файл в виде двоичного файла (или использовать свойство bytes для LoaderInfo сцены, если это основной файл), просмотреть «теги» для данных ABC, проанализировать его и найти данных, которые вам нужны. Хотя это хлопот.

Есть такие вещи, как теги шрифтов. DefineFont2 (тег типа 48), который содержит FontID и FontName, DefineFontName (тег типа 88), который также содержит FontID и FontName. Возможно, это данные, которые вам нужны. Если да, то может быть безумно быстро просмотреть даже самые большие файлы.

Вы можете прочитать .swf спецификации формата файла здесь: http://www.adobe.com/devnet/swf.html

+0

Да, как оказалось, это, вероятно, единственное решение, пока Adobe не поддерживает какой-то метод getDefninitions().Пару парней уже сделали это, хотя AFAICT они не заходят так далеко, чтобы фильтровать по типу. http://www.bytearray.org/?p=175 (SWFExplorer), http://etcs.ru/pre/ClassExplorer/ (ClassExplorer), а затем oddball http://etcs.ru/pre/FontLoaderDemo/ srcview/(FontLoader), который ищет шрифты, встроенные в textFields в SWF, а затем создает класс для этого шрифта с помощью byteArray. –

+0

Я также завладел техническими спецификациями SWF, а также спецификацией AVM2, и мне удалось получить определение типа тега. Но я буду честен, даже после рассмотрения кода SWFExplorer и ClassExplorer, я не могу понять, достаточно ли для того, чтобы модифицировать или создавать парсер, который может отфильтровать на основе типа тега. –

+0

Ну, если вы можете определить тип тега, то вы на полпути. Этот процесс выглядит примерно так. Прочитайте тип тега, если он не тот, который вы ищете, тогда вы прочтете длину (проверьте типы тегов в спецификации swf для разницы в длине длинной и короткой метки), которая является длиной текущего тега. Пропустите это число байтов и начните сначала. Если это тег, который вы ищете, вы используете спецификацию swf. и читайте байты, пока не получите необходимую информацию. – Joony

0

Вы должны смотреть на FLexSpy (fxspy) http://code.google.com/p/fxspy/

Есть некоторые другие, что там будет полезно, тоже:

KapInspect: http://lab.kapit.fr/display/kapinspect/Kap+Inspect

DeMonster DeBugger: http://demonsterdebugger.com/

+0

Спасибо за ответ. К сожалению, это все внешние программы, которые выполняются на скомпилированном (и предположительно исполняемом) объектном коде. Я ищу (возможно, родной) метод для интроспекции SWC во время выполнения, с той же базой кода, в которую был скомпилирован SWC. –

Смежные вопросы