開篇 - 來個低級語言的 MC68000匯編 大航海時代2 全村落 MD ROM的 HACKER
最近心血來潮,看到MD的大航海時代2 ROM,勾起了很多記憶。一直想要周游全世界,仗劍走天涯,看一看世界的繁華,只奈沒錢,沒時間。
只能回憶當年玩MD大航海時代2的時候的美好時光,因為當年一心想要發現全世界的發現物,但是后來發現是不可能的,開局隨機的,一直想要解決這個問題,今天決定HACKER一下這個ROM。
目標:大航海時代2 全村落 探索 MD ROM 靜態 HACKER
工具:IDA ,REGEN,MESSUI
要求技術:懂一點摩托羅拉MC68000的匯編
找到ROM,大航海時代2純中文版原版.smd ROM ,感覺這個比較純,雖然當年玩的都是日文版,那就以這個開始吧。
接下來咋整? 直接運行ROM? 找初始化代碼? 沒有思路?
看來要找到初始化村落的內存地址,地址怎么找? EC代碼呀,去看看有沒有,果然發現了 EC代碼,說 5C25=64 ?啥意思呢
就是說把內存地址: 5C25 SET 為64(16進制),那么說干就干
下斷點: messui 工具下斷點:
wp ff5C25,2,w

查看一下內存的內容:
注意內存查看要加上 ff5c25

注意看內存:
ff5c15 都FFFF 的,大膽猜測: ff5c1E 為村落內存開始數據: ff5c1E
剛才運行系統運行到2個斷點:

先放過,ROM開始初始化,再次查看內存

經過N次測試,花了N多的時間,發現
00A8 010E 000A 8400, 這組數據 一個村落的顯示,第一村落應該是英國的石蹲,00A8 010E應該為經緯度,具體算法沒有去跟蹤,8400 這組數據
8表示無法發現,6表示已經發現,0表示可以發現。
那么再次下斷點:
wp ff5C24,1,w
進行寫入下斷點,終於跟蹤來的關鍵代碼位置,(當然,這個里面花了N多時間),數據初始化是人物在選擇確定后,進行是否能否的初始化工作的。等下貼反匯編代碼
定位到關鍵代碼,用IDA工具:

 第一行   
 A2就是我們斷點鎖定的位置,直接初始化設計為 8X,剛才說過 8表示是無法探索到的,
后面二行是進行循環初始化,一共是 98個村落,
    
然后產生隨機數據,選擇
 50個村落設置為可以探索到。
修改思路:
思路1、直接把初始化村落設置為98個,測試發現死循環。 應該是隨機數設定的問題,可以修改指令跳過。 感覺比較麻煩。
思路2、 能否直接初始化的時候設置為全部可以探索,再隨機設置5個保留(可能有國王尋寶的任務)。這個思路應該修改的代碼比較少。
我這里采用思路2方式:

ori.b #$80,6(a2) 修改為 andi #$0,(a2) ,
cmpi.b #$32,d2 ; '2'
32修改為5,下面還有跳轉的驗證,可以跟蹤指令一一去掉,如果遇到死循環,可以單步調試。
修改指令工具可以用:

直接用16進制修改指令, 另外
 
這2出也要注意處理一下。 可能存在跳轉問題。
好,hacker 基本結束。CRS修正不要忘了。
另。我放上我的修改后的ROM:
