1

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

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

非常感谢!

4

2 回答 2

2

我的猜测是stage.loaderInfo.bytes包含未压缩的 SWF 数据。在大多数 SWF 中,前几个字节左右包含一些未压缩的二进制数据,而 SWF 的其余部分被压缩。您可以参考规范以获取更多信息。我希望bytes它将包含这个未压缩的标头数据,然后是其余的 SWF 数据,现在已解压缩。

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

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

于 2013-07-16T06:35:47.423 回答
0

Flash 中的 IO 范围仍然有限;对“加载器”的引用或更具体到“根”的概念(您仍然可以使用) - 这只是假设您的二进制数据对象可以在页面级别访问 SWF。您似乎正在寻找更多关于 Flash 如何解析字节数组的 1-2。

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

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

     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 
                  });
      }  
  } 
  }
于 2013-07-16T10:23:32.287 回答