Зачем защищать флеш as код и контент.

Контен защищают с целью, боятся человечки за свое добро, тк. времена кризиса диктуют моду. Канешн, кому оно нафик надо, ваша мазня, а ведь это повод, защитить контен, так никто фуфло-кода (термин быдло-код, мне не по душе, тк. писавший его человек, по определению, выходит, что быдло, как то оскорбительно, а говорящий высокомерный и сам не того.. в общем редиска).
Сейчас 2013 год, по прежнему кризис, однако я сделал полуавтоматический обфускаотр as3 и даже сделал видео хау-ту.. А теперь назад в 2009, в 2013 по прежнему есть haxe, однако в 2013 многие фичи поменялись а многие уже не работают.

Так, сейчас 2009 успокоились... Тузла фрии, чисто опенсорс из опенсорса, любителям халявы - досвиданье, как это коммент про меня проскочил: - "Много букав, фу.. - это же не выхад". Букав будет много, тк. мне прикалует печатать.

Защита флеш контента.

Задумал я перейти на альтернативную технологию, на HAXE, прикольная, однако, фишка еще та. Как в haxe сделать прелоадер? Google нашел Прелоадер флешки самой себя на HAXE. Вот, чем хорош опенсорс, исходники прилагаются, я их скачал, ну снеговик, эт-же рисунок, какой от него толк? Чел сделал на виртуальной машине neko (на самом деле скаченная neko-1.8.1-win.zip весит 774 кБ) генератор двух кадровой флешки, делаются две haxe флешки, одна прелоадер включается в первый кадр, а вторая флешка с заембеденным снеговиком.jpg-контентом во второй. Тк. синтаксис haxe специфичный, то заембеденный контент дедомпилятор не видит, не видит его и FlashDevelop, когда вставляется флешка в папку проекта FD по клику правой кнопочкой мыши показывает содержащиеся во флешки символы, так байтаррай вставленный flex копилятором FD покажет как символ, a вставленный байт-аррай через компилятор haxe ниче не покажет, и вообще не понятно всавляется все и этот boot и пр. haxe приколы. В общем скачал еще и haxe компилятор haxe-2.04-win.zip 2 Мб. Распаковал, прописал в переменной path, но его можно и не прописывать, так, я себе теперь пишу в командной строке типа
haxe скомпиль ролик.swf

а без прописки в path будет так
D:\haxe\haxe.exe скомпиль ролик.swf
так просто дольше

Тестирование снеговичного прелоадера с gamehaxe.com.

Распаковуем архив haxe-preloader-0.zip в нем три флешки и куча файлов. Запускаем Preload.swf выдает ошибку:
TypeError: Error #1007: Попытка реализации в объекте, который не является конструктором.
	at Type$/createInstance()
	at Preload/RunMain()
	at Preload/Update()
Запускаем Main.swf, появляется снеговик.
Запускаем Output.swf, появляется прелоадер и снеговик.
Пробуем скомпилить пример: но для начала (я уже все это делал, а теперь вспоминаю) переименую файлы на HPreload.swf HMain.swf и HOutput.swf для сравнения с новыми (скомпиленными) переходим командной строкой в каталог с файлами проекта
D:\>cd "D:\FLEX\hahe\СТАТЬЯ прелоадер снеговика\haxe-preloader-0\haxe-preloader-0.1"

D:\FLEX\hahe\СТАТЬЯ прелоадер снеговика\haxe-preloader-0\haxe-preloader-0.1>
Теперь пишем haxe и перетягиваем мышкой файл Compile.hxml из навигатора в командную строку и Enter. Получиться наподобие
D:\FLEX\hahe\СТАТЬЯ прелоадер снеговика\haxe-preloader-0\haxe-preloader-0.1>haxe Compile.hxml
CreatePreloader done
Main created
Preload created
Ouput done

D:\FLEX\hahe\СТАТЬЯ прелоадер снеговика\haxe-preloader-0\haxe-preloader-0.1>

Так скомпилили, запускам Output.swf
неработающий прелоадер

