提供する小さなPython 2ライブラリ:
当初の意図は、コンパイルされたAS3コードからLLVM IRにトランスピラーを提供することでした。
他の言語には1つか2つありますが、ほとんどはビタロットされているか、ターゲットファイルを解析するには不完全すぎました。
SWFファイルへのシリアル化は、追加するのが比較的簡単です。
pip install swiffas
example.pyをご覧ください - DOABCタグで見つけたすべてのActionScriptコードの分解リストを印刷します。
いずれにせよ、ここにクイックランダウンがあります:
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リストの各要素は、脱出中にオブジェクトにインスタンス化されます(そのサイズが存在しない場合、偽または0)。
_structの各タプルは、形式(type, name, optional size or existence boolean)です。サイズは整数であるか、以前のフィールドの値を参照する場合があります。
タプルの特別なケースは、そのタイプがbytesであり、リストの最後の要素であり、サイズはNone 。これは、オブジェクトの残りの部分を占めるフィールドを表し、誰の内容がそれらのバイトです。
AS3 VMパッケージは(まだ)ないので、各メソッドの本文を手動で反復し、すべてのインデックスをリンクします。
swiffas/swftags.pyを参照してください。欠落したタグは下部にリストされています。
現在の制限は、バイトアライメントされたオブジェクト内のビットフィールドをエンコードできないことです。 BitObjectと未払いのクラスを組み合わせる必要があります。
swiffas/avm2ins.pyを参照してください。
いくつかの文書化されていない指示(すべてのFLASCCを含む)と同様に、仕様からのすべてが含まれています。
このテーブルには、私たちがサポートしていない文書化されていないものがいくつかありますが、そこにあるいくつかのエントリが間違っていることに疲れています。
ただし、AdobeのSource Code drop of ActionScript Virtual Machineとクロスチェックすることをお勧めします(欠点は、必要なものを手に入れるには、たくさんのCruftをナビゲートする必要があります)。
MITライセンスの下でリリースされました。完全なライセンステキストについては、 LICENSEを参照してください。