محافظت از فایل های SWF در مقابل decompile شدن


۴ نظر// ارسال شده در فلش توسط امین دیاری در ۱۱٫۲۸٫۸۸.

Flash Protection

برای کسانی که ایجاد کننده محتوای فلش هستند decompiler ها نگرانی ای جدی به شمار می‏روند.

فرض کنید وقت بسیاری را صرف ساخت یک بازی یا اینترو یا بنر فلش کرده اید و یک نفر به راحتی با decompile کردن محصول شما و تغییرات جزئی بدون اطلاع شما، اثر شما را می‏فروشد!

در این پست خواهید آموخت چگونه فایل های فلش خود را از دزدیده شدن محافظت کنید.

ابزار مورد نیاز:

یک فایل SWF: فایلی که قصد دارید روش های محافظت را روی آن اعمال کنید.

Flex SDK: که برای embed کردن از تگ Embed آن استفاده خواهد شد. میتوانید از اینجا دریافت کنید.

یک hex editor: می‏توانید از هر نرم افزاری که این کار را انجام دهد  و یا از این نمونه استفاده کنید.

یک decompiler: برای تست و مشاهده نتیجه protection اعمال شده. می‏توانید از Sothink SWF Decompiler استفاده کنید.

روش load کردن فایل SWF هنگام اجرا

یک پروژه جدید 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 شده، ولی این روش در مقابل بسیاری از افرادی که اطلاعاتی بیش از یک فرد مبتدی دارند کارساز نیست، چون به راحتی فایل اصلی را به دست خواهند آورد.



روش Encrypt کردن

برای کد کردن فایل 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 را به ;;;; تغییر دهید، نتیجه چیزی شبیه تصاویر زیر خواهد بود:

تغییر نام متد main

نتیجه بعد از decompile شدن به صورت زیر است:

نتیجه تغییر نام متد main بعد از decompile

همانطور که گفتیم چون کاراکتر هایی ;;;; برای نام یک تابع در فلش پذیرفته نیست بنابراین فایل decompile شده کار نخواهد کرد!


شما میتوانید نظر بدهید, یا trackback از سایت خود ارسال کنید.

۴ پاسخ به “محافظت از فایل های SWF در مقابل decompile شدن”

  1. منیره می‌گه:

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

    این کامنت صرفا به خاطر روحیه دادن به نویسنده بود.

  2. goldenboy می‌گه:

    سلام دوست من
    مطلب جالبی بود خوشم ادمد
    فقط میشه بگی برا اینجور فایل ها راهی برای دیکد کردنشون نیست؟

  3. سعید می‌گه:

    سلام.حداقل یکم بیشتر توضیح میدادین

نظر بدهید