Uma pequena biblioteca Python 2 que fornece:
A intenção original era fornecer um transpiler do código AS3 compilado para o LLVM IR.
Há um ou dois em outros idiomas, mas a maioria tem bitradas, ou elas estavam incompletas demais para analisar meus arquivos de destino.
A serialidade de volta aos arquivos SWF deve ser relativamente direta para adicionar.
pip install swiffas
Dê uma olhada no example.py - ele imprime uma listagem de desmontagem para todo o código do ActionScript que encontra em uma tag doabc.
De qualquer forma, aqui está um rápido resumo:
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 )) A estrutura de cada objeto SWF e AVM2 analisado pode ser encontrado em swiffas/swftags.py e swiffas/avm2.py , respectivamente. Cada elemento da lista _struct é instanciado no objeto durante a deseralização (se seu tamanho não for nenhum, falso ou 0).
Cada tupla em _struct é do formulário (type, name, optional size or existence boolean) . O tamanho pode ser um número inteiro ou se referir ao valor de um campo anterior.
Um caso especial de uma tupla é onde seu tipo é bytes , é o último elemento da lista e tem tamanho None . Isso representa um campo que ocupa o restante do objeto, e quem é o conteúdo são esses bytes.
Ainda não há embalado a AS3 VM, então você irá itera manualmente sobre o corpo de cada método e vinculará todos os índices.
Veja swiffas/swftags.py . As tags ausentes estão listadas na parte inferior.
A limitação atual é apenas que você não pode codificar um bitfields dentro de um objeto alinhado de byte. As classes BitObject e Unpatable só precisam ser combinadas.
Veja swiffas/avm2ins.py .
Todos os que da especificação estão incluídos, assim como várias instruções sem documentos (incluindo todas as flascc).
Existem alguns sem documentos nesta tabela que não apoiamos, mas estamos cansados que algumas entradas estão erradas.
No entanto, é melhor cruzar a verificação com a queda do código -fonte da Adobe de sua máquina virtual ActionScript (sendo a desvantagem que você precisa navegar por muito Cruft para obter o que deseja).
Liberado sob a licença do MIT. Consulte a LICENSE para obter o texto completo da licença.