Блин... Облом, столько работы, скачивал, прописывал в path и все на смарку, вот и opensource. Теперь по моймк, opensource теперь переводится как почти готовое.

Подключаем тяжелую opensource артилерию в виде FlashDevelop

Ищем в настройках сами (типа домашнее задание вам: для любителей чуток поковыряться в кнопках, понастраивать) прописываем путь до haxe компилятора и создаем новый, можно в принципе любой, но я создал пустой haxe проект в папку со скаченным haxe прелоадером и сравниваем ресурсы флешек main.swf и hmain.swf
разные названия символов исходного и скомпилированного кода
Сравните названия символов исходного и скомпилированного флешек

Как видно FD показал, что названия символов и классов, (можете проверить) во флешках исходниках hpreloader.swf и hmain.swf отличаются, а во вновь полученных они одинаковые flash.boot. Надо это дело поправить, для этого я скачал программулю SWF Compressor и сделал флешке main.swf decompress, назвал флешку DeMain.swf, теперь Hex редактором, использовал Yuri Software HEdit открываю флешку DeMain.swf и тут главное что-бы число символов соответствовало исходному нажимаем ctrl+h (замена) и по одному заменяем слово Boot на любое из 4-х букв, но по одному это делается, те. не заменить все и я еще нажимал Match case
редактирование swf hex редактором
Было произведено две замены, одна в начале файла и одна в конце.

Теперь сохранить и сделать ей compress те. сжать полученную сжатую назвал UnBootMain.swf делаем свой компиляционный файл из Compile.hxml он был такой
-main CreatePreloader
-neko CreatePreloader.n
-cp hxformat
-cmd "echo CreatePreloader done"

--next
-main Main
Preload
-swf Main.swf
-swf-version 9
-resource Snowman.jpg@Snowman
-cmd "echo Main created"

--next
-main Preload
-swf Preload.swf
-swf-version 9
-cmd "echo Preload created && neko CreatePreloader.n Preload.swf Main.swf Output.swf && echo Ouput done"


как видно можно поставить версию и пр. Теперь будет собираться только исходный файл, для этого новый файл называется myCompile.bat и он такой
neko CreatePreloader.n Preload.swf UnBootMain.swf Output.swf

запускаем этот bat
Тестим флешку output.swf, все теперь она работает, появляется прелоадер и снеговик.
Значит надо сделать програмку, которая сама найдет нужные Boot и заменит их автоматом, я сделаю на С консольное приложение, мне так интересней (Си рулит на бешенной скорости), да и вспомнить будет что.
//---------------------------------------------------------------------------

#include <vcl.h>

#include <stdio.h>
#include <process.h>
#include <errno.h>
#include <time.h>
#include <conio.h>
#include <string.h>

#pragma hdrstop

//---------------------------------------------------------------------------
HANDLE bootFile;
int unBootFile;
SYSTEM_INFO si;
__int64 fileDataSize;

char *bootFileNameStr;
char *unBootFileNameStr;
DWORD br;

char *bootData;

unsigned char findBoot0[] = {0x04,'B','o','o','t',0x09};
unsigned char findBoot1[] = {0x2E,'B','o','o','t',0x00};
int findLen = 6;
#pragma argsused
int main(int argc, char* argv[])
{
	//проверка аргументов
	if (argc!=3)
	{
		printf("Argument error, example: prog.exe boot.swf resultUnBoot.swf");
		return(-1);
	}

	//первый параметр имя леш файла, в котором надо заменить Boot
	bootFileNameStr = argv[1];

	//второй параметр флеш результат, в котором Boot заменен на HaXe
	unBootFileNameStr = argv[2];

	int i,j,match,match1;

	char findStr[] = ".Boot.",ch;

	//выделение пямяти для файла
	GetSystemInfo(&si);

	bootFile = CreateFile(bootFileNameStr, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0);

	if (INVALID_HANDLE_VALUE==bootFile)
	{
		printf("Error on modul find and replace Boot, boot.swf");
		return(-1);
	}

	printf("find and replace Boot on HaXe, boot.swf");

	fileDataSize=GetFileSize(bootFile,0);

	bootData=(LPSTR) VirtualAlloc(0,(fileDataSize+si.dwPageSize-1)/si.dwPageSize*si.dwPageSize,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);

	ReadFile(bootFile,bootData,fileDataSize,&br,0);

	if(bootFile!=INVALID_HANDLE_VALUE)
	{

		CloseHandle(bootFile);

		//find boot
		for (i=0;i<fileDataSize-findLen;++i)
		{
			ch=*(bootData+i);
			for (j=0;j<findLen;j++)
				findStr[j]=*(bootData+i+j);
			match = match1 = 0;
			for (j=0;j<findLen;j++)
			{
				findStr[j]=*(bootData+i+j);
				if (findStr[j]==findBoot0[j])
					match++;
				if (findStr[j]==findBoot1[j])
					match1++;
			}

			if (match==findLen||match1==findLen)
			{
				*(bootData+i+1)='X';
				*(bootData+i+2)='a';
				*(bootData+i+3)='H';
				*(bootData+i+4)='e';
			}


		}

		unBootFile = FileCreate(unBootFileNameStr);

		FileWrite(unBootFile,bootData,fileDataSize);

		FileClose(unBootFile);

		if (bootData!=(LPSTR)0)
			VirtualFree((void*)bootData,0,MEM_RELEASE);
	}
	return 0;
}
//---------------------------------------------------------------------------



Нормально работает заменяет слово Boot на XaHe, это и было нужно, пользоваться так: в командной строке пишем.
C:\TC1\replace boot>un-boot.exe boot.swf unBoot.swf
find and replace Boot on HaXe, boot.swf

В папке с файлом boot.swf появится файл unBoot.swf, с измененным словом Boot на HaXe.

Распаковка или uncompress swf файла, иными словами разархивируем swf средствами neko.

Теперь надо сделать авто uncompress и compress соответственно. Для этого будем юзать neko паккаж из снеговико-прелоадера hxformat
В FD создаем новый проект Haxe -> empty проект, название может быть любое, но у меня compress-uncompress
Копируем в папку проекта папку с neko классами из прелоадера снеговика hxformat. Теперь надо зайти в project - properties - class path и добавить туда hxformat (это действие нужно, что-бы FD подсказывал всплывающий подсказки по классам из этого паккажа). Теперь Создал новый hx файл, назвал его UnCompressSwf.hx, в нем такое содержание
/**
 * ...
 * @author Alex Lexcuk http://www.murmadillo.tut.su
 */

package ;

import haxe.io.Input;
import neko.Lib;

import format.swf.Reader;
import format.swf.Writer;
import format.swf.Data;

class UnCompressSwf 
{

	public function new() 
	{
		
	}

	static function main() 
	{
		var args = neko.Sys.args();
		if (args.length!=2)
			throw "Usage : UnCompressSwf compressed.swf unCompressed.swf";
		
		var swfFile = new Reader( neko.io.File.read(args[0],true)).read();
		
		var header = swfFile.header;
		
		header.compressed = false;
		
		var result = { header:header, tags:swfFile.tags};
		var out = new Writer( neko.io.File.write(args[1],true) );
		
		out.write(result);
		trace('compress file '+args[0]+' - now unCompressed '+args[1]);
	}
}

Что-бы скомпилировать программу создал еще один файл CompileUnCompressSwf.hxml с таким содержимым
-main UnCompressSwf
-neko UnCompressSwf.n
-cp hxformat
-cmd "echo UnCompressSwf done"

Компилировал из командной строки, вызванной из FD кнопочкой command promt.
D:\FLEX\hahe\СТАТЬЯ прелоадер снеговика\compress-uncompress>haxe CompileUncompressSwf.hxml
UnCompressSwf done

Затестил програмулю там же, вставил в папку проекта swf файл с компрессией compress.swf и в коммандной строке
D:\FLEX\hahe\СТАТЬЯ прелоадер снеговика\compress-uncompress>neko UnCompressSwf.n compress.swf uncompress.swf
UnCompressSwf.hx:39: compress file compress.swf - now unCompressed uncompress.swf

