Показать сообщение отдельно
Старый 22.06.2012, 17:00
wapmaster вне форума Посмотреть профиль Отправить личное сообщение для wapmaster Найти все сообщения от wapmaster
  № 3  
Ответить с цитированием
wapmaster

Регистрация: Oct 2011
Сообщений: 21
В статье на хабр нашел общую идею которая мне понравилась

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