自己动手丰衣足食-自己动手修改GBA ROM游戏文件
经过一天的努力终于琢磨出怎么修改GBA的游戏文件也就是俗称的ROM文件起因是因为偶然看到二手GBM顿时抑制不住买了一台可惜买得晚了完美运行游戏又带金手指功能的烧录卡买不到了。SUPERCARD烧录卡看评论说费电玩游戏会拖慢什么的最后权衡再三买了个EZ4烧录卡缺点就是不能开金手指。但是我这种从小开惯金手指的人没有金手指怎么驰骋游戏好了废话不多说开始进入正题看本文最好有80x86汇编语言基础理解什么是代码段什么是数据段用CE OD调试修改过PC游戏的最佳。当然没有的话我也试着尽量让没基础的人能看懂之前搜了半天百度只找到一篇很晦涩的博文说了这个方法本人弄出来了就打算写篇图文教程造福广大没有条件开金手指的玩家。首先是工具1.UltraEdit大名鼎鼎的16进制文件阅读/修改工具这个工具主要是修改GBA ROM文件并保存。2.NO$GBA1.4C这个并不是那个著名的NDS模拟器虽然名字一样但却是个GBA ROM的DEBUG调试工具用它能帮助定位需要修改的代码段。3.VisualBoyAdvance1.6一定得是这个低版本的GBA模拟器我被卡了大概一早上就是因为我本来用的是1.72版本的1.72和NO$GBA1.4C载入后的地址不一样有偏移。4.arm汇编手册中文版GBA的CPU用的是ARM汇编语言有80x86汇编语言基础的朋友可以自己查手册实现更自由的修改。http://download.csdn.net/detail/l198738655/9903635 本文提到的工具好了我们开始首先我们来学习怎么找或者说制造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”。然后我们用快捷键CtrlB,然后在弹出的对话框中输入 [020068b4]!来设置条件断点让游戏访问这个地址里的金钱数据时断下来我们就能知道是那一段代码在访问这个内存地址然后我们买个东西花点钱让代码段访问以下这个地址买一袋种子后断在了红框框处现在按一下键盘上的Delete键删除[020068b4]!这个断点。这一句我们不用理他看这一句的上面一句sub是减法 这一句的意思是r0寄存器里的值- r1寄存器里的值结果放回r0寄存器。r0r0-r1我们在这一句上下一个断点就是点一下这行末尾出现“BRK”就说明断点已经设立然后买个120G的东西又断下来了我们看r0和r1寄存器此时的值r0为640就是10进制的1600r1是78就是10进制的120。所以我们只要编辑这行代码让它由减变加就能实现买东西反而倒找钱的功能了。在下了断点那行再点一下BRK消失取消断点然后在此行上右键选择“Change Instruction”来修改代码修改成add r0,r0,r1然后确定然后我们用鼠标点击一下游戏画面让游戏跑起来因为我们在买的时候断下修改代码后重新运行此时游戏逻辑已经改变现在钱变成了1720正好是1600120但是此时我们要把代码改回去为何呢因为这个调试器是无法保存我们的修改的我们得改回去然后用之前提到的16进制文件编辑器来查找到这段代码再修改后才能保存。改回去后记住红框框内的4个字节。我们要记下图片中的这4个字节1C211A40然后转换成小端形式211c401a,然后我们用UltraEdit打开 牧场物语.gba 文件然后在这里按CtrlF搜索字符串211c401a看我们找到了如果怕不是这个我们可以再搜索一次就会出现说明这4个字节的组合是唯一的我们要把sub修改成add也就是要把 211c401a 改为 211c4018选中a用键盘改它为8然后保存退出就修改成功了。此时把这个ROM文件拖入任何一个烧录卡任何设备的GBA模拟器修改都会生效没有金手指也能纵横GBA世界。修改GBA ROM主要就是找SUB或ADD语句下面再以机战OG2为例子说一个用加法实现减钱效果的代码的修改。有时候代码实现减法不一定会用SUB而是用ADD用一个正数加上一个负数也能实现减法。这一句的意思是r1r1r2经过测试去地图里杀敌后增加资金也是这段代码把ADD改为SUB的话减钱就是加钱加钱就减钱问题在于资金数肯定有个上限超出后恐怕会溢出导致存档损坏什么的单纯的把加改成减并不安全我的办法是把add r1,r1,r2改为add r1,r1,1也就是不管买什么都只加1块钱。但问题来了杀敌一台本来该加2000也变成了只加1。不过这也不是什么大问题想加钱的时候换成正常ROM不想花钱了换成改过的ROM存档是不受影响的。我已经把修改后的ROM文件一起打包到工具压缩包里了有兴趣的同学可以自己拿模拟器或者GBA试试。2026.6.2 修改为了让更多新手看明白再多啰嗦几句有时候我们不想让钱或者数值 道具数量增加或者减少要怎么改代码呢这时候比如上图的1889 add r1,r1,r2这一句我们不希望这个道具或者资金数或者-那就把这一句全改成0就行也就是原本的汇编代码是1889改为0000这样买东西或者使用道具就可以不加不减因为游戏存储道具或者钱是有一个上限的比如存储道具用的是2个字节 00 00那么2字节的上限就是 FF FF换算成10进制就是65535如果此时还继续增加就会内存溢出也就是本来这个数目用2个字节存储00 00就会溢出到旁边的字节里去比如已经到上限FF FF但是FF FF左边和右边还有字节例如65535165536,16进制为01 00 00换算成小端模式则是 00 00 01就会把原本FF FF右边的一个字节改写成01而这个字节也可能存储其他数据就会打乱其他的数据所以这是需要我们修改游戏的时候避免的如果不加注意有可能改废存档导致存档损坏所以在我们希望锁定数据不增不减的场景下可以把具体的add 或者 sub语句改为00 00来实现屏蔽这条语句实现不增不减的锁定效果。转载请注明出处尊重一下鄙人的劳动成果多谢多谢