其實這東西不止一次被科普過了。本文針對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爆破出來之後進行修改,在它沒有被虛擬機器編譯的時候替換它!那就可以省去記憶體部分的一些代碼,而且把握也比較大——尤其是對新手而言,可以減少很多因為馬虎而引起的修改不成功的問題。