相信寫AS3代碼的同學都用過Action Script Viewer、SWF Decompiler這些工具吧?它們確實很強大,但普遍有一個缺點:對參數和局部變量反編譯得不好,它們會用_arg1、_local1、param1和_loc_1來替換真正的參數和局部變量。雖然這不影響反編譯,但對於只是借鑒部分代碼的同學,相信很難理解這些無俚頭的東東吧?
最近我用ASV浏覽代碼,幸運地發現它居然能准確地反編譯參數和局部變量。當然這是有前提的,那就是必須是反編譯調試版的SWF,對於發行版的SWF是沒有辦法的。大家知道,用Flash Builde等IDE默認就是生成調試版的SWF,添加SWC再生成就不是什麼問題。另外,也可以解壓SWC文件,直接反編譯library.swf。所以說,SWC一不小心就讓AS3代碼暴露得一絲不掛。
下圖是使用ASV浏覽發行版的SWF看到的AS3代碼片段:
代碼如下: public function setAlpha(_arg1:Number,_arg2:String="Normal"):void{ var _local3:int=addExtGState({ ca:_arg1, SA:true, CA:_arg1, BM:("/"+_arg2) }); setExtGState(_local3); }
很無俚頭吧,如果代碼再復雜一些,就更難懂了。 下圖是使用ASV浏覽調試版的SWF看到的AS3代碼片段:代碼如下: public function setAlpha(alpha:Number,blendMode:String="Normal"):void{ var graphicState:int=addExtGState({ ca:alpha, SA:true, CA:alpha, BM:("/"+blendMode) }); setExtGState(graphicState); }
幾乎和原代碼一樣,當然,這部分代碼片段必須是在SWC就有的。
這樣看來,發布調試版的SWF不僅浪費,也是不安全的。發布SWC特別要注意這一點,最好發布時加密。