Небольшая библиотека Python 2, которая предоставляет:
Первоначальное намерение состояло в том, чтобы предоставить транспилеру от скомпилированного кода AS3 до LLVM IR.
Есть один или два на других языках, но большинство из них билотировано, или они были слишком неполными, чтобы анализировать мои целевые файлы.
Сериализация обратно в файлы SWF должна быть относительно простой для добавления.
pip install swiffas
Взгляните на example.py - он печатает список разборки для всего кода ActionScript, который он находит в теге DOABC.
В любом случае, вот краткое изложение:
import swiffas
from swiffas import swftags
# parse the SWF file
p = swiffas . SWFParser ()
with open ( 'example.swf' , 'rb' ) as f :
p . parse ( f )
print 'has' , p . properties . frame_count , 'frames'
print 'has' , len ( p . record_headers ), 'records; parsed' , len ( p . tags ), 'of them'
# get each exported AS3 program in the SWF file
as3_exports = filter ( lambda x : isinstance ( x , swftags . DoABC ), p . tags )
# print some information about them
for as3_export in as3_exports :
as3 = swiffas . ABCFile ( as3_export . bytecode )
print as3_export . name , 'has' , as3 . method_count , 'methods'
# print all the strings used in the program
print ' n ' . join ( map ( lambda sinfo : sinfo . value , as3 . constant_pool . strings )) Структура каждого проанализированного объекта SWF и AVM2 можно найти в swiffas/swftags.py и swiffas/avm2.py , соответственно. Каждый элемент списка _struct создается на объекте во время десериализации (если его размер не является, false или 0).
Каждый кортеж в _struct имеет форму (type, name, optional size or existence boolean) . Размер может быть целым числом или обратиться к значению предыдущего поля.
Специальный случай кортежа - это то, где его тип является bytes , является последним элементом в списке и None имеет размер. Это представляет собой поле, которое занимает оставшуюся часть объекта, и содержимое того, кто является теми байтами.
Там нет упакованного VM AS3 (пока), поэтому вы вручную итерацию над корпусом каждого метода и связываете все индексы.
См swiffas/swftags.py . Пропущенные теги перечислены внизу.
Текущее ограничение заключается в том, что вы не можете кодировать битовые поля внутри объекта выровненного байта. Битобъективные и непоколебимые классы просто должны быть объединены.
См swiffas/avm2ins.py .
Все из спецификации включены, как и несколько недокументированных инструкций (включая все Flascc).
В этой таблице есть несколько незарегистрированных, которые мы не поддерживаем, но утомляйтесь, что некоторые записи там ошибочны .
Тем не менее, лучше пересечь проверить с падением исходного кода Adobe их виртуальной машины ActionScript (недостаток, когда вы должны перемещаться по большему количеству CRUFT, чтобы получить то, что вы хотите).
Выпущено по лицензии MIT. Обратитесь к LICENSE для полного текста лицензии.