一篇舊文章,教如何透過 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 給破解出來,以上這作法也就只是為了更加強破解的難度罷了,只好儘量將解密的程式隱藏的複雜一點囉,騙騙君子!
package ws.tink.display
{
import flash.display.BitmapData;
import flash.display.BlendMode;
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
public class HitTest
{
public static function complexHitTestObject( target1:DisplayObject, target2:DisplayObject, accurracy:Number = 1 ):Boolean
{
return complexIntersectionRectangle( target1, target2, accurracy ).width != 0;
}
Continue reading »
tb是TabNavigator实例
1,点击其它按钮后,动态添加:
function addTab(s:String):void{
var n:mynews = new mynews();
n.label=s;
//tb.addChild(n);
tb.addChildAt(n,0);
//以前我们最熟悉的强制内存回收的方法是:
function GC():void{
try{
(new LocalConnection).connect(“foo”);
(new LocalConnection).connect(“foo”);}catch(e){
trace(System.totalMemory);
}
}
//由于上次试验弱引用的时候,发现当轮询本地sharedobject对象的时候,导致弱引用的内容进行了回收,于是联想用来进行强制内存回收..代码如下:
Continue reading »
★不管是写trace还是flash自带的调试功能都不太好用,下面我推荐三款个人觉得比较好用的,可以提高我们的开发效率。
→黑羽的远程调试器:http://www.kingda.org/archives/kingda/2006/04/flash.html
→自在幻想的AGE Live Debugger:http://bbs.blueidea.com/thread-2757985-1-1.html
→国外著名的Xray:http://osflash.org/xray/
→Xray下载:http://osflash.org/xray/#downloads
→Xray视频教程:http://labs.blitzagency.com/wp-c … als/indexFlash.html
★火山注:前两款都是国人开发的,特点是小巧易用,有现成的使用教程,而且你们可以方便的和原作者沟通,当然,是否能找到他们,还要看自己的造化了
不过要从功能上说的话,还是国外的Xray比较强,它利用localConnetion,可以从一个SWF中直接获取你的主SWF信息,并且进行调试,主SWF会把调试结果直接显示出来,非常直观和方便。另外他还专门有滤镜调试面板,并把效果直 接转化为代码,这样我们就不用一次又一次的发布来调试滤镜效果了。其它的功能还有历史记录,视频,声音调试等等,总之非常牛,我现在最常用的就是 Xray+AGE Live Debugger,不过听说幻想准备升级它的AGE Live Debugger,也增加可视化元素,我们一起期待吧
在flex里通过addEventListener函数给控件动态加载click事件侦听函数时,除了事件本身传递的Event类型参数外,还需要传递更多的参数,在网上找了一段代码,用起来还不错,张贴到这里。
package
{
public class EventArgExtend
{
public function EventArgExtend()
{
}
public static function create(f:Function,… arg):Function
{
var F:Boolean=false;
var _f:Function=function(e:*,…_arg)
{
_arg=arg
if(!F)
{
F=true
_arg.unshift(e)
}
f.apply(null,_arg)
};
return _f;
}
public static function toString():String
{
return “Class JEventDelegate”;
}
}
}
=========================================== 使用的方式:
txtShow.addEventListener(MouseEvent.CLICK,EventArgExtend.create(clickHandler,1,”str”));
private function clickHandler(e:Event,…arg):void
{
Alert.show(arg[0].toString());
Alert.show(arg[1].toString());
}
还有另外一个方法,没有封装效果,不过代码更加容易理解:
var sayHello:String = “欢迎光临www.FlashJ.cn -Flash,Ria技术博客”;
btn1.addEventListener(MouseEvent.CLICK,function (e:MouseEvent){clickHandlerWithArg(e,sayHello)});
function clickHandlerWithArg(e:MouseEvent,arg:String):void
{
var out:String= e.target + “发出事件(有参数) :” + arg;
trace(out);
}
s通用闭包方法给addEventListener传参数。
var arg=0;
a.addEventListener(MouseEvent.CLICK,clickfunc(arg));
function clickfunc(arg):Function{
var func=function(e):void{
trace(arg);
trace(e);
}
return func;
}
要获得当前swf的url地址可以用如下的方法:
1.Application.application.url
2.this.systemManager.loaderInfo.url
如要获得域名可以用URLUtil静态类,无需创建实例
URLUtil.getServerName((Application.application.url))
(this.parent as 父级类型).父级变量;
父级类型即父级mxml的名称
这种方法适合使用addchild添加的子级,如果是使用的PopUpManager的方法,
需要使用this.parentApplication.父级变量

Recent Comments