в папке с проектом появился файл uncompress.swf (вес 119 КБ), а файл compress.swf весит 86 КБ
Таким же макаром пишем сжималку swf, которая будет работать после замены в ней Boot на HaXe

Упаковка или compress несжатого swf файла, или сжатие swf средствами neko.

А все то-же, только пишем header.compressed = true; и название проги CompressSwf
Компилируется и тестится так-же.
D:\FLEX\hahe\СТАТЬЯ прелоадер снеговика\compress-uncompress>neko CompressSwf.n uncompress.swf compress.swf
CompressSwf.hx:39: uncompress file uncompress.swf - now compressed compress.swf

План по модернизации swf файла.

Haxe будет работать как сборщик swf файла в котором спрятан код, в Haxe флешку первого кадра будет внедрена еще одна флешка, сделанная в flex или flash в ней будет анимированный прогресс бар.
Тоесть анимация прогресса, остальное будет происходить в Haxe
Во вторую Haxe флешку, тоже будет заэмбедена флешка (вместо jpg снеговика), только не просто заембедена, а заембедена хитро, в ней будет, только, что придумал, 77 (будет счастливое число) лишних нулей. Я поделю размер флешки на 77 и занулю каждый fileSize/77 байт флешки, а байты, которые были занулены (настоящие) будут заембедены отдельным файлом. Потом все опять будет склеено и добавлено на сцену. Никто ее не декомпилирует...100%. Еще надо будет считать скорость кадров и размер настоящего ролика, ну версия плеера 10 конечно-же (тут я не буду ниче делать) и в результирующей флешке сделать все по этим тегам.
Прочитать теги не проблема, вывести теги, то-же можно оператором trace.
Haxe компилирует флешки таким скриптом hxml
--next
-main Main
Preload
-swf Main.swf
-swf-version 9
-resource Snowman.jpg@Snowman
-swf-header 200:300:40:FF0000
-cmd "echo Main created"

Можно header записать в спец файл, но не нужно... Вот нарыл инфу по bat файлам в windows вобщем переменную можно создать и записать в нее результат работы программы это делается так
@echo off

rem выполнить файл Project2.exe, а его ответ записать в переменную ответНа
for /f "tokens=* usebackq" %%i in (`Project2.exe`) do (set ответНа=%%i)

echo %ответНа% %ответНа% %ответНа% %ответНа%


я его запускаю и cmd выводит ответ
C:\TC1\BAT>C:\TC1\BAT\test.bat
hello:OH:3883:29 hello:OH:3883:29 hello:OH:3883:29 hello:OH:3883:29

а программка Project2.exe очень простая
//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
        printf("hello:OH:3883:29");
        return 0;
}
//---------------------------------------------------------------------------
 

Теперь выведем теги swf, такие как ширина, высота, фреймрейт, цвет чет не предусмотрен, фиг на него

/**
 * ...
 * @author Alex Lexcuk http://www.murmadillo.tut.su
 */

package ;

import haxe.io.Input;
import neko.Lib;

import format.swf.Reader;
import format.swf.Writer;
import format.swf.Data;

class ReadHeader 
{

	public function new() 
	{
		
	}

	static function main() 
	{
		var args = neko.Sys.args();
		if (args.length!=1)
			throw "Usage : ReadHeader file.swf";
		
		var swfFile = new Reader( neko.io.File.read(args[0],true)).read();
		
		var header = swfFile.header;
		
		var headerFPS = header.fps >> 8 & 255;
		
		neko.Lib.print(header.width + ':' + header.height + ':' + headerFPS);
		
	}
}

Затестим
D:\FLEX\hahe\СТАТЬЯ прелоадер снеговика\compress-uncompress>haxe CompReadTag.hxml
ReadHeader done

D:\FLEX\hahe\СТАТЬЯ прелоадер снеговика\compress-uncompress>neko ReadHeader.n uncompress.swf
400:300:30
D:\FLEX\hahe\СТАТЬЯ прелоадер снеговика\compress-uncompress>pause
Для продолжения нажмите любую клавишу . . .

Нормуль, а bat был такой
haxe CompReadTag.hxml
neko ReadHeader.n uncompress.swf
pause

