Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Общие вопросы о Flash (не затрагивающие ActionScript) (http://www.flasher.ru/forum/forumdisplay.php?f=60)
-   -   Защита контента (http://www.flasher.ru/forum/showthread.php?t=181415)

wapmaster 22.06.2012 16:21

Защита контента
 
Здравствуйте!
Меня интересует вопрос защиты swf фала содержащего графику.
Например у меня есть приложение (игра) которая выкачивает swf содержащую графику. Используя фаербаг или чарлес можно без труда узнать адрес этой самой swf, скачать ее по этому адресу и вытянуть графику.
У кого какие соображения есть по поводу защиты?

В данном случае интересует защита именно то воровства графики, анимации, звуков и подобному контенту.

mooncar 22.06.2012 16:28

Такая защита невозможна.

wapmaster 22.06.2012 17:00

В статье на хабр нашел общую идею которая мне понравилась :)

И так, идея заключается в том, что бы грузить с сервера не swf файлы, а некие бинарники.
1) пишем програмулину которая будет переводить скомпиленый swf в бинарник и по ходу "портить" его. Например менять некоторые байты местами, или же заменять скажем на "0" (в данном случае нужно где-то запоминать позицию которую изменили и значение).
2) компилим swf файлы с графикой и скармливаем его програмулине о которой писал выше.
3) загружаем этот бинарник. Восстанавливаем байты как было до изменения (либо меняем местами обратно, либо меняем значения на те которые и были)
4) получаем графику и радуемся.

попробовал набросать на коленке такую схему. оказывается получилось :)
декомпилятор (Sothink SWF Decompiler) сказал что файл поврежден. В проекте если не восстанавливать байты в первоначальный вид тоже не получилось с бинарником работать (естественно). А вот после восстановления все прекрасно работает, графика и музыка прекрасно достается из файла. А если применять к коду обфускатор что бы не было на много сложнее понять что происходит и как восстанавливается файл то как по мне это неплохой вариант, тем более что алгоритмов "ломания" и восстановления swf довольно можно придумать.

Ниже приведен код класса восстанавливаюшего файл (код написан на коленке, так что не ругаться на него :) ):
Код AS3:

package  
{
        import flash.display.Loader;
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.IOErrorEvent;
        import flash.events.ProgressEvent;
        import flash.net.URLLoader;
        import flash.net.URLLoaderDataFormat;
        import flash.net.URLRequest;
        import flash.utils.ByteArray;
        /**
        * ...
        * @author rocket
        */

        public class BrokenLoader extends Sprite
        {
                private var _oldBytes:Array = [67, 87, 83, 15, 251, 170, 22, 0, 120, 156, 236, 187, 119, 84, 83, 223, 186, 239, 189, 82]; //байты которые нужно восстановить
                private var _loader:URLLoader;
                private var _bl:Loader;
                private var _oldArray:ByteArray;
 
                public function BrokenLoader()
                {
                      // так как Loader не может загрузить бинарник, грузим его URLLoader
                        _loader = new URLLoader();
                        _loader.dataFormat = URLLoaderDataFormat.BINARY;
                        _loader.addEventListener(Event.COMPLETE, onLoadingComplete);
                        _loader.load(new URLRequest("asd.bin"));
 
                        _bl = new Loader();
                        _bl.contentLoaderInfo.addEventListener(Event.COMPLETE, onFileRestore);
                }
 
                private function onLoadingComplete(e:Event):void
                {
                        // после загрузки файла берем полученный ByteArray
                        _oldArray = e.target.data;
 
                        //  восстанавливаем необходимые байты
                        for (var i:int = 0; i < _oldBytes.length; i++)
                        {
                                _oldArray[i] = _oldBytes[i];
                        }
 
                      // скармливаем ByteArray лоадеру
                        _bl.loadBytes(_oldArray);
                }
 
                private function onFileRestore(e:Event):void
                {
                        // лоадер получил ByteArray и теперь мы можем работать с ним как с обычной swf
                        trace(e.target.content); // [object MainTimeline]
                        trace(_bl.contentLoaderInfo.applicationDomain.hasDefinition("Background")); // true
                        addChild(new (_bl.contentLoaderInfo.applicationDomain.getDefinition("Background") as Class) as MovieClip); //добавляется мувиклип из swf
                }
 
        }
 
}

По сути получается довольно просто.
Но мне кажется что лучше по какому-то алгоритму менять байты внутри бинарника что бы не запоминать какие именно значения нужно присвоить на какие места, а просто при восстановлении перетасовать в нужном порядке

Добавлено через 68 часов 48 минут
Хотелось бы прочитать отзывы кто что думает по поводу такого способа защиты :)

mickfallout 27.06.2012 12:42

Цитата:

Сообщение от wapmaster (Сообщение 1085750)
Хотелось бы прочитать отзывы кто что думает по поводу такого способа защиты :)

Он не слишком надежен, но для простых случаев сойдет. При желании думаю не слишком сложно вытащить графику из оперативной памяти, там-то она хранится расшифрованной.


Часовой пояс GMT +4, время: 17:23.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.