在反编译混淆的Adobe Flash应用程序时,我注意到其中许多都包含加密的二进制组件:
我的问题是,如何在应用程序中包含二进制组件(如上所述),以及如何使用ActionScript加载它以进一步处理它?
注意:我的IDE是Flash Builder,我正在使用Adobe AIR应用程序。
答案 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]
元标记在运行时加载它。