1. 程式人生 > >自己動手豐衣足食-自己動手修改GBA ROM遊戲檔案

自己動手豐衣足食-自己動手修改GBA ROM遊戲檔案



   好了,我們開始,首先我們來學習怎麼找或者說製造VisualBoyAdvance模擬器用的金手指,因為只有會找金手指程式碼了才能進行下一步的ROM修改。示例遊戲是《牧場物語:礦石鎮的夥伴》




   現在的錢是500,選擇選單欄中的 修改→搜尋修改 






   按照圖片上的設定來,然後點 開始→搜尋





   出來一個結果,有時候會出現多個結果,這時候只能去買點東西讓數值變動重新搜尋,好在GBA遊戲比較簡單資料比較少,不會出現PC遊戲一個數值幾百上千個結果的事情,可能也是我這個存檔是遊戲剛開始,所以干擾資料比較少。





   然後選擇“新增程式碼”





   然後選擇 修改→修改程式碼列表 





   就能看到金手指了


   



   金手指已經生效,錢被修改成了800。此時要記下“修改程式碼列表”裡的地址“020068b4”這就是儲存金錢的地址,這個地址下儲存著金錢數“320”這是個16進位制數,換算成10進位制正好是800,不清楚的人可以自己用WINDOWS的計算器點“檢視”切換成程式設計師來換算。做到這一步就可以關閉VBA模擬器了,現在開啟NO$GBA1.4C。



   


   首先選擇 設定→模擬器設定 然後按照下圖設定按鍵





   用滑鼠點一下游戲畫面才能開始操作遊戲


   


   在紅框框內 右鍵→GO to...


   
   
   然後再對話方塊內輸入剛才找到的地址,輸入完後點OK


   


   點選OK後跳轉到了游標所在的地址,我此時遊戲內的金錢是1600,換算成16進位制數是“640”,但這裡顯示的是4006是怎麼回事呢?這涉及到一個大端小端問題,弄過80x86彙編的人會知道,這裡就不展開來說,這裡用的是小端模式,計算機的資料都是以位元組為單位顯示的,一個位元組簡單來說就是兩個數字“00”,所以1600的16進位制也可以寫成“0640”,小端模式就是要把資料按位元組為單位前後顛倒,本來從左往右讀的改成從右往左,兩位兩位的讀,故改成“4006”。然後我們用快捷鍵Ctrl+B,然後在彈出的對話方塊中輸入 [020068b4]!


   



   來設定條件斷點,讓遊戲訪問這個地址裡的金錢資料時斷下來,我們就能知道是那一段程式碼在訪問這個記憶體地址,然後我們買個東西,花點錢讓程式碼段訪問以下這個地址


   


   


   買一袋種子後斷在了紅框框處,現在按一下鍵盤上的"Delete"鍵刪除[020068b4]!這個斷點。這一句我們不用理他,看這一句的上面一句


   


   sub是減法 這一句的意思是,r0暫存器裡的值- r1暫存器裡的值結果放回r0暫存器。r0=r0-r1


   


   我們在這一句上下一個斷點,就是點一下這行末尾出現“BRK”就說明斷點已經設立,然後買個120G的東西,又斷下來了,我們看r0和r1暫存器此時的值


   


   r0為640就是10進位制的1600;r1是78就是10進位制的120。所以我們只要編輯這行程式碼讓它由減變加,就能實現買東西反而倒找錢的功能了。在下了斷點那行再點一下,"BRK"消失,取消斷點,然後在此行上右鍵選擇“Change Instruction”來修改程式碼




   


   修改成add r0,r0,r1,然後確定


   


   然後我們用滑鼠點選一下游戲畫面,讓遊戲跑起來


   


   因為我們在買的時候斷下,修改程式碼後重新執行,此時遊戲邏輯已經改變,現在錢變成了1720正好是1600+120,但是此時我們要把程式碼改回去,為何呢?因為這個偵錯程式是無法儲存我們的修改的,我們得改回去然後用之前提到的16進位制檔案編輯器來查詢到這段程式碼,再修改後才能儲存。改回去後記住紅框框內的4個位元組。


   


   我們要記下圖片中的這4個位元組:1C211A40,然後轉換成小端形式:211c401a,然後我們用UltraEdit開啟 牧場物語.gba 檔案


   


   然後在這裡按Ctrl+F搜尋字串:211c401a 
     
   


   看我們找到了,如果怕不是這個我們可以再搜尋一次就會出現


   


   說明這4個位元組的組合是唯一的


   


   我們要把sub修改成add,也就是要把 211c401a 改為 211c4018,選中a,用鍵盤改它為8,然後儲存退出就修改成功了。此時把這個ROM檔案拖入任何一個燒錄卡,任何裝置的GBA模擬器,修改都會生效,沒有金手指也能縱橫GBA世界。修改GBA ROM主要就是找SUB或ADD語句,下面再以機戰OG2為例子,說一個用加法實現減錢效果的程式碼的修改。有時候程式碼實現減法不一定會用SUB而是用ADD,用一個正數加上一個負數也能實現減法。