将二进制数据嵌入到 Flash 应用程序中

Embedding binary data into Flash applications

在反编译混淆的 Adob​​e flash 应用程序时,我注意到其中许多包含加密的二进制组件:

我的问题是,如何在应用程序中包含二进制组件(如上所述)以及如何使用 ActionScript 加载它以便进一步处理它?

注意:我的 IDE 是 Fl​​ash Builder,我正在使用 Adob​​e AIR 应用程序。

您可以准备一些二进制数据并在运行时通过 [Embed] 元标记加载它。

只是为了扩展@Denis-Kokorin 的回答并消除您的顾虑...

I noticed that many of them contain an encrypted binary component:

请注意 "DefineBinaryData" 是 SWF 格式的标准段(称为标签),而不是反编译器技巧。要让它存在,您只需通过 AS3 代码 [embed] 一个文件。这成为标签中定义的二进制数据。

My question is, how do you include a binary component (as described above) in your application and how do you load it using ActionScript in order to further process it?

加载取决于您嵌入的文件格式。使用 Bitmap 用于图像(jpg、png 等)和 movieClip 用于 SWF,使用 Sound 将 MP3 数据解码为可播放 (PCM) 声音。 Netstream 的 AppendBytes 将解码视频字节。如果你想要任何东西 "encrypted" 然后在你嵌入它之前这样做。您必须决定使用哪种加密方法或发明您自己的方法,当然您的 AS3 应用程序在尝试处理之前必须具有 "decryption" 代码。

在下面的代码中,我展示了一个加载不同格式内容的示例。从那里您可以像往常一样处理它(例如:bitmapdata 用于编辑像素或 sound.extract 用于编辑音频样本等)。我还展示了如何将字节放入 ByteArray 以防万一它是您要编辑的字节值。阅读处理手册 ByteArray. This guide 也可能对您有所帮助。

package  
{

import flash.display.MovieClip;
import flash.utils.*;
import flash.display.*;
import flash.events.*;
import flash.media.*;

public class embed_test extends MovieClip 
{

[Embed(source="image.jpg")] private var emb_Image : Class;
[Embed(source="track.mp3")] private var emb_MP3 : Class;
[Embed(source="vctest.swf")] private var emb_SWF : Class;

//# for access to bytes (binary data)
[Embed(source="image.jpg", mimeType="application/octet-stream")] private var emb_Bytes : Class;

    public function embed_test() 
    {
        var my_Pic : Bitmap = new emb_Image();
        addChild(my_Pic); //# display image on stage

        var my_Snd : Sound = new emb_MP3();
        my_Snd.play(); //# play sound

        var my_Swf : MovieClip = new emb_SWF();
        addChild(my_Swf); //# display SWF on stage

        var my_BA : ByteArray = new emb_Bytes as ByteArray;
        trace("bytes length : " + my_BA.length); //# check bytes total is correct
        trace("bytes (HEX) : " + bytes_toHex(my_BA) ); //# check bytes in hex format

    }

    private function bytes_toHex (input : ByteArray) : String
    {
        var strOut : String = ""; var strRead:String = "";
        var input_Size : uint = input.length; 
        input.position = 0;

        for (var i:int = 0; i < input_Size; i++)
        {
            strRead = input.readUnsignedByte().toString(16); 

            if(strRead.length < 2) { strRead = "0" + strRead; } //# do padding
            strOut += strRead ;     
        }

        return strOut.toUpperCase();
    }

}

}