Теперь внедрим flex флешку в haxe флешку, это будет прелоадер.
Flex флешка такая
package  
{
	import flash.display.*;
	import flash.events.*;
	import lex.asComponent.*;
	
	/**
	 * ...
	 * @author Alex Lexcuk http://www.murmadillo.tut.su
	 */
	public class Doc extends MovieClip
	{
		private var pre:RadPrBarObs;
		public function Doc() 
		{
			addChild(pre = new RadPrBarObs());
			pre.x = 200;
			pre.y = 200;
			addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
		}

		private function addedToStageHandler(e:Event):void {
			pre.x = stage.stageWidth / 2;
			pre.y = stage.stageHeight / 2;
		}

		public function setProgress(n:Number):void {
			pre.setProgress(n);
		}

		public function clear():void {
			trace('clear');
			removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
			removeChild(pre);
			pre.clear();
			pre = null;
		}

	}

}


Получена путем экспериментов для дальнейшего исследования. Должна иметь метод setProgress(n:Number) в него вводится прогресс от 0 до 1. и метод clear, где надо удалять, очищать все листенеры, шилды и пр. для дальнейшей работы сборщика мусора. Была скомпилироана в flex-preloader.swf и содержит в себе круглый анимированный прогресс бар.
Haxe флешка по аналогии со снеговичной флешкой, полный ее дубль, за исключением, заэмбеденного в нее байт аррая, который эмбедится на процессе компиляции скриптом compPreload.hxml
-main Preload
Preload
-swf first_frame.swf
-swf-version 10
-resource flex-preloader.swf@flex_preloader_swf
-cmd "echo Preload created"

и такой haxe класс Preload.hx
import flash.display.MovieClip;
import flash.text.TextField;

class Preload extends MovieClip
{
	var mUpdateFunc:Dynamic->Void;
	//var mText:TextField;
	var loaderSwf:flash.display.Loader;
	function new()
	{
		super();
		loaderSwf = new flash.display.Loader();
		loaderSwf.loadBytes(haxe.Resource.getBytes("flex_preloader_swf").getData());
		loaderSwf.contentLoaderInfo.addEventListener(flash.events.Event.COMPLETE, loaderSwfCompleteHandler);
	}

	function loaderSwfCompleteHandler(e:flash.events.Event):Void {
		loaderSwf.contentLoaderInfo.removeEventListener(flash.events.Event.COMPLETE, loaderSwfCompleteHandler);
		flash.Lib.current.addChild(loaderSwf);
		mUpdateFunc = Update;
		flash.Lib.current.stage.addEventListener( flash.events.Event.ENTER_FRAME, mUpdateFunc );
	}

	function RunMain()
	{
		var boot_class = Type.resolveClass("PreloaderBoot");
		var boot = Type.createInstance( boot_class, [ haxe.Log.trace ] );
	}


	function Update(_)
	{
		var loaded = flash.Lib.current.loaderInfo.bytesLoaded;
		var total = flash.Lib.current.loaderInfo.bytesTotal;
		//mText.text = "Loaded :" + loaded + "  /  " + total;
		untyped(loaderSwf.content).setProgress(loaded / total);
		if (loaded==total)
		{
			flash.Lib.current.stage.removeEventListener( flash.events.Event.ENTER_FRAME, mUpdateFunc );
			untyped(loaderSwf.content).clear();
			flash.Lib.current.removeChild(loaderSwf);
			loaderSwf.unload();
			loaderSwf = null;
			RunMain();
		}
	}


	public static  function main()
	{
		new Preload();
	}
}


компилю уже через cmd
D:\FLEX\hahe\СТАТЬЯ прелоадер снеговика\compress-uncompress>haxe compPreload.hxml
Preload created

D:\FLEX\hahe\СТАТЬЯ прелоадер снеговика\compress-uncompress>neko CreatePreloader.n first_frame.swf UnBootMain.swf out.swf

В файле UnBootMain.swf находится снеговик из снеговичного прелоадера.
Теперь надо разрезалку сделать на C. Вот нарисовал быстро, вроде работает:
//---------------------------------------------------------------------------

