В статье на хабр нашел общую идею которая мне понравилась
И так, идея заключается в том, что бы грузить с сервера не 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 минут
Хотелось бы прочитать отзывы кто что думает по поводу такого способа защиты
