標籤:http io os 使用 ar strong for 檔案 資料
本來打算下班回來就寫這個東西,一方面算是對今天學習的一個筆記記錄,另外一方面,給一些朋友普及一些swf檔案加密基礎知識。之所以說是基礎,那是因為我也是剛學習了一點,灰常的基礎。不過晚上看了一會我是傳奇的視頻耽誤了,話說郭德綱老是調戲謝楠,難道有基情?不解釋,呵呵……
在說明加密解密方法之前,先解釋一些理論方面的東西,很草根。
swf加密的目的。其實無論是flash的swf檔案加密,還是其他各種加密,目的都是很簡單,就是私心,不想泄露具體檔案細節。當然這也是大環境趨勢,在中國很多拿來主義,大家懂得。swf檔案的加密,主要目的我分為兩個: 1.flash代碼加密,比如商業遊戲的代碼,被盜用總是不好。 2.flash素材加密,防止被一些工具破解盜用,用flash做動畫的朋友應該深有體會。
檔案格式。什麼是檔案格式,百度百科是這樣介紹:檔案格式(或檔案類型)是指電腦為了儲存資訊而使用的對資訊的特殊編碼方式,是用於識別內部儲存的資料。簡單點理解,所有的檔案都是位元據,而特定格式的檔案(比片檔案、視頻檔案等)都是按照一定規律排列的位元據,只不過後面會加類似“.swf”這樣的尾碼加以辨識。 這樣的話,針對上面swf加密目的,加密的理論方法自然就誕生了。
swf加密的方式。 如果是
加密代碼,那麼就用一些工具做代碼混淆,降低可讀性,即使破解了,也看不懂,那就白破解了。網上有一些工具比較適用,比如doswf。 如果是
加密素材,那就需要破壞檔案,讓破解工具無法解析資料,這樣就能保護檔案。破壞檔案,就是破壞位元據,破壞上面所說的檔案格式。當然也不能隨便破壞,因為一旦檔案破壞,不但別人無法破解你的檔案,自己的檔案也無法正常運行,就本末倒置了。所以,需要有規律性的破壞,這個破壞方式也就是一些
密碼編譯演算法。 那麼,現在自己的檔案是被加密被破壞了,但是也沒法用了,為了達到正常使用的目的,我們需要另外一個程式,即是
解密演算法。解密演算法是跟密碼編譯演算法正好相逆,一個破壞檔案,一個修複檔案,以達到正常使用的目的。 (註:前面的幾段還是上周六寫的,後來不小心,腳被石頭砸了一下,雖說沒有血肉模糊,但還是比較疼,這裡也提醒各位朋友,懷裡揣著石頭的,該放的時候早放,放晚了,就砸腳了……繼續接著寫吧) 所以,目前我能想到的加密方法是,子檔案要同時做混淆代碼和加密檔案兩個步驟,而主檔案內,要帶有解密代碼,同時要混淆這一段代碼,防止被破解。 用一個小例子示範一下。這裡我先用flash隨便做個小動畫,裡面是一張圖,產生的檔案我命名為“未命名-1.swf”。這裡,這個小動畫就是子檔案,現在我要對它加密。 現在建立一個類
EncryptTool.as,他的作用就是對這個動畫
加密。這裡要注意的是,因為要加密檔案,就會涉及本地檔案讀寫操作,普通flash player是不支援的,需要建立AIR工程運行。 摘取部分代碼解釋一下加密過程。 _urlLoader = new URLLoader(); _urlLoader.dataFormat = URLLoaderDataFormat.BINARY; _urlLoader.addEventListener(Event.COMPLETE, loaded); _urlLoader.load(new URLRequest("未命名-1.swf")); 上面這段代碼意思就是把這個動畫以位元據方式載入讀取,然後載入完成後,會觸發下面這個方法。 private function loaded(e:Event):void { _urlLoader.removeEventListener(Event.COMPLETE, loaded); var data:ByteArray = _urlLoader.data as ByteArray; //用位元組保持讀取的資料 var key:String = "this is a test"; //我們設定密碼key為這串字元 var keyBytes:ByteArray = new ByteArray(); keyBytes.writeObject(key); //把這串字元轉換為位元組 //下面就是密碼編譯演算法 var p:int = data.length / 2; //擷取未經處理資料中間的位置索引 var b1:ByteArray = new ByteArray(); for(var i:int = 0; i < keyBytes.length; i ++){ b1.writeByte(data[i + p] ^ keyBytes[i]) } //上面的這段迴圈,主要意思是,把密碼資料跟未經處理資料做一次運算,即從未經處理資料中間位置,取跟密碼資料相同位元組數的資料,他們做一次異或運算,然後把運算結果儲存到一個位元組中。 //不知道什麼是異或運算的,百度一下,其實我也是剛查的…… data.position = p; //把未經處理資料位置調整到中間位置 data.writeBytes(b1); //從中間位置,把剛才運算後的資料全部替換進去 //上面中間就是加密的過程,這個稍微有點麻煩了。也有更簡單的,比如把首位位元組對調等等。 //上面資料加密過了,現在需要把這串加密後的資料儲存成一個檔案,為了方便,依然儲存為swf檔案。 var file:File = new File("C:/Documents and Settings/user/案頭/加密解密/DecryptTool/src/mc.swf"); var fs:FileStream = new FileStream(); fs.open(file, FileMode.WRITE); fs.writeBytes(data); fs.close(); } 好了,上面已經儲存一個加密後的檔案了,也就是對應檔案夾裡面的“mc.swf”,雖然看起來還是普通的swf動畫檔案,但是如果你直接開啟,會發現,什麼都沒有,一片空白。這個時候,再嘗試用閃客精靈之類的破解軟體破解這個動畫,會彈出“檔案被破壞”的提示。沒錯,檔案被破壞了,被加密,當然無法破解。 檔案被加密了,但是也沒法正常運行了,這個時候,就需找在使用的地方對它進行
解密了。建立一個類
DecryptTool.as,這個不需要AIR工程,普通正常就行。現在假定這裡需要使用這個動畫,那麼,解密開始。 同樣,首先得把加密後的檔案以位元據方式載入進來。 _urlLoader = new URLLoader(); _urlLoader.dataFormat = URLLoaderDataFormat.BINARY; _urlLoader.addEventListener(Event.COMPLETE, bytesLoaded); _urlLoader.load(new URLRequest("mc.swf")); //載入完成後,觸發下面這個方法 private function bytesLoaded(e:Event):void { _urlLoader.removeEventListener(Event.COMPLETE, bytesLoaded); var data:ByteArray = _urlLoader.data as ByteArray; //同樣,儲存讀取的資料,這是加密後的 //下面的解密運算,跟加密運算方式一樣,原因是異或運算,逆向運算跟之前的看起來沒有任何區別 var key:String = "this is a test"; var keyBytes:ByteArray = new ByteArray(); keyBytes.writeObject(key); var p:int = data.length / 2; var b1:ByteArray = new ByteArray(); for(var i:int = 0; i < keyBytes.length; i ++){ b1.writeByte(data[i + p] ^ keyBytes[i]) } data.position = p; data.writeBytes(b1); //上面得到的是解密後的資料,這是完整的資料,跟之前讀取的"未命名-1.swf"的資料時一模一樣的,因為這個步驟就是還原資料的作用。這個時候,如果你把這段資料儲存為一個swf檔案,會發現這個檔案能正常使用,位元影像什麼都正常顯示,跟之前的源檔案沒有任何區別。 //得到完整資料後,用Loader讀取這段位元據,注意下面加粗的這幾行代碼,很重要,否則會報錯說不支援swf。 _loader = new Loader(); _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded);
var lc:LoaderContext = new LoaderContext(); lc.allowCodeImport = true; _loader.loadBytes(data, lc); } 上面讀取資料完成後,繼續出發下面的這個方法。 private function loaded(e:Event):void { _loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loaded); var mc:MovieClip = _loader.content as MovieClip; addChild(mc); } 上面的這個程式就是從位元組中,通過Loader,得到一個影片剪輯,此時,程式中的動畫可以正常播放了,說明解密成功。 加密解密的基礎思路就是這樣,當然,別忘了對解密代碼做混淆操作,要不然,無用功都白做了。如果不混淆也行,只要不懂代碼,只靠一個閃客精靈,是破解不出子檔案的素材。 代碼混淆,暫時還未實驗,不做示範了,下載工具自行摸索吧。 加密不是萬能的,肯定會有大牛能解出來。不過,利用這點基礎,防防小菜鳥跟個別破解工具還是可以的。道高一尺,魔高一丈,加密之路永無止境。 順便吐槽一下新浪部落格,沒有插入代碼的功能,結果自己手動排版代碼浪費很多時間。
swf檔案加密基礎(轉)