Перескладання SWF за допомогоюбібліотеки as3swf, CODE STAGE
DEVELOPMENT & RESEARCH
Перескладання SWF за допомогою бібліотеки as3swf
Вітання! Давненько у нас не було гарного розбійницького нальоту тематичного контенту — час би це виправити!)
Отже, як ви вже напевно здогадалися з теми цього посту, мова піде про застосування бібліотеки as3swf для редагування SWF файлу. Для початку, розповім трохи про саму бібліотеку. Вона призначена для розколупування SWF файлів в реальному часі - за допомогою as3swf ви можете розпарсувати SWF файл з масиву байт, пробігтися по всіх його тегах, з'ясувати всі його характеристики (такі як частота кадрів, версія і т.д.), а також, що дуже приємно, ви можете внести зміни в розпарений SWF - видалити, додати, замінити або змінити будь-який тег, і після всіх змін зберегти SWF масив байт. Можна навіть створити SWF із нуля. as3swf доступна для всіляких дій на гітхабі: https://github.com/claus/as3swf
Єдине, чого мені не вистачало в цій бібліотеці для ряду завдань, то це повноцінної підтримки парсингу та зміни ABC байткоду, який міститься в тэзі DoABC. Автор as3swf починав колись реалізовувати подібний функціонал як окрему бібліотеку, але потім припинив її підтримувати, і в даний момент цей проект вже не актуальний.
З іншого боку, мені цілком зрозумілі причини його вирішення — адже для цих цілей є чудова бібліотека as3commons bytecode, яка хоч якось, але розвивається і підтримується: http://as3-commons.googlecode.com/svn/trunk/as3 -commons-bytecode/changelog.txt Її я і використав для своїх цілей, але зараз мова не про той випадок.
Я розповім, навіщо мені знадобилася така бібліотека, як as3swf — я мав завдання реалізувати заміну одного тега наповністю новий аналог, з іншим вмістом, якщо говорити конкретніше - замінювався тег DefineBinaryData.
Отже, ось як виглядає код, що розпарює SWF файл:
Де swfByteArray це масив байт з цільовим SWF файлом. Куди простіше, так?
Після розпарювання SWF, мені необхідно було замінити певний контент, заембеденный у флешку за допомогою флексового тега
При використанні такого способу включення контенту в SWF, у результаті у флешці з'являється ряд особливих речей, які необхідно знати, щоб правильно замінити такий заембеденный контент.
По-перше, з'являється тег DefineBinaryData зі своїм ID символом. Також в результаті використання тега Embed з'являється as3 клас з назвою = НазваКласа_Назва Змінний та розширюючий клас mx.core.ByteArrayAsset. Якщо уявити, що ми використовували тег Embed у класі MySuperClass пакету ru.codestage, то повна назва буде ru.codestage.MySuperClass_EmbeddedDataClass. І нарешті, з'являється або доповнюється тег SymbolClass, який пов'язує символи з as3 класами за їх ID. У цей же тег додаються записи, коли ви прописуєте лінкейдж у символів бібліотеки Flash Pro.
Знаючи все це, нам не важко замінити заембеденный файл і нічого не зламати. Ось, як це можна зробити засобами as3swf:
Код досить прозорий і простий, не думаю, що у когось його розуміння може спричинити складнощі. Як бачите, as3swf — це потужний і гнучкий інструмент (адже я продемонстрував лише малу частину всього можливого функціоналу), користуйтеся ним на здоров'я!)
Нещодавно я з його допомогою реалізував для себе систему автоматичного сайт-лочингу приблизно за один день (більша частина якого пішла на GUI :D)