Skip to content
ArachisH edited this page Feb 17, 2018 · 4 revisions

Initializing

The first step before being able to do any tinkering with the SWF file is initializing a new ShockwaveFlash object. There are a few other constructors you can use for initialization, but we'll go with a simple local file path for now.

string path = @"C:\Client.swf"
var flash = new ShockwaveFlash(path);

This will read the header of the SWF file, the header contains the following information about the file:

  • [3B] Compression(None, ZLIB, LZMA)
  • [1B] Version
  • [4B] File length(Inclusive of Header +8B)

The frame record is also read at this point, regardless of whether the file is compressed or not.

Disassembling

Once the file has been initialized, the Disassemble method must be called for viewing, and editing the tags contained in the SWF file. This method should only be called once, no need for re-reading all the tags again.

flash.Disassemble();

After disassembly has completed, you are now able to view/modify/add any tags you want to the Tags property. The Tags property is of type List<TagItem>, any and all supported tags inherit from this type.

We can simply view what type of tag they are by accessing the Kind property, allowing us to file through the list without having to attempt an explicit cast.

As an example, let's enumerate through the Tags property, and find all the DoABCTag's

flash.Disassemble();
foreach(TagItem tag in flash.Tags)
{
    if(tag.Kind == TagKind.DoABC)
    {
        var doABCTag = (DoABCTag)tag;
        // We can edit, or just simply view the tag contents here.
    }
}

Assembling

After you've done all the tinkering you wanted to do, you're ready to assemble all the tags back into a proper SWF file. This can be achieved by calling the Assemble method.

A new FlashWriter instance can be created by providing a Stream to one of the constructors available. When creating the instance with a stream, you can also specify whether you want to keep the stream open with one of the provided constructors.

flash.Disassemble();
foreach(TagItem tag in flash.Tags)
{
    if(tag.Kind == TagKind.DoABC)
    {
        var doABCTag = (DoABCTag)tag;
        // We can edit, or just simply view the tag contents here.
    }
}

string asmPath = @"C:\asm_Client.swf"
using(Stream fileStream = File.Open(asmPath, FileMode.Create))
using(var output = new FlashWriter(fileStream))
{
    flash.Assemble(output);
    // OR
    // flash.Assemble(output, CompressionKind.None);
}
Clone this wiki locally