Une petite bibliothèque Python 2 qui fournit:
L'intention d'origine était de fournir un transpiler du code AS3 compilé à LLVM IR.
Il y en a un ou deux dans d'autres langues, mais la plupart ont bitrotté, ou ils étaient trop incomplets pour analyser mes fichiers cibles.
Sérialiser les fichiers SWF devrait être relativement simple à ajouter.
pip install swiffas
Jetez un œil à example.py - il imprime une liste de démontage pour tout le code ActionScript qu'il trouve dans une balise DOABC.
En tout cas, voici un aperçu rapide:
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 )) La structure de chaque objet SWF et AVM2 analysé se trouve dans swiffas/swftags.py et swiffas/avm2.py , respectivement. Chaque élément de la liste _struct est instancié sur l'objet pendant la désérialialisation (si sa taille n'est pas non pas, fausse ou 0).
Chaque tuple en _struct est du formulaire (type, name, optional size or existence boolean) . La taille peut être un entier ou se référer à la valeur d'un champ précédent.
Un cas spécial de tuple est l'endroit où son type est bytes , est le dernier élément de la liste et None de taille. Cela représente un champ qui prend le reste de l'objet, et qui est le contenu de ces octets.
Il n'y a pas de VM AS3 emballé (encore), donc vous irez manuellement sur le corps de chaque méthode et liez tous les index.
Voir swiffas/swftags.py . Les balises manquantes sont répertoriées en bas.
La limitation actuelle est simplement que vous ne pouvez pas coder un bit champs à l'intérieur d'un objet aligné par octet. Le bitObject et les classes déballables doivent juste être combinés.
Voir swiffas/avm2ins.py .
Tous ceux de la spécification sont inclus, tout comme plusieurs instructions sans papiers (y compris toutes les FLASCC).
Il y en a quelques sans-papiers dans ce tableau que nous ne soutenons pas, mais soyez las que certaines entrées sur là sont mal.
Cependant, il est préférable de vérifier avec la baisse du code source d'Adobe de leur machine virtuelle ActionScript (à la baisse étant, vous devez naviguer dans beaucoup de Cruft pour obtenir ce que vous voulez).
Libéré sous la licence du MIT. Reportez-vous à LICENSE pour le texte complet de licence.