#include <vcl.h>

#include <stdio.h>
#include <process.h>
#include <errno.h>
#include <time.h>
#include <conio.h>
#include <string.h>

#pragma hdrstop

//---------------------------------------------------------------------------
HANDLE swfFile;
int nullFile, codeFile;
SYSTEM_INFO si;
__int64 fileDataSize;

char *swfFileNameStr;
char *nullFileNameStr;
char *codeFileNameStr;
DWORD br;

char *swfData;
char *nullData;

int nullSize = 77;
#pragma argsused
int main(int argc, char* argv[])
{
	//проверка аргументов
	if (argc!=4)
	{
		printf("Argument error, example: prog.exe file.swf null.swf code.dat");
		return(-1);
	}

	//первый параметр имя леш файла
	swfFileNameStr = argv[1];

	//второй параметр флеш результат, в котором будет лишних 77 нолей
	nullFileNameStr = argv[2];

	//третий параметр байты вместо нолей
	codeFileNameStr = argv[3];

	int i,j,nullLen,nullCount=0;



	//выделение пямяти для файла
	GetSystemInfo(&si);

	swfFile = CreateFile(swfFileNameStr, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0);

	if (INVALID_HANDLE_VALUE==swfFile)
	{
		printf("Error on modul 77 null character, file.swf");
		return(-1);
	}

	printf("null replace");

	fileDataSize=GetFileSize(swfFile,0);

	nullLen = fileDataSize/nullSize;

	swfData=(LPSTR) VirtualAlloc(0,(fileDataSize+si.dwPageSize-1)/si.dwPageSize*si.dwPageSize,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);

        nullData=(LPSTR) VirtualAlloc(0,(nullSize+si.dwPageSize-1)/si.dwPageSize*si.dwPageSize,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);

	ReadFile(swfFile,swfData,fileDataSize,&br,0);

	CloseHandle(swfFile);

        //find boot
        for (i=0;i<fileDataSize;++i)
        {
         if (i%nullLen==0) {
            if (nullCount>=77) break; else {
              *(nullData+nullCount)=*(swfData+i);
              *(swfData+i) = 0;
               nullCount++;
            }
         }
        }

        nullFile = FileCreate(nullFileNameStr);

        FileWrite(nullFile,swfData,fileDataSize);

        FileClose(nullFile);

        codeFile = FileCreate(codeFileNameStr);

        FileWrite(codeFile,nullData,nullSize);

        FileClose(codeFile);

        if (swfData!=(LPSTR)0) VirtualFree((void*)swfData,0,MEM_RELEASE);
        if (nullData!=(LPSTR)0) VirtualFree((void*)nullData,0,MEM_RELEASE);
        printf("well done 77 null data");
	return 0;
}
//---------------------------------------------------------------------------




Затестил ее с параметрами boot.swf null.swf code.dat, получил файлы code.dat(77 байл) и null.swf, запуская который, не выводится критических ошибок, но и контент не появляется в логи сыпятся предупреждения:
session started
Предупреждение: Неизвестный тип загрузки проигрывател file:///C|/TC1/console%2Dart/gen%5Fcode/null.swf
Предупреждение: Неизвестный тип загрузки проигрывател file:///C|/TC1/console%2Dart/gen%5Fcode/null.swf

Теперь самое интересное: внедрить swf файл с нулями и файл-код в haxe, и склеив их, благополучно показать контент.
Да и вот еще, что надо ——no—traces добавить в параметры компилятору.
Вот такой компиляционный файл для Frame2, называется compFrame2.hxml
-main Frame2
Frame2
-swf second_frame.swf
-swf-version 10
-resource null.swf@Snowman
-resource code.dat@SnowmanDat
--no-traces 
-cmd "echo Frame created"

И такой документ haxe класс для Frame2
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.MovieClip;
import flash.display.Shape;
import flash.events.Event;
import flash.Lib;
import flash.utils.ByteArray;
import flash.display.Loader;
import flash.geom.Rectangle;
import flash.display.StageAlign;
import flash.display.StageScaleMode;

