PDA

Просмотр полной версии : Защита контента


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 довольно можно придумать.

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

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
Хотелось бы прочитать отзывы кто что думает по поводу такого способа защиты :)
Он не слишком надежен, но для простых случаев сойдет. При желании думаю не слишком сложно вытащить графику из оперативной памяти, там-то она хранится расшифрованной.