as3加密入門-3降低反編譯代碼可讀性的代碼書寫習慣
from: http://bbs.9ria.com/viewthread.php?tid=47918
最近在考慮SWF安全方面的技術,看到一些關於這方面不錯的技術文章,記錄下來方便查閱.以下爲轉載內容:
這裏不推薦源代碼中使用無意義的變量名,如
- var asd=new Sprite();function asdf();
源代碼中儘量使用有意義的變量名,然後使用第二部分方法混淆即可。
我推薦的書寫習慣(針對代碼混淆):
1.object vs class
儘量少聲明class,絕大多時候,一個object對象({})就完全夠用了:
使用類:
- public class mySprite extends Sprite
- {
- public var vx;
- public var vy;
- public function mySprite()
- ...
- }
- var myinstc=new mySprite();
使用object(等價寫法):
- function newmySprite()
- {
- var mySprite=
- {vx:,vy:,cavans:new Sprite()};
- return mySprite;
- }
- var myinstc=newmySprite();
2.include vs import
include是我最喜歡用的關鍵字
少寫類,我們就可以多用include預編譯指令。
一個極端的做法是隻寫一個類“public class Main extends Sprite”,使用object代替class,將所有函數、變量作爲Main類的類函數、屬性。將相關聯的函數、變量分別寫進一個獨立的.as文件中,最後在Main.as中將這些.as文件include進來。這樣編譯出的swf只有一個類文件,
反編譯出的代碼也就一個超長的Main.as文件,可能含有幾十個變量和函數,極不便於閱讀,從而達到混淆效果。而如果聲明很多類,那反編譯出的代碼結構就會很清晰,各個包、類一目瞭然,很容易被破解者重複利用。
3.[]語法(By Zevan)
不推薦使用,有可能降低swf運行效率。但如果該部分代碼只運行一次,對效率要求不高,可嘗試一下:
- graphics.lineStyle(0,0);
- graphics[["drawEllipse", "drawRect"][int(Math.random()*2)]](Math.random()*400, Math.random()*300, Math.random()*100,Math.random()*100);
(可將"drawEllipse", "drawRect"賦值給自聲明的變量達到混淆效果):
- var drawEllipse="drawRect";
- graphics[drawEllipse] (Math.random()*400, Math.random()*300, Math.random()*100,Math.random()*100);
正常寫法
- var xp:Number, yp:Number, w:Number, h:Number;
- graphics.lineStyle(0,0);
- xp = Math.random()*400;
- yp = Math.random()*300;
- w = Math.random()*100;
- h = Math.random()*100;
- var choice:int= int(Math.random()*2)];
- if(choice=0)graphics.drawEllipse (xp, yp, w, h);
- else
- graphics.drawRect(xp, yp, w, h);
其實[]語法是as3比較強大的一種功能,在很多時候使用起來是非常方便的。
[]語法讓我們可以使用字符串來調用as3函數,我們甚至可以利用[]語法寫一個as3代碼解釋器,讓as3代碼不經編譯而直接運行於swf中,
彷彿在flashplayer中運行了一個自定義的flashplayer,而這個自定義的flashplayer可以使用自己定義的語法,混淆效果當然沒得說(當然執行效率也會很低)。
附件AS3Player.swf就是這樣一個簡單的例子。
AS3Player.swf (2.64 KB)