root/as3/ByteCodeDisassembler/ByteCodeDisassembler.as

リビジョン 412, 2.3 kB (コミッタ: yossy, コミット時期: 8 ヶ月 前)

Added ClassPrinter? to ByteCodeDisassembler?.

Line 
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 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。