package { import flash.display.Sprite; import flash.errors.EOFError; import flash.events.Event; import flash.events.IOErrorEvent; import flash.net.URLRequest; import flash.net.URLStream; import flash.utils.ByteArray; import org.libspark.disassemble.SwfStream; import org.libspark.disassemble.abc.ClassPrinter; public class ByteCodeDisassembler extends Sprite { private var stream:URLStream; public function ByteCodeDisassembler() { var filename:String = /** 'C:\\DataFiles\\Work\\asunitswc\\library.swf' /** 'C:\\DataFiles\\Spike\\flex\\ByteCodeDisassembler\\bin\\ByteCodeDisassembler.swf' /** 'C:\\DataFiles\\Projects\\Spark\\asunit\\as3\\dev\\bin\\asunit_dev.swf' /** 'C:\\DataFiles\\Spike\\flex\\ByteCode\\bin\\ByteCode-debug.swf' /**/ '/Users/yossy/DataFiles/Work/Astro/playerglobal/library.swf' /**/ ; var req:URLRequest = new URLRequest(filename); stream = new URLStream(); stream.addEventListener(Event.COMPLETE, onComplete); stream.addEventListener(IOErrorEvent.IO_ERROR, onIOError); stream.load(req); } private function onComplete(event:Event):void { var bytes:ByteArray = new ByteArray(); stream.readBytes(bytes); stream.close(); var swf:SwfStream = new SwfStream(bytes); swf.seekToBody(); try { for (;;) { var byte:uint = swf.readShort(); var tag:uint = byte >>> 6; var length:uint = byte & 0x3f; if (length == 0x3f) { length = swf.readInt(); } switch (tag) { case 82: { var tagStart:uint = swf.position; var frame:uint = swf.readUnsignedInt(); for (; swf.readByte() != 0x00; ) { } // trace('frame(' + frame + ')'); var abcBytes:ByteArray = new ByteArray(); swf.readBytes(abcBytes, 0, length - (swf.position - tagStart)); // new AbcParser(abcBytes).parse(); new ClassPrinter(abcBytes).parse(); } break; default: { swf.seek(length); } break; } } } catch (e:VerifyError) { trace(e.getStackTrace()); } catch (e:EOFError) { trace(e); } } private function onIOError(error:IOErrorEvent):void { trace(error.text); } } }