views:

108

answers:

1

Hey, I have been given an SWF to edit a link in the AS code. The fact is the SWF uses some XML that is generated (actually retrieved) by PHP code from a database.

menuXML.load("/sub/page/dynamic.php?genre=" + genre); 

so the point is we can use the same SWF 'mainfraim' and fill them with different animations/sources based on the link provided in dynamic.php?genre=###

Now, I've used Flash Decompiler Gold to extract all files in the SWF and can open it again in Adobe Flash to edit it. When done I enter CTRL+ENTER and there are immediately 4 compiler errors!! Errors: 1x < Unexpected 'if' encountered > 2x < Statement block must be terminated by '}' > 1x < Ecpected a field name after '.' operator. >

How can these errors be present, when the original SWF works perfectly??!

If I don't manage to solve this, I'll have to find out how to create an .php file the SWF tries to use which can select the proper resources (from a database I guess) to show them (using ?genre=###)

Thanks!

+2  A: 

I'm not sure I understand your problem, but it seems like you need to change the url passed to the load method. It also seems like your swf is Actionscript 2.0.

Decompilers sort of work, but the fla file you can generate with a decompiler will seldom be useful to generate the same swf back. Sometimes the code is illegal, and almost always the graphics are screwed.

I once had to make some simple code changes (like changing a few urls and other simple stuff) to a swf, for which we had no sources (they were lost and there was no backup...).

I used flasm for this and it worked fine (also it wasn't as hard as I first supposed).

Flasm is not a decompiler, but a disassembler. It takes your swf, parses the actionscript bytecode and generates a text file with assembly-like code. You can edit that code and re-assemble the swf. It doesn't touch graphics and animations, so it was what I needed, and perhaps could work for you.

I've made a little test and it worked fine.

I started with this code in a fla:

var xml:XML = new XML();
xml.ignoreWhite = true;
xml.onLoad = function(ok:Boolean):Void {
    if(ok) {
        _debug_txt.text = "ok";
        _debug_txt.text = xml;
    } else {
        _debug_txt.text = "error";
    }
};

xml.load("/sub/page/dynamic.php");

Next, I opened a cmd prompt (I'm on Windows), cd to the directory that contains the swf and run:

flasm -d test_flasm.swf > test_flasm.flm

This disassembles the swf into a text file test_flasm.flm. I have added flasm to my executables path, but you can just use the full path to the flasm.exe instead.

The relevant part of the .flm file looks like this:

setMember
push '/sub/page/dynamic.php', 1, 'xml'
getVariable
push 'load'
callMethod

Yours may vary, but if you look for the url, you'll find it. Next, changed that url to:

setMember
push 'test.xml', 1, 'xml'
getVariable
push 'load'
callMethod

Then, I reassembled the swf using:

flasm -a test_flasm.flm

And now, test_flasm.swf loads "test.xml" instead of "/sub/page/dynamic.php".

Hope this helps.

Juan Pablo Califano