注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

シンワのブログ

 
 
 

日志

 
 

GBA游戏修改教程debugger篇!  

2008-11-30 20:25:54|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 GBA游戏修改教程debugger篇!

此教程不是图文教程,需要有点耐心看————未经同意禁止以任何形式转载

所需工具:no$gba1.4c ; vba1.70 ; emucheat ; winhex(或者ultraedit)

  首先讲解下血不减,命不减之类的简单修改(就是传说中是XX不减)。
这类修改一般会遇到两种情况:一种是敌我分开的两条指令,一种是敌我共用一条指令。

1.敌我分开的指令,这个就比较简单了,只要直接下断把SUB指令改成NOP就可以了。
2.敌我共用一条指令,直接按上面那样修改的话会使敌我都不减血。

第1种情况:
假设改生命无限,假设生命内存地址为02001234,那么就打开no$gba1.4c载入游戏后等到可以控制人物的时候点一下左边指令窗口,然后按Ctrl+B弹出Breakpoints输入窗口,然后输入[02001234]! 回车。
关于断点格式和效果:
[02000100]!  stops on any byte/halfword/word write to [2000100h] 任何对该地址写入数据就会停
[02000100]?  stops only when writing new/changed data            对该地址写入新值就会停

然后点游戏窗口运行游戏去死一命,然后游戏就会停止运行,这个时候看断点处前一条指令,一般是SUB(减法)指令,直接在调试器里对着指令输入NOP,回车就可以了,记下当前指令地址,然后测试,如果有效就用16进制编辑器打开ROM直接把刚才地址减去08000000就是ROM地址,NOP的机器码在调试器下面的内存窗口就可以看到,写到ROM里保存下就可以了。

第2中情况:
如果敌我公用一条减血指令,那么直接NOP就会使敌我都不减血了,所以就要跳转出去写指令来处理了。
首先,写程序一定要去熟悉下ARM汇编语言了,不过没必要深入研究,看懂一些基础指令就可以了。
push r0-r7    入栈
pop  r0-r7    出栈
b    xxxxxxxx 跳转
bl   xxxxxxxx 带返回的跳转
bx   R14      返回(相当于RTS)

ldrb r0,[r1]  以R1的值作为地址,读取该地址对应的数据以单字节形式放入R0
ldrh r0,[r1]  以R1的值作为地址,读取该地址对应的数据以双字节形式放入R0
ldr  r0,[r1]  以R1的值作为地址,读取该地址对应的数据以四字节形式放入R0

strb r0,[r1]  以R1的值作为地址,把R0的值以单字节形式写入该地址
strh r0,[r1]  以R1的值作为地址,把R0的值以双字节形式写入该地址
str  r0,[r1]  以R1的值作为地址,把R0的值以四字节形式写入该地址

mov  r0,r1    把寄存器R1的值放入寄存器R0
mov  r0,#0x20 把0x20放入寄存器R0

cmp r0,#0x20  寄存器R0的值与0x20比较
beq xxxxxxxx  如果标志位Z=1则转移,否则继续(相等则跳转)
bne xxxxxxxx  如果标志位Z=0则转移,否则继续(不相等则跳转)
bhi xxxxxxxx  大于则跳转
bls xxxxxxxx  小于则跳转
 
这篇教程暂时先了解这些就够了。

如果敌我公用一条减血指令,那么我们就要用BL指令来跳转出来,该指令占用4字节,占用了原来的2条指令,所以被覆盖的2条指令要记录下来,后面要补上,然后就找一块空白区域写入程序,一般搜索大片FFFFFFFF就可以了,然后把断点处的指令改成BL XXXXXXXX(XX为空白区域地址),然后到空白内存那里补上两条覆盖的指令,正式开始写程序。

补上覆盖的两条指令
push r0-r2       把R0-R2三个寄存器压入栈(目的是保护寄存器里原来的数据)
ldr r0,=xxxxxxxx 让R0=体力地址(XX为我方体力地址)
mov r1,#0x63     把0x63放入寄存器R1(假设满血为99)
strb r1,[r0]     R0的值作为地址,把R1的值(0x63)放入该地址(体力地址)
pop r0-r2        出栈 (还原寄存器的值)
bx r14           返回

以上这段程序的效果就是,不管是打敌人还是被敌人打,都会让自己的血回到99(假设满血为99)

另外还有一种写法就是判断敌我内存:
断点后,跳转出来直接写程序判断保存敌我体力内存的那个寄存器的值是不是我方体力内存,如果是就跳过SUB那指令,如果不是就继续运行,这样也可以做到我方体力不减,这段程序就要用到 CMP BNE BEQ 等指令了,这里就不介绍了,留点给大家研究的空间。

讲到这里或许大家会觉得,切!不就是XX不减吗?
但是就这么一个小教程,再加上你的无限创意,就会改出意想不到的效果,随便举个例子:比如移动速,只要搜索你的坐标,断点后跳转出来,把每次移动后坐标增加或减少的那指令增加的数据给翻倍就可以达到2倍速移动的效果了,写法很简单,只要加一条移位指令就可以了,再比

如按键得到某效果,也是拿按键地址断点判断键值写入某效果(具体看FC的按键得到某效果的教程就可以了),程序是活的,可以写出各种效果,当然前提是你要熟悉ARM,当然了会巧妙的搜索EC码也是很重要的。

暂时就说这么多了~~~~~~~~~~

作者:しんわ


 

  评论这张
 
阅读(2682)| 评论(41)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017