Nw BBS 壬天堂世界

 找回密码
 注册
搜索
热搜: 资料集合
查看: 35911|回复: 59
收起左侧

[金手指] GBA ROM修改详解 (原作者授权刊登)

[复制链接]
发表于 2004-8-14 00:11:13 | 显示全部楼层 |阅读模式
转载请注明以下信息:

原载于掌机王SP Vol.1 部分内容有修正
■■■┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅★☆
■○→原作者:NW旅团ransoma
■◇→出 处:掌机王SP Vol.1
■■■┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅★☆


一. 准备工作
修改工具必不可少,修改ROM必备DEBUG工具。本人文中使用的是NO$GBA 1.4C破解版,UltraEdit(后文简称UE),VBA模拟器必备,EMUCHEAT。
说明:NO$GBA是针对GBA ROM进行调试的DEBUG工具,UE是对ROM进行修改的十六位编辑器,VBA和EC作用主要是查找金手指,将查找的结果用于NO$GBA的断点设置。有时候手头有现成的EC码,就可以省略查找这一步骤。

二. 修改开始
本人将为大家进行修改的分类讲解。
1. 直接搜索型。
能力值之类的数据按照简单的规律排列,并存放于ROM之中。只要将数据转化成为十六进制,并按照一定的顺序排列,运行UE打开ROM后进行直接进行搜索即可找到相应位置进行修改。
例子1:机战系列。
机战系列是最容易修改的一个系列之一。数据内容看似多且乱,其实每一代的存放规律基本差不多,机体能力基本上都按照HP,EN,装甲,运动等类似的顺序存放,有时可能有少许的变动。具体修改参见修改之神PLUTO_SHI的《机战OG静态修改》,西连帝和巴尔西昂的《机战A静态修改》和《机战R静态修改》,以及我写的《机战D静态修改》教程(此文在NW金手指区置顶索引里)。
例子2:《铸剑物语》的武器数值修改。
在《铸剑物语》中以主人公初始武器为例子,主人公初始武器能力并不强,能力值转换成十六进制的代码05 05 00 32,然后运行UE打开ROM进行搜索,找到地址后即可以进行修改图中地址即为武器能力值地址全改为FF。要注意的是速度值最高为127,即十六位的7F,如果过头的话会变成减速度能力值的数据。开VBA看看吧,修改成功。
例子3:《波斯王子》的能力值升级修改。
这个游戏有升级系统,但是并非能像传统RPG那样进行普通的练级,王子初期能力值太低很让人不爽。如果仅仅修改初始能力,升级后能力会还原成程序里设定的原始2级能力值,所以就要把全部30级的能力都改到最高,这样升级也不怕了数据恢复了。1级能力值如图,搜索37 0A 06此图中鼠标拉出的部分就是升级后每一级的能力值,我们要对它们进行修改。由于HP的数值最高只有151,修改过高数据会溢出而造成花版现象,所以改为97。而其余能力可以改为FF(即十进制的255,游戏中的最大值)。存盘后回到游戏,初始能力修改成功,再升一级看看。哈哈,修改大功告成。这下王子彻底无敌了。

要注意的是有的游戏搜索时并非参照原始数据或是原始数据的顺序,而是一些有规律的变数。比如《OG》中响介的能力不能进行直接搜索,而是需要搜索初始能力减去等级后的数值。这一点大家修改时要注意。

