全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2087
推到 Plurk!
推到 Facebook!

ASM Hack 初步

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-13 18:26:56 IP:61.221.xxx.xxx 未訂閱
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
系統時間:2024-05-05 21:58:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!