다음을 제공하는 작은 Python 2 라이브러리.
원래 의도는 컴파일 된 AS3 코드에서 LLVM IR로 트랜스 필러를 제공하는 것이 었습니다.
다른 언어에는 한두 가지가 있지만 대부분 비트 롯트를 사용했거나 너무 불완전했거나 대상 파일을 구문 분석하기에는 너무 불완전했습니다.
SWF 파일로의 직렬화는 비교적 간단해야합니다.
pip install swiffas
example.py 를보십시오 - 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 목록의 각 요소는 사막화 중 객체에 인스턴스화됩니다 (크기가 없으면, 거짓 또는 0).
_struct 의 각 튜플은 형식 (type, name, optional size or existence boolean) 입니다. 크기는 정수 일 수 있거나 이전 필드의 값을 참조하십시오.
튜플의 특별한 경우는 유형이 bytes 인 곳이며 목록의 마지막 요소이며 크기가 None . 이것은 객체의 나머지 부분을 차지하는 필드를 나타내며 내용은 바이트입니다.
AS3 VM은 아직 패키지가 없으므로 (아직) 각 방법의 본문에 수동으로 반복하고 모든 인덱스를 연결합니다.
swiffas/swftags.py 참조하십시오. 누락 된 태그는 하단에 나열되어 있습니다.
현재 제한은 바이트 정렬 된 객체 내부에서 비트 필드를 인코딩 할 수 없다는 것입니다. Bitobject 및 포장되지 않은 클래스는 결합되어야합니다.
swiffas/avm2ins.py 참조하십시오.
문서화되지 않은 몇 가지 지침 (모든 FLASCC 포함)과 마찬가지로 사양의 모든 것이 포함됩니다.
이 테이블에는 우리가 지원하지 않는 문서화되지 않은 것들이 몇 개 있지만, 거기에있는 일부 항목이 잘못 되었다는 것을 지치게하십시오.
그러나 Actionscript Virtual Machine의 Adobe의 소스 코드 드롭과 교차 점검하는 것이 좋습니다 (단점은 원하는 것을 얻으려면 많은 cruft를 탐색해야합니다).
MIT 라이센스에 따라 릴리스. 완전한 라이센스 텍스트는 LICENSE 를 참조하십시오.