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

时间:2016-04-19 15:45:45

标签: actionscript-3 flash

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

enter image description here

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

注意:我的IDE是Flash Builder,我正在使用Adobe AIR应用程序。

2 个答案:

答案 0 :(得分:4)

只是为了扩展@Denis-Kokorin的回答并明确你的担忧......

  

我注意到其中许多包含加密的二进制组件:

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

  

我的问题是,你如何包含二进制组件(如上所述)   在您的应用程序中,如何使用ActionScript加载它   为了进一步处理它?<​​/ p>

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

在下面的代码中,我展示了加载不同格式内容的示例。从那里你可以像往常一样处理它(例如:bitmapdata用于编辑像素或sound.extract用于编辑音频样本等。我还展示了如果要编辑的字节值,如何将字节转换为ByteArray。阅读手册以了解 ByteArray 。此 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();
    }

}

}

答案 1 :(得分:2)

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