Skip to main content

Yet Another SWF Parser.

You can pronounce whatever you like :)

How to use it

You can use swfparser.py as command line program or as a module.

If you execute directly the usage is:

swfparser.py [-h] [-t] [-e] filepath

positional arguments:
  filepath         the SWF file to parse

optional arguments:
  -h, --help       show this help message and exit
  -t, --show-tags  show the first level tags of the file
  -e, --extended   show all objects with full detail and nested

If you want to use it as a module, you can use the SWFParser class directly or the handy parsefile function:

>>> swf = swfparser.parsefile(<yourSWFfile>)
>>> swf.header
Header(name=Header, FileLength=4228, ...)
>>> len(swf.tags)
365
>>> swf.tags[0]
UnknownObject(name=SetBackgroundColor, raw_payload=b'\xff\xff\xff')
>>> swf.tags[3]
>>> obj = swf.tags[3]
>>> obj
PlaceObject2(name=PlaceObject2, CharacterId=1, ...)
>>> obj.CharacterId
1
>>> obj.Matrix.ScaleX
65536

This follows the SWF File Format Specification Version 19, but it is not (yet) 100% covered, so you may find some unknown objects.

How to deal with still-unknown-objects

Not all the spec is covered (this is a work in progress!).

When the parser finds a structure that still can’t process (because more programming is needed), will just return an UnknownObject object with the unparsed bytes, or will raise an exception if you set the unknown_alert flag:

SWFParser.unknown_alert = True

Add new structures to the parser is very simple. I’ll be very glad to do it if you offer a real stream of bytes as an example or even a sample SWF file with the still missing object inside.

Checking coverage

There is an easy way of checking how many of the objects (tags, actions, structures, etc) are properly covered by the parser: just use the coverage parameter:

$ python3 yaswfp/swfparser.py -c yaswfp/tests/samples/1252533834.swf
Header(Signature='CWS', ...)
Tags count: 55
Coverage is 97.3% of 74 total items
Most common parsed objects:
   22 PlaceObject2
   21 ShowFrame
   10 LineStyleArray
Most common Unknown objects
    2 DefineMorphShape2

Development

To run the tests:

./test

You’ll need python3-flake8 and python3-nose. Of course, this is Python 3.

To complete some methods or be able to parse new structures, we should add examples that show that new stuff, see current “sanity” tests. Yes, unit tests are desirable, feel free to add those too.

The project is hosted in GitHub:

https://github.com/facundobatista/yaswfp

Contact

Any doubt, any question, any suggestion, or whatever, feel free to open an issue in GitHub or find me in IRC, I’m facundobatista in Freenode.

Thanks!

Release files for yaswfp 0.9.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for yaswfp 0.9.3
File Size Uploaded
yaswfp-0.9.3.tar.gz 29.8 kB Details

Release files / yaswfp-0.9.3.tar.gz

Download URL yaswfp-0.9.3.tar.gz
Size 29.8 kB
Tags Source
SHA-256 checksum
How to use checksums
6171057367476bbb511ae1ff95f0963f86079dd2fcb0e9771c6d9763ed351c8d
BLAKE2b-256 checksum
How to use checksums
2880162a418d1ae03e79987126feb0c42b876f72d5c9d33df2bed8690c6fc12a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release history Release notifications | RSS feed

This release

0.9.3 This release

1 release file

0.9.2

1 release file

0.9.1

1 release file

0.9

1 release file

0.8

0.7

0.6

0.5

0.4

0.3

0.2

0.1

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page