从swf中获取swf的字节

时间:2013-07-16 05:56:15

标签: actionscript-3 flash

我正在尝试在针对Flash(而不是AIR)的AS3中实现一些安全机制。我想获得我的代码运行的swf的实际二进制内容(作为ByteArray)。 如果我查看stage.loaderInfo.bytesTotal,它正确包含swf文件的长度;我期望stage.loaderInfo.bytes包含实际内容,但是这个ByteArray比swf本身要大得多,所以

  • stage.loaderInfo.bytes实际包含什么? (该文件根本不明确)
  • 有没有办法按照我的需要获取swf的字节? (除了通过URLLoader重新加载swf)

非常感谢!

2 个答案:

答案 0 :(得分:2)

我的猜测是stage.loaderInfo.bytes包含未压缩的SWF数据。在大多数SWF中,前几个字节左右包含一些未压缩的二进制数据,其余的SWF被压缩。有关详细信息,请参阅spec。我希望bytes包含这个未压缩的头数据,然后是其余的SWF数据,现在解压缩。

作为旁注,bytesTotal为您提供压缩长度,这就是为什么它会显示您期望的值。

重建压缩SWF的一种可能方法是使用适当的算法从bytes压缩部分数据,该算法实际上由SWF的第一个字节指示。您需要什么实际数据?

答案 1 :(得分:0)

我们在Flash中的IO范围仍然有限;引用“Loader”或更具体的“root”概念(您仍然可以使用) - 这只是假设您的二进制数据对象可以在页面级别接受SWF。你好像在寻找关于Flash如何解析Byte Arrays的1-2。

这是一个很长的话题,并且[在我看来]已被过度讨论,但由于Flash使用AMF并从任何主机实例化海关对象,因此有大量可用的类是Native AS 3.0(没有AIR或需要Flex) - 可用于读取,写入和编码二进制文件。

以下是我不久前为Jr开发人员编写的一个示例类,他需要快速了解序列化在AS 3.0中的工作原理 - 我希望它有所帮助:

     package {
         import flash.display.*; 
         import flash.net.*; 
         import flash.events.*;
         import flash.utils.*;

         public class loadAndRead extends EventDispatcher {
              private var ldr:Loader;
              private var urq:URLRequest;
              private var iba:ByteArray; 
              private var swf:String;
              private var obj:*;
        function loadAndRead() {
              ldr = new Loader();
              urq = new URLRequest(swf = 'anyswfanywhere.swf');
        }
        public function rd(d:*):void { 
              obj = d;
              iba = obj['BTS'] as ByteArray() || ByteArray(obj['BTS']); 
              iba.uncompress()
              iba.deflate();
              iba.readUTFBytes();
              iba.position       = 0;
              iba.uncompress(); 
              iba.position       = 0;
              for each (var n:* in i.readObject())
                        {
                         if(n){trace(i.readObject()['n']+": "+n)
                        }
               }  
        } 
        private function getSWF():void {
            ldr.load(urq); 
            ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, ogs); 
        }
        private function ogs(w:Event):void { 
        rd({L: ldr.contentLoaderInfo.bytes.length,
            A: ldr.contentLoaderInfo.bytes.bytesAvailable,
            T: ldr.contentLoaderInfo.contentType,
                    U: ldr.contentLoaderInfo.loaderURL, 
                   BA: ldr.contentLoaderInfo.bytes.readUTF(), 
                  BTS: ldr.contentLoaderInfo.bytes 
                  });
      }  
  } 
  }