Eine kleine Python 2 -Bibliothek, die enthält:
Die ursprüngliche Absicht bestand darin, einen Transpiler vom kompilierten AS3 -Code an LLVM IR zu liefern.
Es gibt ein oder zwei in anderen Sprachen, aber die meisten haben bitgeschützt, oder sie waren zu unvollständig, um meine Zieldateien zu analysieren.
Das Serialisieren von SWF -Dateien sollte relativ einfach hinzugefügt sein.
pip install swiffas
Schauen Sie sich ein example.py an.
In jedem Fall finden Sie einen kurzen Überblick:
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 )) Die Struktur jedes analysierten SWF- und AVM2 -Objekts finden Sie in swiffas/swftags.py bzw. swiffas/avm2.py . Jedes Element der _struct -Liste wird während der Deserialisierung auf dem Objekt instanziiert (wenn seine Größe keine, false oder 0 ist).
Jedes Tupel in _struct ist aus dem Formular (type, name, optional size or existence boolean) . Die Größe kann eine Ganzzahl sein oder sich auf den Wert eines vorherigen Feldes beziehen.
Ein Sonderfall eines Tupels ist, wo sein Typ bytes ist, das letzte Element in der Liste ist und None Größe hat. Dies stellt ein Feld dar, das den Rest des Objekts aufnimmt und der Inhalt dieser Bytes ist.
Es gibt keine AS3 -VM (noch), sodass Sie den Körper jeder Methode manuell iterieren und alle Indizes verknüpfen.
Siehe swiffas/swftags.py . Fehlende Tags sind unten aufgeführt.
Die aktuelle Einschränkung ist nur, dass Sie in einem von Byte ausgerichteten Objekt keine Bitfields codieren können. Die BitObject- und ausgepackbaren Klassen müssen nur kombiniert werden.
Siehe swiffas/avm2ins.py .
Alle aus der Spezifikation sind enthalten, ebenso wie mehrere Anweisungen ohne Papiere (einschließlich aller FLASCC).
Es gibt ein paar undokumentierte undokumentierte Tisch, die wir nicht unterstützen, sondern müde, dass einige Einträge dort falsch sind .
Es ist jedoch besser, den Quellcode von Adobe von der virtuellen Maschine von ActionScript zu erkunden (da, dass Sie durch viele Kreuzungen navigieren müssen, um das zu erhalten, was Sie wollen).
Unter der MIT -Lizenz veröffentlicht. Weitere Informationen zum vollständigen Lizenztext finden Sie in LICENSE .