[原創]swf檔案的反編譯入門

看雪資料發表於2004-08-03

/*------------------------------------------------------
作者:WiNrOOt[FCG]
使用工具:flasm  http://www.nowrap.de/flasm.html
          UltraEdit
          Sothink SWF Decompiler
目的:讓帶有伺服器校驗的swf能在本地播放(主要目的還是希望各位高手有所指點)
目標:**工碩數學輔導swf檔案
--------------------------------------------------------*/
     大家好!我是WiNrOOt,菜鳥一個。
     各位大蝦見笑了,小弟在這裡說一下關於如何使帶有伺服器校驗的swf能在本地播放的問題。
對於各位高手來說很簡單,但是對於我這個外行人來說還是花了一點時間的。
==========================================================================
最近我需要一些教學資料,就上網找發現xdf的flash不錯,非常喜歡!呵呵就在bt上下了一些
發現資料不全,就萌生了破解之意!於是就對flash破解產生了興趣,但是對flash一竅不通就從頭學起。
正好一位朋友的**工碩數學輔導swf檔案(不是xdf)在本地不能播放,於是我們就開始了.......


1.swf檔案結構(轉貼一點)
先看一下官方的swf檔案格式說明在看就明白了
http://www.half-serious.com/swf/format/
******************************轉貼部分*************************************************
swf檔案的整體結構是 header + body的組成。
檔案的開始是一個[檔案頭]
它的結構如下:
位元組       名稱                     說明
 1      Signature     “F”表示非加密格式,“C”表示加密格式 
 1      Signature     “W”無特殊意義 
 1      Signature     “S”無特殊意義 
 1      Version        版本號,它表示對應播放器版本 
 4      FileLength     整個檔案長度,低位在前 
 N      FrameSize      RECT結構體,表示螢幕大小,具體結構和長度根據資料變化,分析方法另外討論。 
 2      FrameRate      幀頻,預設為12,高位在前 
 2      FrameCount     幀數,表明檔案根下的幀數,低位在前 

每一個tag都包括一個頭和一個資料體,頭有2種型別,短tag型和長tag型。
短tag型由2byte構成,前10個bit表示tag型別,後6個bit表示tag長度。
長tag型由6byte構成,前10個bit表示tag型別,後6個bit固定為全1,後4個byte代表tag長度。
tag的長度不同於檔案頭的長度FileLength,它是除去tag頭後的長度。

swf檔案是由1個head和1個body構成的。
下面餘下的就是swf檔案的body了。
整個檔案body是由大量的tag組成的,透過分析tag的head部分,可以立刻知道這個tag的型別程式碼和長度。
如果你無法識別這個tag的型別,也可以利用tag的長度,直接跳過這個tag。
這種方式保證了版本的相容性,即使出現了新的tag,老版本的播放器還是能夠解析完整個swf檔案而不出現錯誤,大不了就是不能提供新的功能而已。
以下就是swf檔案結構的一個形象概念。

(檔案header)(檔案body) 
              | (tag 1)(tag 2)(tag 3)(……) 
                  | (tag header)(tag body) 
                       | (tag 型別程式碼)(tag 長度) 
******************************轉貼部分*************************************************
補充一點
tag分為兩種Definition Tags 和Control Tags
Control tag又被分為: Display List tags Control tags 和Action tags 
個人理解:Definition Tags就是存放所有的資源
          Control tag就是存放控制程式碼
透過以上了解我們知道,關於校驗的資訊一定存放在Action中
開始幹活...........
用Sothink SWF Decompiler反編譯
看看Action--------〉MainMovie
哇哈哈哈哈你才我們看見什麼了(菜鳥的表現)

