۴ نظر// ارسال شده در فلش توسط امین دیاری در ۱۱٫۲۸٫۸۸.
برای کسانی که ایجاد کننده محتوای فلش هستند decompiler ها نگرانی ای جدی به شمار میروند.
فرض کنید وقت بسیاری را صرف ساخت یک بازی یا اینترو یا بنر فلش کرده اید و یک نفر به راحتی با decompile کردن محصول شما و تغییرات جزئی بدون اطلاع شما، اثر شما را میفروشد!
در این پست خواهید آموخت چگونه فایل های فلش خود را از دزدیده شدن محافظت کنید.
ابزار مورد نیاز:
یک فایل SWF: فایلی که قصد دارید روش های محافظت را روی آن اعمال کنید.
Flex SDK: که برای embed کردن از تگ Embed آن استفاده خواهد شد. میتوانید از اینجا دریافت کنید.
یک hex editor: میتوانید از هر نرم افزاری که این کار را انجام دهد و یا از این نمونه استفاده کنید.
یک decompiler: برای تست و مشاهده نتیجه protection اعمال شده. میتوانید از Sothink SWF Decompiler استفاده کنید.
یک پروژه جدید Actionscript 3 ایجاد کنید و تنظیم کنید که با Flex SDK کامپایل خواهد شد.(در این آموزش از FlashDeveloper برای نوشتن کدها استفاده شده)
SWFی که قرار است محافظت شود را انتخاب کنید و به صورت دیتای باینری با استفاده از تگ Embed آن را Embed کنید:
[Embed (source = "VerletCloth.swf", mimeType = "application/octet-stream")]
// source = فایلی که قرار است محافظت شود
private var content:Class;
حالا فایل swf به صورت ByteArray در swf لود کننده لود شده و میتواند به صورت زیر لود شود.
var loader:Loader = new Loader();
addChild(loader);
loader.loadBytes(new content(), new LoaderContext(false, new ApplicationDomain()));
نهایتاً این کد را خواهیم داشت:
package
{
import flash.display.Loader;
import flash.display.Sprite;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
[SWF (width = 640, height = 423)] //ابعاد باید برابر با ابعاد فایلی باشند که قرار است لود شود
public class Main extends Sprite
{
[Embed (source = "VerletCloth.swf", mimeType = "application/octet-stream")]
// source = فایلی که قرار است محافظت شود
private var content:Class;
public function Main():void
{
var loader:Loader = new Loader();
addChild(loader);
loader.loadBytes(new content(), new LoaderContext(false, new ApplicationDomain()));
}
}
}
این کار دقیقاً مشابه این است که با دستوری LoadMovie در یک swf فایل اصلی که میخواهید نمایش داده شود را صدا بزنید، این روش افراد مبتدی که قصد دزدیدن کار شما را دارند را متوقف میکند.
حالا اگر آن را decompile کنید همانطور که میبینید فقط کد مربوط به لود کردن فایل محافظت شده decompile شده، ولی این روش در مقابل بسیاری از افرادی که اطلاعاتی بیش از یک فرد مبتدی دارند کارساز نیست، چون به راحتی فایل اصلی را به دست خواهند آورد.
برای کد کردن فایل SWF میتوانید از هر روشی که اطلاعات را با یک کلید کدگذاری میکند استفاده کنید، برای این کار کدهای آماده ای وجود دارد که یکی از آنها as3cryptro هست که از اینجا قابل دریافت است.
برای استفاده از این پروژه قطعه کد زیر را بنویسید، این کد ابتدا as3crypto را لود میکند و سپس ۱۶ بایت(۱۲۶ بیت) اطلاعات را در هر بار دریافت کدگذاری میکند، بنابراین در حلقه ای قرار گرفته تا تمام فایل را کد کند.
import com.hurlant.crypto.symmetric.AESKey;
var aes:AESKey = new AESKey(binKey);
var bytesToEncrypt:int = (data.length & ~15); //make sure that it can be devided by 16, zero the last 4 bytes
for (var i:int = 0; i < bytesToEncrypt; i += 16)
aes.encrypt(data, i);
کاری که این کلاس انجام میدهد در حقیقت تبدیل فایل به اطلاعات باینری بی ارزش است!
برای راحتی کار میتوانید کد زیر را کامپایل کنید و از آن برای کد کردن فایل ها استفاده کنید:
package
{
import com.hurlant.crypto.symmetric.AESKey;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.FileReference;
import flash.utils.ByteArray;
public class Encryptor extends Sprite
{
private var key:String = "amindiary.com";
private var ref:FileReference;
public function Encryptor()
{
ref = new FileReference();
ref.addEventListener(Event.SELECT, load);
ref.browse();
}
private function load(e:Event):void
{
ref.addEventListener(Event.COMPLETE, encrypt);
ref.load();
}
private function encrypt(e:Event):void
{
var data:ByteArray = ref.data;
var binKey:ByteArray = new ByteArray();
binKey.writeUTF(key); //AESKey requires binary key
var aes:AESKey = new AESKey(binKey);
var bytesToEncrypt:int = (data.length & ~15); //make sure that it can be divided by 16, zero the last 4 bytes
for (var i:int = 0; i < bytesToEncrypt; i += 16)
aes.encrypt(data, i);
new FileReference().save(data);
}
}
}
اگر متغیرهایی که در کد خود استفاده کرده اید را به روشی به نامهایی تبدیل کنید که بعد از decompile شدن قابل قبول نباشند (مانند ;;;; یا $#@ ) میتوانید امیدوار باشید که decompiler قادر نخواهد بود کد شما را باز کند.
برای این کار از hex editor استفاده کنید و متغیرها یا نام متدهایی را که فکر میکنید بدون آنها کد شما کارایی نخواهد داشت تغییر نام دهید، مثلاً تابع main را به ;;;; تغییر دهید، نتیجه چیزی شبیه تصاویر زیر خواهد بود:
نتیجه بعد از decompile شدن به صورت زیر است:
همانطور که گفتیم چون کاراکتر هایی ;;;; برای نام یک تابع در فلش پذیرفته نیست بنابراین فایل decompile شده کار نخواهد کرد!

مطلب خیلی خوب و جامع و کاملی نوشتی. فقط حیف که من چیزی سرم نمیشه :دی
من در تو نوری رو میبینم که نشون میده به زودی مرد بزرگی میشی :دی
این کامنت صرفا به خاطر روحیه دادن به نویسنده بود.
سلام دوست من
مطلب جالبی بود خوشم ادمد
فقط میشه بگی برا اینجور فایل ها راهی برای دیکد کردنشون نیست؟
قربونت، خب اگر هم راهی پیدا کنم برای دیکد کردن فایلایی که به راحتی کد نمیشن نباید تو پابلیک گفت!
سلام.حداقل یکم بیشتر توضیح میدادین