| 1 |
package |
|---|
| 2 |
{ |
|---|
| 3 |
import flash.display.Sprite; |
|---|
| 4 |
import flash.errors.EOFError; |
|---|
| 5 |
import flash.events.Event; |
|---|
| 6 |
import flash.events.IOErrorEvent; |
|---|
| 7 |
import flash.net.URLRequest; |
|---|
| 8 |
import flash.net.URLStream; |
|---|
| 9 |
import flash.utils.ByteArray; |
|---|
| 10 |
|
|---|
| 11 |
import org.libspark.disassemble.SwfStream; |
|---|
| 12 |
import org.libspark.disassemble.abc.ClassPrinter; |
|---|
| 13 |
|
|---|
| 14 |
public class ByteCodeDisassembler extends Sprite |
|---|
| 15 |
{ |
|---|
| 16 |
private var stream:URLStream; |
|---|
| 17 |
|
|---|
| 18 |
public function ByteCodeDisassembler() |
|---|
| 19 |
{ |
|---|
| 20 |
var filename:String = |
|---|
| 21 |
/** |
|---|
| 22 |
'C:\\DataFiles\\Work\\asunitswc\\library.swf' |
|---|
| 23 |
/** |
|---|
| 24 |
'C:\\DataFiles\\Spike\\flex\\ByteCodeDisassembler\\bin\\ByteCodeDisassembler.swf' |
|---|
| 25 |
/** |
|---|
| 26 |
'C:\\DataFiles\\Projects\\Spark\\asunit\\as3\\dev\\bin\\asunit_dev.swf' |
|---|
| 27 |
/** |
|---|
| 28 |
'C:\\DataFiles\\Spike\\flex\\ByteCode\\bin\\ByteCode-debug.swf' |
|---|
| 29 |
/**/ |
|---|
| 30 |
'/Users/yossy/DataFiles/Work/Astro/playerglobal/library.swf' |
|---|
| 31 |
/**/ |
|---|
| 32 |
; |
|---|
| 33 |
var req:URLRequest = new URLRequest(filename); |
|---|
| 34 |
|
|---|
| 35 |
stream = new URLStream(); |
|---|
| 36 |
stream.addEventListener(Event.COMPLETE, onComplete); |
|---|
| 37 |
stream.addEventListener(IOErrorEvent.IO_ERROR, onIOError); |
|---|
| 38 |
stream.load(req); |
|---|
| 39 |
} |
|---|
| 40 |
|
|---|
| 41 |
private function onComplete(event:Event):void |
|---|
| 42 |
{ |
|---|
| 43 |
var bytes:ByteArray = new ByteArray(); |
|---|
| 44 |
stream.readBytes(bytes); |
|---|
| 45 |
stream.close(); |
|---|
| 46 |
|
|---|
| 47 |
var swf:SwfStream = new SwfStream(bytes); |
|---|
| 48 |
swf.seekToBody(); |
|---|
| 49 |
try { |
|---|
| 50 |
for (;;) { |
|---|
| 51 |
var byte:uint = swf.readShort(); |
|---|
| 52 |
var tag:uint = byte >>> 6; |
|---|
| 53 |
var length:uint = byte & 0x3f; |
|---|
| 54 |
if (length == 0x3f) { |
|---|
| 55 |
length = swf.readInt(); |
|---|
| 56 |
} |
|---|
| 57 |
switch (tag) { |
|---|
| 58 |
case 82: { |
|---|
| 59 |
var tagStart:uint = swf.position; |
|---|
| 60 |
var frame:uint = swf.readUnsignedInt(); |
|---|
| 61 |
for (; swf.readByte() != 0x00; ) { |
|---|
| 62 |
} |
|---|
| 63 |
// trace('frame(' + frame + ')'); |
|---|
| 64 |
var abcBytes:ByteArray = new ByteArray(); |
|---|
| 65 |
swf.readBytes(abcBytes, 0, length - (swf.position - tagStart)); |
|---|
| 66 |
// new AbcParser(abcBytes).parse(); |
|---|
| 67 |
new ClassPrinter(abcBytes).parse(); |
|---|
| 68 |
} |
|---|
| 69 |
break; |
|---|
| 70 |
|
|---|
| 71 |
default: { |
|---|
| 72 |
swf.seek(length); |
|---|
| 73 |
} |
|---|
| 74 |
break; |
|---|
| 75 |
} |
|---|
| 76 |
} |
|---|
| 77 |
} |
|---|
| 78 |
catch (e:VerifyError) { |
|---|
| 79 |
trace(e.getStackTrace()); |
|---|
| 80 |
} |
|---|
| 81 |
catch (e:EOFError) { |
|---|
| 82 |
trace(e); |
|---|
| 83 |
} |
|---|
| 84 |
} |
|---|
| 85 |
|
|---|
| 86 |
private function onIOError(error:IOErrorEvent):void |
|---|
| 87 |
{ |
|---|
| 88 |
trace(error.text); |
|---|
| 89 |
} |
|---|
| 90 |
} |
|---|
| 91 |
} |
|---|