2.动用简单的ARM指令进行修改。
这种类型多用于一些ACT ARPG和一些射击游戏等,游戏中人物损失HP是由汇编指令来进行控制。这种修改需要工具为NO$GBA进行DEBUG,VBA和EC提供金手指码。
例子:325号ROM名叫PHALANX,一款不错的横版射击游戏。主角机体有4格HP和3个炸弓单。本人修改的目的在于使主角机体成为HP不减的无敌状态还有炸弓单不减。
首先用VBA搜索到机体HP地址为03005CCE,炸弓单为03005D12,然后打开NO$GBA,直接点击窗口弓单出ROM的搜索对话框,选择并运行ROM,点击DEBUG进入设置断点。如图所示,输入搜索到的金手指码。要注意输入的格式必须为[XXXXXXXX]!,否则是无效地址。然后点击游戏运行窗口开始游戏。当主角机体损失HP时游戏会自动中断,如图所示。红圈位置有个SUB R0,1H字样,这个就是减法指令,它控制主角机体的HP损失量。这里详细讲解一下SUB指令,其格式一般为SUB R1,R2,R3或SUB R1,R2,XH。运算法则为R1=R2-R3或R1=R2-XH(RX数值放在游戏窗口下面的寄存器里)。一般要使R1内的数值锁定,可以将SUB指令改写为R1=R2-0H,即改为SUB R1,R2,0H,这样就相当于执行了减去0的操作,从而达到使R1数值锁定的目的。回到DEBUG窗口,在SUB左边有用蓝圈所示的数据,从上向下依次为3801 73A0 0600,记录下来。这些是用在UE中搜索要修改的地址。。修改指令时右键点击指令,然后如图选择,会出现一个对话框,在对话框中输入要修改的指令SUB R0,0H。这是对指令进行修改。此时注意SUB左边4位数字变化成为3800,这表示修改后的数据,以前损失的01变成了00。随后运行UE,打开ROM搜索修改之前的3801 73A0 0600,由于高低位对调,所以实际搜索为0138 0A73 0006。找到地址后将0138改成0038(表示将每次损失的HP改成0损失)。存盘退出,用VBA试一下,成功啦。炸弓单修改同HP一样。

此类ROM修改比如《银河战士》两作,《波斯王子》等均如法炮制。但要注意的是有些ROM中人物能力值的损失控制指令不止一个,有的时候很可能出现修改不完全的现象。例如《银河战士》中怪物对主角的伤害和主角掉入岩浆中受伤害的指令不同,而《波斯王子》更是夸张,不仅怪物和各类陷阱对王子伤害不同,就连各种属性的火球冰球毒等状态对王子伤害也不一样,时之砂的消耗也分为一般情况消耗,BOSS战消耗和特定场合消耗(本人改完之后累得半死了)。总之多项指令修改时要特别注意修改完全。

