【科普】製作FLASH遊戲修改器的一點小經驗

來源:互聯網
上載者:User

      其實這東西不止一次被科普過了。本文針對AS3且適用於AS2,AS2的人家都有修改器的。不過說起來修改FLASH遊戲,我這也只是初級方法,現在還在看flexsdk4.1裡面的fdb的源碼,呵呵。理論上應該可以找到更好的解決辦法——直接去修改二次編譯後的代碼,那樣就可以為所欲為了,咕~~(╯﹏╰)b。閑話少說,進入這次的正題,後面的“進階”東東以後再說,反正弄著玩嘛,又不指望這吃飯,興趣使然。

      有位老大爺說得好,工欲善其事必先利其器!建議往下看之前先搞個這:http://www.yogda.com/Yogda.1.0.564.zip 。 當然了,去首頁看看也挺好;要是你有閃客精靈、ASV啥的也行,呵呵。不過還是推薦我這。這東東嘎哈的不用說了,這丫的可以直接修改代碼……咕~~(╯﹏╰)b挺好挺強大。

一、必備工具

1、Yogda、閃客精靈、ASV6之一

2、WINHEX等十六進位編輯器

轉載請註明出處:http://www.cnblogs.com/zcsor

二、反編譯並修改

      先說最實在的,玩個遊戲也許一次過不去,下次就過了;不過要是十次過不去,並且有了相當的思考(自認為),那就有必要修改一下,但是不要去做壞事!接下來還是說實在的,知道用什麼工具了,稍微瞭解一下文法規範就能幹很多事情。也許不需要講。不過還是細說一下。

1、反編譯誰?

簡單的在時間軸上寫幾句:

var _w:int = 60;
var _h:int = 60;
var gr:* = graphics;
gr.clear();
gr.lineStyle(1, 0x999999);
gr.beginFill(0xFF00FF, 0.4);
gr.drawRect(20, 20, this._w, this._h);
gr.endFill();

然後匯出。咋看那個邊緣咋不清晰,給他改成黑的!(嗨嗨,別回去改代碼,咱今天自己和自己過不去,繞遠!)

2、反編譯自己!

用你選擇的反編譯器開啟匯出的SWF,Yogda則依次展開左邊的樹,來到這裡:

Public function _fla:frame1();

看右面(我只是右鍵複製的):

function 0000 *():
 {
 
    // Max stack    : 5
    // Local count  : 1
    // Scope depth  : 10
    // Max Scope depth  : 11
    // Exception Count  : 0
    // Trait Count  : 0
    // Code Length   : 65 bytes.
 
 
       0  getlocal0
       1  pushscope
       2  getlocal0
       4  pushbyte 60
       6  initproperty _w
       7  getlocal0
       9  pushbyte 60
       11  initproperty _h
       12  getlocal0
       14  getlex graphics
       16  initproperty gr
       17  getlocal0
       19  getproperty gr
       22  callpropvoid clear,0
       23  getlocal0
       25  getproperty gr
       27  pushbyte 1
       29  pushint 1
       32  callpropvoid lineStyle,2
       33  getlocal0
       35  getproperty gr
       37  pushint 2
       39  pushdouble 1
       42  callpropvoid beginFill,2
       43  getlocal0
       45  getproperty gr
       47  pushbyte 20
       48  dup
       49  getlocal0
       51  getproperty _w
       52  getlocal0
       54  getproperty _h
       57  callpropvoid drawRect,4
       58  getlocal0
       60  getproperty gr
       63  callpropvoid endFill,0
       64  returnvoid
 }

 轉載請註明出處:http://www.cnblogs.com/zcsor

看見紅的那幾行了吧(當然你編輯器上不是紅的,看行號,要是沒紅的,看下面),就是gr.lineStyle(1, 0x999999);反編譯的結果了,0x999999呢?除了byte,bool類型,其他的一般都被索引代替了,可以翻看左面的Integers,裡面依次有編號,但是編號和這裡的編號不對應,應該+1。 不扯遠了,再次對比:

gr.lineStyle(1, 0x999999);

就是:

       23  getlocal0
       25  getproperty gr
       27  pushbyte 1
       29  pushint 1
       32  callpropvoid lineStyle,2

註:前面的數字不是行號,是位元組號。

翻譯一下,注意對照看ABC:

23,其語義應理解為This.

25,Gr.

27,咱就不說堆棧,參數1

29,咱還不說堆棧,參數2

32,調用

前面的倆參數,是給後面調用用的。很明白了吧。所以,我們想把這鬼子丫的改成清晰的黑框子,很易:

雙擊29那行,修改為pushbyte 1,點OK儲存。然後小滑鼠輕點工具列上內儲存按鈕,重新運行那個new.swf,丫的黑了吧!

 