程式碼:
// Action script... // [onClipEvent of sprite 1 in frame 1] //Component construct() {     FV_AcceptedURLs_array = [];     FV_AcceptedURLs_array[0] = "www.****.cn";     FV_AcceptedURLs_array[1] = "www.****.net";     FV_AcceptedURLs_array[2] = "www.******.com.cn";     FV_AcceptedURLs_array[3] = "www.******.net.cn";     FV_AcceptedURLs_array[4] = "www.******.cn";     FV_AcceptedURLs_array[5] = "www.******.net";     FV_AcceptedURLs_array[6] = "www.******.com";     FV_AcceptedURLs_array[7] = "www.******.com";     FV_AcceptedURLs_array[8] = "www.******.net.cn";     FV_ExactURL_bool = false;     FV_AllowFromHDD_bool = false;     FV_ShowWarning_bool = false; } // [onClipEvent of sprite 1 in frame 1044] //Component construct() {     FV_AcceptedURLs_array = [];     FV_AcceptedURLs_array[0] = "www.****.cn";     FV_AcceptedURLs_array[1] = "www.****.net";     FV_AcceptedURLs_array[2] = "www.******.com.cn";     FV_AcceptedURLs_array[3] = "www.******.net.cn";     FV_AcceptedURLs_array[4] = "www.******.cn";     FV_AcceptedURLs_array[5] = "www.******.net";     FV_AcceptedURLs_array[6] = "www.******.com";     FV_AcceptedURLs_array[7] = "www.******.com";     FV_AcceptedURLs_array[8] = "www.******.net.cn";     FV_ExactURL_bool = false;     FV_AllowFromHDD_bool = false;     FV_ShowWarning_bool = false; }

//為了避免不必要的麻煩這裡隱去網站資訊


大家注意FV_AllowFromHDD_bool = false;
我是傻瓜,但我知道它定義了一個變數,讓它等於false
變數名是什麼?AllowFromHDD允許從硬碟播放?
呵呵,我很懶的~~~~大家都知道
所以我們就只要修改FV_AllowFromHDD_bool = true就能看了(猜想)
可是怎麼才能修改呢?Sothink SWF Decompiler是不能修改的(也許我沒找到^_^)
我們請出今天的主角:flasm  http://www.nowrap.de/flasm.html
先來看一下幫助
程式碼:
flasm command filename  command -d   反編譯 SWF檔案到控制檯(cmd) -a   編譯Flasm project -u   更新SWF, replace Flasm macros(看不懂) -z   壓縮SWF with zLib -x   解壓縮 SWF -d foo.swf Disassemble foo.swf to the console.  -d foo.swf > foo.flm 反編譯foo.swf儲存到foo.flm. 最簡單的方法 flasm foo.swf 建立 foo.flm 到相同的資料夾.  -a foo.flm 編譯 foo.flm and 更新 在SWF 檔案中的定義。 建立備份 .$wf .  -u foo.swf 反編譯foo.swf 到臨時檔案. Execute Flasm macros embedded in SWF. Make trivial optimizations automatically: remove double nots, replace 0.0 with 0, rebuild constant pools, clear register arguments. Create .$wf backup, update the original SWF.  It's a good idea to update the final version of SWF with flasm -u. Don't expect the SWF to be noticeably faster, it will just make it a bit smaller.  -x foo.swf Decompress foo.swf, create .$wf backup.  -z foo.swf

大概翻譯一下(後面的看不懂)
呵呵我們可以看到有2個flasm command我們需要
-d反編譯
-a編譯一下
呵呵,開工!!!!!!!!!!!!!!
執行cmd找到flasm所在的資料夾flasm -d 07.swf > 07.flm(或者flasm 07.swf) 
看一下flash所在的目錄生成了一個07.flm的檔案
然後用UltraEdit開啟--替換“FV_AllowFromHDD_bool = FALSE”為“FV_AllowFromHDD_bool = TRUE”
儲存!
就緒flasm -a 07.swf
07.flm successfully assembled to 07.swf, 2829511 bytes
呵呵,執行一下,ok了~~~
===========================================================================
其實這篇文章非常簡單,各位高手不要笑偶~~~~
呵呵,但是對於混亂器的東東,我就不知道怎麼弄了
希望各位高手指點~~~~這裡向您請教,希望哪位高手能指點一二
(宣告:本人只是用來研究,並無其它商業目的)
                                                           WiNrOOt[FCG]
                                                          17:21 2004-8-3
                                                  e-mail:     winroot@gmail.com
                                                    blog:    http://blog.csdn.net/winroot

相關文章