Swiffas
SWF parser and AVM2 (Actionscript 3) bytecode parser
Install / Use
/learn @ahixon/SwiffasREADME
swiffas
A small Python 2 library that provides:
- a SWF parser (enough tags to get the Actionscript stuff out, but a few others too)
- a complete AVM2 parser (Actionscript 3 bytecode)
Original intention was to provide a transpiler from compiled AS3 code to LLVM IR.
There are one or two in other languages, but most have bitrotted, or they were too incomplete to parse my target files.
Serialising back to SWF files should be relatively straightforward to add.
Installation
pip install swiffas
Usage
Take a look at example.py -- it prints a disassembly listing for all the Actionscript code it finds in a DoABC tag.
In any case, here's a quick rundown:
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))
Parsed object structure
The structure of each parsed SWF and AVM2 object can be found in swiffas/swftags.py and swiffas/avm2.py, respectively. Each element of the _struct list is instantiated on the object during deserialisation (if its size is not None, False or 0).
Each tuple in _struct is of the form (type, name, optional size or existence boolean). The size may be an integer, or refer to a previous field's value.
A special case of a tuple is where its type is bytes, is the last element in the list and has size None. This represents a field that takes up the remainder of the object, and who's contents are those bytes.
Doing stuff with AS3
There's no AS3 VM packaged (yet), so you'll manually iterate over each method's body, and link all the indexes up.
Adding new SWF tags
See swiffas/swftags.py. Missing tags are listed at the bottom.
The current limitation is just that you can't encode a bitfields inside a byte aligned object. The BitObject and Unpackable classes just need to be combined.
Adding new AVM2 instructions
See swiffas/avm2ins.py.
All the ones from the specification are included, as are several undocumented instructions (including all the FlasCC ones).
There are a few undocumented ones in this table that we don't support, but be weary that some entries on there are wrong.
However, it's better to cross check with Adobe's source code drop of their Actionscript virtual machine (downside being you have to navigate through lots of cruft to get what you want).
License
Released under the MIT license. Refer to LICENSE for complete license text.
Related Skills
node-connect
343.3kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
claude-opus-4-5-migration
92.1kMigrate prompts and code from Claude Sonnet 4.0, Sonnet 4.5, or Opus 4.1 to Opus 4.5
frontend-design
92.1kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
model-usage
343.3kUse CodexBar CLI local cost usage to summarize per-model usage for Codex or Claude, including the current (most recent) model or a full model breakdown. Trigger when asked for model-level usage/cost data from codexbar, or when you need a scriptable per-model summary from codexbar cost JSON.