2. 复杂修改型。
同样要用上ARM指令,但是不再是用几个简单的SUB就能轻松搞定的,经常可以看到几个相互关联的怪异指令在一起,有的还要一起改掉。这种修改起来比较麻烦费解。本人将以《分裂细胞-明日潘多拉》作为例子详细讲解一下这种修改的其中一种思路,因为在这种修改中方法并不是唯一的。
首先将步木仓子弓单改成锁定状态。直接到网上找到EC码,为477C2。一般以0XXXX格式存在的EC码想要转换成VBA老金,只要在前面加上020即可,但是遇到以4打头格式的4XXXX类型EC码时就要特别注意,开头并不是加上020,而是加上030,并且将4改为0,就成了0300XXXX格式,这种才是正确的VBA格式码。所以用030077C2设置断点,然后开木仓,游戏中断于此。看到DEBUG窗口中的命令和以前接触的大相径庭。然后点击一下游戏运行窗口继续游戏时会发现,游戏又中断了。一木仓还没开完,命令就又变了。然后再开一木仓,中断后看到这次的命令格式和图20中的指令相同。为什么呢?因为子弓单初始为10,作为10的整数倍,控制弓单Yao消耗用的是图19的指令,而子弓单成为10的非整数倍时,弓单Yao消耗用的是另外一种指令。既然知道了是怎么回事,本人就以10的非整数倍继续进行修改(因为刚才子弓单已经消耗成小于10了)。
观察图21,出现了新的指令。本人要改动就是红圈中的STRB。STRB是一个存储指令,格式一般为STRB R1,[R2],意思是把R1中的数值存入R2中。再看图21中游戏窗口下的寄存器,和图20比较一下可以看出R0和R3的数据在同步变化,显示的就是当前游戏中的弓单Yao量;R1则表示前一发子弓单射出之前的弓单Yao量。注意R2和R4均为弓单Yao地址,但是R4控制10整数倍时的弓单Yao,即在图19的命令中可用;R2控制10的非整数倍时的弓单Yao,在目前修改的命令中使用。所以在图20,21中,R2作为STRB指令的存储方。继续观察可以发现这几次开木仓中R5的数值恒定为1(实际游戏中此数值恒定),所以本人就把R5中的数值作为弓单Yao量锁定存于R2中。然后对指令右键点击进入对话框进行修改。注意记录修改前和修改后指令左方数字的变化。打开UE改掉搜索后地址中的数值。OK,用VBA试验一下吧。修改效果为开木仓后弓单Yao锁定为1。虽然总是闪,但是给这个潜入游戏增添了一份紧迫感(免得自恃弓单Yao无限就乱开木仓)。
再来看闪光雷的修改,相比步木仓子弓单就容易一些。取得闪光雷后,设置断点030077C3,中断后如图所示。仍然用到STRB指令。多试几次发现寄存器R3为闪光雷数量地址,R1表示消耗后的数量,R2表示消耗之前的数量(例如刚拿到就开一木仓,R1就是开木仓后的剩余数量,R2表示刚拿到后的)。只要还有闪光雷,R2的数量就不会成为0。本作中,一个闪光雷表示为十六进制的08,两个就是10,3个就是18......最多到48,也就是9颗雷。所以在寄存器中,R2显示为08,表示目前有一颗闪光雷。因此本人把R2中的数据存放在R3中,这样就忽略了R1和消耗量。由于本人不修改增加后的数量,所以R2中的数据只会增加不会减少。这样就能起到闪光雷不会减少的效果。具体的修改操作和前面一样就不再多说了。
同样修改复杂的还有《魂斗罗》等。有时这些ROM中会用到LDRB,就是和STRB相对应的读取指令。还有就是ADD,是和SUB相对应的加法指令。在用ARM指令进行修改时,有些不同种指令之间可以替换,比如用ADD替换STRB,会出现主角死亡时HP不减反增的情况(比如《魂斗罗》);但有时候指令之间无法相互替换,强行修改会引起副作用。而且有些ROM中寄存器的某些数值会恒定,所以可以利用读取这些寄存器进行修改,或是用寄存器之间的指令关系进行数据的无限循环,从而锁定数值。
有的人会问了:“像《ROCKMAN ZERO》系列的怎么改?敌我损失HP的指令时一样的,改了主角HP不减,就连敌人们也打不死了。这怎么办?”其实很简单,就像《分裂细胞》一样修改时需要动些脑筋。在《ROCKMAN ZERO》系列中,虽然敌我共用同样的SUB指令,但是寄存器地区显示的地址并不是断点所用的主角的HP地址,而是敌人的。而在SUB下面有个MOV指令,这个指令时要把上面运算的过程和结果移动到另一个寄存器和地址里,通常格式为MOV XX YY,意思为将XX移动到YY处或是移动到YYH之后的地址(YYH表示为具体的十六进制数据)。这就是为什么你看到寄存器里的地址是敌人的而不是主角的。这个MOV指令将前面SUB指令中运算的结果移动代入到了敌人的HP地址里面,造成了修改后敌我双方同时出现无敌的情况。如果此时修改了SUB指令后,再将MOV指令后面YY改成0H,那么SUB的运算结果就不会移动代入到敌人的地址里。同时敌人由于没有合适的SUB控制指令,所以修改后会出现主角对敌人攻击是一击毙的情况,包括BOSS战。

说了这么多,总结一下,修改还是要有耐心,不要怕累怕错,多备份ROM。

---------------------------------卡卡有话说-------------------------------
NO&#036;GBA 1.4CRACK <-----------点击下载
回复

使用道具 举报

发表于 2004-8-14 20:19:42 | 显示全部楼层
ROCKMAN ZERO改了后到第二关BOSS战处会卡的。- -
回复

使用道具 举报

发表于 2004-8-14 21:15:54 | 显示全部楼层
回复

使用道具 举报

发表于 2004-8-14 21:35:47 | 显示全部楼层
回复

使用道具 举报

发表于 2004-8-14 21:51:35 | 显示全部楼层
TO楼主:你有办法直接通过no cash gba1.4cr找到你说的这个图中的地址吗?这个东西困绕了我很久- -。推荐一个学习的园地:http://bbs.gcacn.com/

PS:北京那天晚上聚会,我和我们那帮人K完歌后就分开了,不知道你们后来的表演,早知道我也去了。残念啊。 [wdb2]
回复

使用道具 举报

 楼主| 发表于 2004-8-14 22:46:54 | 显示全部楼层
TO楼主:你有办法直接通过no cash gba1.4cr找到你说的这个图中的地址吗?这个东西困绕了我很久- -。推荐一个学习的园地:http://bbs.gcacn.com/