class Frame2 extends MovieClip
{
	private var ba:ByteArray;
	private var baSwf:ByteArray;
	private var loader:Loader;
	
	public function new(inData:ByteArray, inCod:ByteArray)
	{
		super();
		
		ba = inCod;
		baSwf = inData;
		
		addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
	}

	private function addedToStageHandler(evt:Event = null):Void {
		var j:Int = 0;
		var i:Int = 0;
		var codeLen:Int = 77;
		var codeStep:Int = untyped(baSwf.length/codeLen);
		
		while (i<baSwf.length) {
			if (i % codeStep == 0) {
				//trace(StringTools.hex(ba[j]));
				if (j<codeLen) baSwf[i] = ba[j];
				j++;
			}
			i++;
		}
		
		loader = new Loader();
		loader.loadBytes(baSwf);
		addChild(loader);
		loader.tabEnabled = true;
		tabEnabled = true;
	}



	public static  function main()
	{
		// This is to ensure the preloader class get loaded - is there another way?
		PreloaderBoot.LinkMe;

		// Load content from resouce that is associated with "Main" clip ...
		var bytes = haxe.Resource.getBytes("Snowman").getData();
		var bytesDat = haxe.Resource.getBytes("SnowmanDat").getData();
		//new Main(untyped bytes, untyped bytesDat); 
		flash.Lib.current.addChild(new Frame2(untyped bytes, untyped bytesDat));
		flash.Lib.current.tabEnabled = true;
		// Fire off the request and wait...
	}
}


Желаемый результат достигнут: два файла склеиваются в результирующей флешке и она появляется на экране, декомпилятор естественно ничего не покажет.
Пишем финальный Bat file. Папка проекта. Папка temp. Папка Script. Файл as-code-hide.bat
В папку script накидаю все скрипты файлов. А в папку temp будут промежуточные swf файлы бросаться.
Батник настрочл довольно быстро.
@echo off

set currentDir=%CD%

echo входная директория %currentDir%

echo bat директория %~dp0

cd %~dp0

rem Проверяем, задан ли параметр входного swf файла

set baseSwfFileStr=%1

set outSwfStr=%2

set color=:FFFFFF

if %baseSwfFileStr% == "" (
echo пользоваться так: as3-hide-code.bat нет-защиты.swf результат-защиты.swf
exit /b
)

rem Проверяем, задан ли параметр выходного swf файла

if %outSwfStr% == "" (
echo пользоваться так: as3-hide-code.bat нет-защиты.swf результат-защиты.swf
exit /b
)

rem скопируем бузовую swf в каталог temp

if not exist %baseSwfFileStr% (
echo файл %baseSwfFileStr% не найден
)

copy %baseSwfFileStr% "%~dp0\temp\base.swf"

rem прочитаем теги ширина высота частота кадров цвет в переменную swfHeader


rem переход на сохранение в popd

pushd "%~dp0\script"

@echo on
echo текущая директория

for /f "tokens=* usebackq" %%i in (`neko "%~dp0\script\ReadHeader.n" "%~dp0\temp\base.swf"`) do (set swfHeader=%%i)

echo Заголовок прочитан %swfHeader%

echo Создаем прелоадер

haxe -main Preload -swf "%~dp0\temp\first_frame.swf" -swf-version 10 -resource "%~dp0\script\flex-preloader.swf"@flex_preloader_swf -swf-header %swfHeader%""%color%

echo Создаем второй кадр

echo Режем флешку

77null.exe ..\temp\base.swf ..\temp\null.swf ..\temp\code.dat

haxe -main Frame2 -swf ..\temp\second_frame.swf -swf-version 10 -resource ..\temp\null.swf@Snowman -resource ..\temp\code.dat@SnowmanDat -swf-header %swfHeader%""%color%

echo ok

rem заменяем boot на haxe во втором кадре

neko UnCompressSwf.n ..\temp\second_frame.swf ..\temp\second_frame.swf

un-boot.exe ..\temp\second_frame.swf ..\temp\second_frame.swf

neko CompressSwf.n ..\temp\second_frame.swf ..\temp\second_frame.swf

