Actionscript 3 获得swf';从swf中删除个字节

Actionscript 3 获得swf';从swf中删除个字节,actionscript-3,flash,Actionscript 3,Flash,我正在尝试在AS3中实现一些针对Flash(而不是AIR)的安全机制。我想得到我的代码运行的swf的实际二进制内容(作为字节数组)。 如果查看stage.loaderInfo.ByTestTotal,它正确地包含swf文件的长度;我希望stage.loaderInfo.bytes包含实际内容,但是这个ByteArray比swf本身大得多,所以 stage.loaderInfo.bytes实际上包含什么?(文档一点也不明确) 有没有办法得到我需要的swf字节?(除了通过URLLoader重新加载

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

  • stage.loaderInfo.bytes实际上包含什么?(文档一点也不明确)
  • 有没有办法得到我需要的swf字节?(除了通过URLLoader重新加载swf)

非常感谢

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

作为旁注,它给出了压缩长度,这就是为什么它显示了您期望的值


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

我们在Flash中的IO范围仍然有限;引用“Loader”或更具体地引用“root”的概念(您仍然可以使用它)——这只会假设您的二进制数据对象可以在页面级别访问SWF。您似乎更关注Flash如何解析字节数组的1-2

这是一个很长的话题,在我看来已经讨论过了,但是由于Flash使用AMF并从任何主机实例化自定义对象,因此有大量的类是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 
                  });
      }  
  } 
  }

很好的猜测,我刚刚发现swf通常是ZLIB'ed。我需要验证swf的内容没有被更改,并且必须从swf内部进行检查。但是知道字节是压缩的,我只需要在创建引用之前解压缩它们。如果您使用Flex进行编译,我知道编译器有一个压缩选项(请参阅)。我想无论你用什么方法来编译你的SWF,都会有类似的东西,不管怎样,可能对你有用谢谢你的例子。顺便说一句,在AS3的世界里,冗长就是成为一个更好的程序员。现在不再是256KB内存的时代了。