ASM Hack 初步 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
ASM Hack 初步
本文版權屬於作者Alan Yang.
這是Alan Yang發給Edison的一封信。詳細介紹了用zsnes進行ASM hack的過程,是學習ASM hack的一篇好教程。
首先你要對Snes的彙編指令有一定程度的瞭解。參考我發給你的文章。
在你能大致看懂程式40%時,才能開始。
很多位址有特殊意義,參考yoshi的snes軟體件寄存器snes.1.txt
跟蹤工具我用的是Zsnes DOS 版,我覺得還算方便,
Snes9x也有一個特殊版,功能更多,不過我沒仔細研究。
好,進入正題。找腳本顯示程式哪可能那麽順利,就算給你看
高階語言根源程式都很難順利找出,asm當然更費力,一定要
耐心。我大概說說我的asm hack過程吧。
首先,進入遊戲,到大地圖上。把游標移到利夫王子上面一格,
(這時只要按“下”,就會顯示利夫的名字和HP)。存一個進度。
用zsnes -d 776.smc開始debug. 按F4調入進度,按1不跟蹤sound,
然後狂按回車。此處肯定是個迴圈,一直等你按鍵了才退出,
所以你跟蹤幾遍應該就能找出循環體中最主要的部分,
一般是一大堆的副程式調用。(想想高階語言的主迴圈不也這麽寫?)
下面是我找到的主迴圈,當然注釋是後來加的。
00/9B00: E2 30 SEP #$30 主循環體
00/9B02: A9 80 LDA #$80
00/9B04: 8D 00 21 STA $2100 screen off
00/9B07: 9C 54 0F STZ $0F54
00/9B0A: A9 00 LDA #$00
00/9B0C: 8F 0C 42 00 STA $00420C close HDMA
00/9B10: C2 30 REP #$30
00/9B12: 22 7C 80 80 JSR $80807C write screen (游標移動及縮放)
00/9B16: 22 C4 AC 80 JSR $80ACC4 write screen (人物哆嗦,BG/地圖傳輸); but if $0345=0, quit
00/9B1A: 22 95 AC 80 JSR $80AC95 調整顔色,用HDMA,redraw using HDMA0-7(Not important) $C1
00/9B1E: 22 52 93 85 JSR $859352 $7E4F65=0,then return. <>0 ? (Not important)
00/9B22: 22 7D 8A 8E JSR $8E8A7D 設BG0-4的背景滾動,子螢幕位置,並存放在166b-167e (Not important)
00/9B26: 22 C3 80 80 JSR $8080C3 open screen,HDMA vertical refresh(顯示重繪後的螢幕)*
00/9B2A: 22 FA 8C 80 JSR $808CFA Enable interrupt.
00/9B2E: 22 02 80 80 JSR $808002 read joypad!(讀手柄輸入)
00/9B32: 22 D1 B0 80 JSR $80B0D1 $469 =1,$46A =3 *
00/9B36: 22 FB 83 80 JSR $8083FB ..set 1E00-1E1F=0(影響游標) *
00/9B3A: 22 0F A5 80 JSR $80A50F ..compute 寫功能表文字到顯存
00/9B3E: 22 DE B2 81 JSR $81B2DE ..compute(游標移動,BG3,回應鍵盤)
00/9B42: 22 DF A5 80 JSR $80A5DF ..complex compute(打開新螢幕後,恢復舊螢幕操作)*
00/9B46: 22 91 B2 81 JSR $81B291 ..little compute(背景滾動) *
00/9B4A: 22 82 AD 81 JSR $81AD82 ..little compute(背景滾動) *
00/9B4E: 22 1E B2 81 JSR $81B21E choose case($7E4F83) case 2 case 4 case 8x(根據游標位置決定BG3的位置)
00/9B52: 22 93 C3 83 JSR $83C393 ..compute(人物原地哆嗦) *
00/9B56: 22 CF C4 83 JSR $83C4CF ..compute(no effect) *
00/9B5A: 22 55 87 88 JSR $888755 ..compute(畫人物) *
00/9B5E: 22 18 C3 81 JSR $81C318 (no effect) *
00/9B62: 22 28 83 80 JSR $808328 (刷新間隔) *
00/9B66: 22 8A 92 80 JSR $80928A ..compte(no effect) *
00/9B6A: 22 96 B0 80 JSR $80B096 . (no effect) *
00/9B6E: 60 RTS
下一步怎麽辦呢?我先把第一個JSR $80807C換成4個NOP
也就是把22 7C 80 80改成EA EA EA EA,這樣實際上就是不執行第一個
副程式了。進入遊戲試試,發現游標不動了。那麽地一個子程式的功能
就是移動游標。以此類推,把所有副程式都試了,應該有一些發現。
先找到讀鍵盤輸入的副程式,很有用! 這裏是$808002
把這段程式看明白了,現在進入debug,按B,輸入808002,
程式會在$808002處停下來。單步跟蹤,
......
LDA $4218 讀手柄輸入
STA $E5
-------->>>>>>>>停在這裏!
.....
程式把手柄輸入的值存在$E4,$E5中。
查寄存器表可知,在$E5中值爲04時表示按“下”。
按M,輸入0000E5,回車,輸入04.
此時你已經類比手柄輸入了“下”鍵,下面的程式
是處理這個按鍵及顯示"利夫"的部分了!這其中必有
讀取文本代碼,並寫螢幕的程式。下面就是耐心加堅持了。
先按F2存檔吧。
如果你知道“利夫”的代碼存在哪里,那就簡單了,
只要觀察什麽時候程式會去取那裏的代碼,
就能抓到寫屏副程式。
可我還不知道功能表的編碼表,所以我利用了另一個工具,
BGmapper,他可以把zsnes存檔文件中的畫面顯示出來,
所以我按下T,輸入50000,這是讓程式執行50000條指令後
停下來。存檔,用BGmapper看看,字還沒顯示出來。
繼續。就這樣每隔50000條指令一存檔,直到“利夫”顯示在
螢幕上。找到最靠近它的存檔,開始每10000條存一次,
逐漸縮小範圍,到只剩500條就顯示出來的時候,開始
單步跟蹤,並試著看懂程式。此時一舉抓獲寫屏副程式
並可推測出功能表字元對照表。
呼,累死了,希望對你有用。 發表人 - jackkcg 於 2002/12/13 23:30:44
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |