Actionscript 3 获得swf';从swf中删除个字节
我正在尝试在AS3中实现一些针对Flash(而不是AIR)的安全机制。我想得到我的代码运行的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重新加载
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内存的时代了。