還是談談自己一直在做的一個應用:flash加密及混淆。從去年8,9月份開始研究。先是研究swf的檔案結構,然後是abc的結構。慢慢也明了swf運 行的原理。特别是研究abc結構後,收獲很多。然後在寫as代碼的時候會聯想到這些會編譯後對應的指令。比如 var a:Number = 3。對應指令就先在local資料中設定一個空間:null,接着一個指令将該空間轉換為Number類型,然後添加一個byte資料3到scope,最 後才是指令将3複制到給先前的空間。a字段是不會被編譯進去的,這就是為什麼用編譯軟體看到的臨時變量都不是原先的名稱;再引申下,你可以盡量明了的命名 臨時變量,比如:var theFirstValue:Number = 0, 而不用var b:Number = 0。很明顯theFirstValue很适合閱讀,而且反正也不會編譯到swf中去,不用擔心太長而增加swf體積。
接下來自己便開始做 加密。先想到的是加殼的方法。後來和别人一交流,才發現,這種方法其實已經早已不是什麼新想法了。隻要你研究寫swf的檔案結構,就很容易想到這個方法。 雖然後來想久,嘗試很久,還是沒有更好的加密方法。其實對于swf而言,已沒有加密可言。除非借助與第三方互動。或者adobe自己的人去加密——畢竟 swf檔案結構白皮書公布的資訊隻是一部分而已。是以,最好還是混淆。
加密完成之後,我就開始研究混淆。研究過abc結構的人,應該都很 清楚:要混淆一個方法、一個類名其實很容易。比如你有一個類ABCD,這時候你隻要在abc資料中找到這個ABCD,替換為你想混淆成的樣子,比如 aaa1。重新組裝abc,就完成了混淆。但是如果你有一個類alpha呢?你将alpha混淆成aaa1了。然後你會發現你的代碼:(new MovieClip).alpha = 0.3;變成了(new MovieClip).aaa1= 0.3;——swf是一個高壓縮的檔案格式,abc也是如此。它不可能為同一個字段儲存兩字。也就是說你的類名alpha和屬性alpha引用的是同一數 據,當這個資料被改變是,一切引用該資料的地方都改變了。于是,你需要一個操作:将不混淆字段複制。就上面這個例子:将alpha資料複制一份給“new MovieClip”使用,而類alpha使用的一份進行混淆。
好,這樣完成了一小部分。但是還會有問題。比如你從伺服器接受了一個xml資料:
<root>
<title>best wish to demi</title>
</root>
然 後你會通過xml.title來得到這個資料。但是你恰恰這個時候有類方法:public function get title():String。然後你混淆了title為aaa1,然後xml.titlt變為xml.aaa1了,就擷取不到資料了。于是又涉及到一個 問題了:特殊字段。還比如:
getDefinitionByName(”MainAPP”); MainAPP是特殊字
ExternalInterface.call(”eval”, “alert(’asdf’);”); eval是關鍵字
等等。有了這些特殊字和copy字段後,就可以進行大力混淆了。當然本人研究也是有限,很多情況沒有遇到過,是以肯定會漏掉一些情況。
以上隻是自己的對加密和混淆的一些心得。有不對的地方,敬請指正。
<a href="http://www.laaan.cn/?p=792">介紹幾個開源協定【摘】</a>