很易是不,不過還得說,我們還得用WINHEX,因為我習慣於WINHEX,直接CTRL+ALT+X尋找一串標誌性的16進位,然後去編輯——2D 01改為24 01……暈了吧,開個玩笑。

 

三、線上的FLASH怎麼辦?——純屬技術討論

      之所以用WINHEX,是因為我們要找到修改的位置相對於整個SWF檔案的位移量。所以個人覺得,熟悉了之後,用反編譯工具看一眼,然後直接WINHEX比較好——上面明明白白的寫著位移量,還可以複製選擇內容為N種語言代碼,不過丫的沒有VB的,哈哈。

1、提取SWF來反編譯:對,還有一個頭疼的事,很多時候我們用盡各種辦法,試了無數工具,發現SWF沒有被下載到硬碟上……其實真是活見鬼了,那麼簡單的事都讓大家搞複雜了,解決方案前面文章裡我已經做好了——爆破記憶體中的SWF那篇,裡面有工具,只是使用時記得注意:多標籤瀏覽器的SWF一般不在和你標題一樣的那個進程裡,例如瀏覽器名.EXE有N個,其中不帶啟動視窗標題那個傢伙卻正是我們要搜尋的。

2、之後,當我們記下在什麼位置,修改成什麼樣(好的做法應該是還記錄原來什麼樣,並在修改前校正),就可以修改了——只是這次是在記憶體裡。

註:對混效過的SWF反編譯的話,建議用ASV,它提供了一個將混淆後名稱進行“反混淆”的功能,不過丫的只是把方框變成字母數字表示,要想看明白,還得自己動手!另外,這個修改需要在虛擬機器解釋ABC代碼之前,原因和方法留給大家吧,很簡單,別想複雜了!

轉載請註明出處:http://www.cnblogs.com/zcsor

=======================================================================================
以下需要工具:
flexsdk4.1 (adobe有下)
debug 版本的 flashplayer 或 ax 控制項 (adobe有下)
XJad (自己搜尋吧,或者你手頭有java反編譯工具)用的時候點檔案—反編譯jar檔案
eclipse (不是必須的,java編輯器而已,用記事本也能看,不過還是有高亮文法顯示看起來容易些)
=======================================================================================

四、掛接調試器,解決更多問題!
      用過FLASH的都知道,FLASH提供了調試功能,這個debugger被公開在flexsdk裡面,我看的是4.1版本的,在裡面有個fdb.exe,完全可以拿來就用,不過需要對你的flashplayer或者ax控制項進行一點更改:到adobe去下載對應的debug版本。這樣,只需要運行fdb.exe並輸入run,就會進入等待。當用debug版本的flashplayer或網頁開啟一個SWF時(當然需要安裝了debug版本的ax控制項,無法正常安裝時可到c:\windows\system3\micromedia\執行卸載程式——先關閉所有頁面,看到flash*.dll消失了,證明卸載成功,否則可以關閉瀏覽器再試)fdb的介面上就將顯示對應提示。當然,想要使用這個命令列版本的工具還需要仔細看它的協助檔案。其斷點功能就是我們所需要的——而且非常“貼心”——它支援函數名作為斷點。當然,如果你使用了一個非debug版本的SWF那麼就可能需要對它做點小手術!這樣,我們通過在一些位置下斷點,就可以取得任何你想要的東西——但是還是沒有前面所說的修改二次編譯後的ASM過癮——那將讓我們進入熟悉的WINDOWS運行環境讓我們可以為所欲為——例如send個message啥的呵呵。又扯遠了,對於控制台應用程式,我們可以重設其輸入輸出資料流,從而得到其輸出資訊。這個內容可以參考象棋魔法學校那一篇,那裡用到的與引擎通訊的技術就是了,或者你可以直接去看MSDN提供的源碼——那非常清晰。

轉載請註明出處:http://www.cnblogs.com/zcsor

五、仔細閱讀~fdb.jar源碼,可以得到更多
      只是一個建議,這將耗費大量的時間和精力——如果對你而言這隻是一個工程而不是你的一個知識架構的組成部分,那研究它就得不償失了。但是如果想實現更“厲害”的修改器,恐怕要研究而且要灰常研究。
轉載請註明出處:http://www.cnblogs.com/zcsor

 

再說明一下,之所以用Yogda,主要原因還是他可以直接修改並儲存檔案,這樣完全可以把SWF爆破出來之後進行修改,在它沒有被虛擬機器編譯的時候替換它!那就可以省去記憶體部分的一些代碼,而且把握也比較大——尤其是對新手而言,可以減少很多因為馬虎而引起的修改不成功的問題。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.