neko CreatePreloader.n ..\temp\first_frame.swf ..\temp\second_frame.swf ..\temp\out.swf

rem восстановление каталога
popd

copy "%~dp0%^%temp\out.swf" %outSwfStr%


Потестил работает, естественно у Windows прописаны в переменную path пути к haxe и neko. Пользоваться так: запускаем cmd и можно мышкой, тянем мышкой туда as3-hide-code.bat , затем файл, который будет защищен и файл, который будет с защитой и прелоадером. Ну вот к примеру как у меня (только надо после перетягивания еще и пробел ставить.
C:\Documents and Settings\Alex.ALEX-9B046E579B>"D:\FLEX\hahe\СТАТЬЯ прелоадер снеговика\compress-uncompress\frighten-decompiler-as3\as3-hide-code.bat" "D:\FLEX\
hahe\СТАТЬЯ прелоадер снеговика\compress-uncompress\frighten-decompiler-as3\Preload-second-fram.swf" D:\Apache\murmadillo\Out.swf

Вылезет куча всякой фигни, но в конце концов защищенный файл D:\Apache\murmadillo\Out.swf создастся.
Так, теперь... opensource, ве что я печатал будет в архиве и флешечка маленькая protection.swf с защитой (без защиты no-protection.swf), по поводу флешечки, она стала больше на 22 кб, это много, и в вашей флешке ниче не долно происходить пока не сработает событе ADDED_TO_STAGE, это делается примерно так
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e:Event = null):void 
		{
			// ну после этого хоть все что угодно
		}

Те. нельзя без спросу юзать stage
Если надо как пример помощнее, есть игра гоночка, в которой спрятан код по этой технологии, попробуйте его достать декомпилятором., изготавливая эту игрулю, я ставил перед собой цель проверить практически, утопичную идею о монетизации флеш игр, и в очередной раз пришел к выводу, что это все фуфло и мозгоблудие. Следуя рекомендациям, было сделано меню, места для спонсоров (на них такие офигенные дивули и иногда разбитые тачки), раздел how to, самая крутая jiglib физика, трех мерное пространство в гонке сделать не удалось, тк. флеш тормозная фича и надо 4-х ядреный комп с 4-гиг оперативы (а у меня такого нету), что-бы рендерить 3-д гоночку флеш 30 fps, поэтому сделал, что смог - трехмерные маленькие тачки и вид сверху, но какие они класненькие, можно врезатся резко тормозить, качаются на рессорах, заносы к тому-же, от попробуйте разгоните тачку, со старта до 100 км и начните удерживать кнопку n (это нитро ускорение), когда стрелка спидометра будет зашкаливать (а звуки двигателя.., блин, я плачу) нажмите на пробел (ручной тормоз) тачка перевернется, по мойму это высший пилотаж не только флеш-физики, а игровой физики в принципе, игру пройти не просто, надо привыкнуть к управлению, срезать повороты и по возможности (ну эт, для профи) подрезать противников, только так ее можно пройти. И да... есть таблица рекордов, есть возможность выбрать цвет кузова, колес, стекол и тип кузова: Седан, универвал и пикап. И я за игрулю нифига не получил дохода, одно расстройство от галимых комментов и чувства зря потраченного времени.
Заюзать опенсорс эту фишешку будет нелегко, это-ж надо думать, прописывать в path виндовсу haxe и neko (а их еще и скачать надо) в общем, кто себе угробит виндоуз (как следствие кривости рук и недостаточной кривизны мозговых извилин), я не виноват... Не ну можете и не прописывать переменные path, но для этого надо модернизировать bat скрипт прописав в нем явные пути к компиляторам haxe и neko, не пробовал, кстати... этот вариант может и не заработать, в общем все я сделал в стиле opensource.
PS: haxe и neko работают и на linux тачках, но на лиукс тачках тормозит microsoft net frame work 2.0 (на вино ставил), а зачем нам это ГЕ?, спросят линуксоиды, а запускать флешдевелоп (4 мегабайтный, ну очень удобный редактор (опенсорс) для флеша). Блин, реально прикалует печатать, все пока, удачи...