PS:北京那天晚上聚会,我和我们那帮人K完歌后就分开了,不知道你们后来的表演,早知道我也去了。残念啊。 [wdb2]
这个不是用NO&#036;找到的,就是直接搜索的
回复

使用道具 举报

 楼主| 发表于 2004-8-14 22:47:37 | 显示全部楼层
ROCKMAN ZERO改了后到第二关BOSS战处会卡的。- -
本殿这里游戏正常,就是靠这个修改通的关,而且BOSS也都是一击必杀
回复

使用道具 举报

 楼主| 发表于 2004-8-14 22:49:20 | 显示全部楼层
烈火之剑的武器熟练度地址找不到
用静态可以修改武器的数据,熟练度要用动态修改
回复

使用道具 举报

发表于 2004-8-15 07:26:07 | 显示全部楼层
小兰啊,原来卡卡那家伙自己在网上给特3找了个补丁,补丁后就可以在NO&#036;GBA上用了,怪不得我和你都读不了
回复

使用道具 举报

发表于 2004-8-15 11:07:15 | 显示全部楼层
是吧,我早说了T3直接在NO上运行会出现读档的BUG。
PS:NOGBA可以直接通过设断点找到静态能力的地址的。
回复

使用道具 举报

发表于 2004-8-15 13:56:33 | 显示全部楼层
NOGBA可以直接通过设断点找到静态能力的地址的。
那怎么弄呢?我是说怎样设断点找静态能力的呢?举个例子好吗?
回复

使用道具 举报

 楼主| 发表于 2004-8-16 01:23:48 | 显示全部楼层
NOGBA可以直接通过设断点找到静态能力的地址的。
像有些游戏开始获得数据后,直接在UE中一定方式排列搜索即可,通常数据的排列顺序都很直接,少有麻烦的;如果遇到麻烦的,再用断点也不迟

个人方式不同
回复

使用道具 举报

发表于 2004-8-16 09:42:03 | 显示全部楼层
请问怎样才可以弄出道具的16进制的带码啊!!!!!!
回复

使用道具 举报

发表于 2004-8-16 11:12:26 | 显示全部楼层
似乎no&#036;gba出现对手了。
vba sdl版听说过米?
回复

使用道具 举报

发表于 2004-8-16 18:18:28 | 显示全部楼层
请问怎样才可以弄出道具的16进制的带码啊!!!!!!
这个问题属于动态修改,不属于本贴的讨论范围
回复

使用道具 举报

发表于 2004-8-16 18:21:33 | 显示全部楼层
简介: 继一个星期前VBA的作者Forgotten放出了1.7.1的测试版后,今天马上放出了最终版,更新的变动一如往常地大啊:核心变动: - 在SDL版本里加入了SWI命令(在thumb模式里的0xf9)来退出模拟器 - 避免了崩溃当载入一个无效的ELF文件 - 避免了启动声音如果SoundOffFlag处于开启状态 - 禁止了移除intros的选项 - 修正了在ELF支持代码里的记忆泄露 - 修正了记忆损坏如果载入一个大于记忆所能支持的文件 - 修正了一些在profiling代码的编译警告 - 合并了一些大的endian修正到代码里 - 更常地更新电池记忆文件了


从EZ摘的介绍,里面包含有SDL版本的信息,但是目前似乎看来没有NO&#036;人气高
回复

使用道具 举报

发表于 2004-8-16 20:15:30 | 显示全部楼层
EZ那说的是1。72SDL版吧?对于汉化和HACK ROM来说这个兼容性和速度还有操作比NO好,但是没NO的直观。- -
回复

使用道具 举报

发表于 2004-8-16 22:41:21 | 显示全部楼层
目前还是NO&#036;好用,DEBUG太直观了
回复

使用道具 举报

发表于 2004-8-17 21:31:01 | 显示全部楼层
对了,我想汉化no&#036;gba,只找到了原代码和入口,怎么脱壳?
回复

使用道具 举报

发表于 2004-8-17 23:11:45 | 显示全部楼层
对了,我想汉化no&#036;gba,只找到了原代码和入口,怎么脱壳?
这个啊,汉化就不太会了,去拜会一下星组的技术员把
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|手机版|Archiver|Nw壬天堂世界 ( 京ICP备05022083号-1 京公网安备11010202001397号 )

GMT+8, 2024-11-18 14:28 , Processed in 0.027644 second(s), 2 queries , Redis On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表