2009年2月21日 星期六

利用 ByteArray 將 SWF 重新編碼加密

一篇舊文章,教如何透過 ByteArray 將 *.swf 進行自訂的編碼,使得一般人無法透過 decompiler 將該 *.swf 解出來。

文章已不存在,google cache:http://209.85.175.132/search?q=cache:JFsWjtfvv0QJ:lab.lzyy.name/blog/archives/32+swf+bytearray&hl=zh-TW&ct=clnk&cd=1&gl=tw&client=firefox-a

步驟一,隨便建立一個 swf 當作要被加密的內容檔案,怎麼做不管,假設檔名 asset.swf。

步驟二,做一個用來進行加密工作的 flash:


var ul:URLLoader = new URLLoader();
ul.dataFormat = URLLoaderDataFormat.BINARY;
ul.addEventListener(Event.COMPLETE, onComplete);
ul.load(new URLRequest("asset.swf"));

function onComplete(e:Event):void{
var ba:ByteArray = (e.target as URLLoader).data;

ba.compress(); //這裡要代換成一個複雜的加工作業

var fr:FileReference = new FileReference();
fr.save(ba, "asset_c.swf");
}


簡單來說,就是將 swf 以 binary 的方式讀入,並對 ByteArray 做些改變,再重新存成 swf 檔。這個作業當然也可能應該是由 Server 進行,至於要對 ByteArray 做甚麼樣的資料改變,都可以。

步驟三,可以用 decompiler 軟體對剛存好的 asset_c.swf 作業看看,就可以發現沒有效果,因為本質上他已經不是 swf format 了。

步驟四,另外開發一個讀取用的 flash,也就是未來真正要將 asset_c.swf 動態載入進來播放的 main.swf:


var ul:URLLoader = new URLLoader();
ul.dataFormat = URLLoaderDataFormat.BINARY;
ul.addEventListener(Event.COMPLETE, onComplete);
ul.load(new URLRequest("asset_c.swf"));

var loader:Loader = new Loader();
addChild(loader);

function onComplete(e:Event):void{
var ba:ByteArray = (e.target as URLLoader).data;

ba.uncompress(); //這裡要代換成一個複雜的加工作業

loader.loadBytes(ba);
}


解密的部分,要參考加密的過程,反向進行。

不過,我想聰明如你也會知道,這個 main.swf 仍是明碼,仍能被 decompiler 給破解出來,以上這作法也就只是為了更加強破解的難度罷了,只好儘量將解密的程式隱藏的複雜一點囉,騙騙君子!

沒有留言: