欢迎来到 电玩999 电玩网

您当前的位置:电玩网>电玩资讯>新手教学>GBA HACK教程

热点资讯

更多

GBA HACK教程

2015-03-15  |  来源:互联网  |  小编:admin  |   人看过  

no$gba 1.4调试器很完善,唯一不足之处没有读断点,只有写断点。

Tracer-VisualboyAdvance1.7.1调试器是使用一个“HOOK”机制,类似断点,他会记录下发生的HOOK事件到文本文件。

本教程以Tracer-VisualboyAdvance1.7.1来跟踪分析游戏,游戏是《魂斗罗》日版,修改目标为命不减。

看本教程之前首先是你对ARM汇编要有一定了解。

先来看一下Tracer-VisualboyAdvance1.7.1自带readme.txt文档说明,readme.txt已经给出Tracer-VisualboyAdvance1.7.1键位作用说明。

keys:
'/' = toggles instruction logging to 'trace.log'
'.' = dumps RAM, SRAM, NT
',' = toggles memory logging to 'hook.txt' (set by 'hook_log.txt')

按“/”键将汇编指令记录到“trace.log”文件。
按“.”键吸出RAM,SRAM,NT。
按“,”键将内存记录到“hook.txt”文件。(设置了hook_log.txt)

1。首先要查找出游戏命数存放地址,我查找地址是:03002c60

2。接下来用文本编辑器(例如windows自带的记事本或NoteXPad,我用的是NoteXPad)打开Tracer-VisualboyAdvance1.7.1目录下的hook_log.txt,在开头看到以下三行:

hook_pc1 1 -1 -1
hook_rd1 1 -1 -1
hook_wr1 1 0203806E 0203806E

其中hook_rd1是读,hook_wr1是写,

如果你要设0203806E~02038070范围写断点,那么hook_wr1可这样设:

hook_wr1 1 0203806E 02038070

由于我要断点的只有一个03002c60这一个地址,所以我修改为:(图1)

hook_wr1 1 03002c60 03002c60

GBA HACK教程 - 疾风之狼 - 疾风之狼的博客

保存退出。

3。复制GBA《魂斗罗》日版ROM到Tracer-VisualboyAdvance1.7.1调试器目录下,接下来打开Tracer-VisualboyAdvance1.7.1调试器,加载GBA《魂斗罗》日版ROM。(注意:如果ROM是存放在其他目录,那么hook.txt和trace.txt只会在ROM所在的目录下生成,不会在Tracer-VisualboyAdvance1.7.1调试器目录下生成,这一点要注意。)

4。开始游戏,先按“/”再按“,”开始跟踪。死一命后,再按“,”、“/”停止跟踪。注意:死一命后调试器不会中断暂停游戏。

5。接下来关闭游戏,再关闭调试器,不先关闭调试器,跟踪结果就不会写入hook.txt和trace.txt。

6。用文本编辑器打开hook.txt,看到如下内容(图2):

GBA HACK教程 - 疾风之狼 - 疾风之狼的博客

[0801:4ECE] W16 = 0002     [03002C60]

TRACE STOPPED

其中[0801:4ECE]是汇编程序内存地址,W16代表写16位数据(即双字节数据),0002是命数,[03002C60]是命数地址。

7。复制[0801:4ECE],打开trace.txt,搜索[0801:4ECE],光标停在[0801:4ece]一行(图3):

GBA HACK教程 - 疾风之狼 - 疾风之狼的博客

[0801:4ec6] 88 98  ldrh r0, [r3, #0x4]                  R00=00000079 R01=00000000 R02=03002c5c R03=03002c5c R04=00000079 R05=030038f4 R06=0000064c R07=00000000 R08=03001b46 R09=03001b48 R10=00000000 R11=00000000 R12=0000064c R13=03007e84 R14=0800f83b R15=08014ec8 R16=2000003f nzCvifT VH
[0801:4ec8] 28 00  cmp r0, #0x0                         R00=00000003 R01=00000000 R02=03002c5c R03=03002c5c R04=00000079 R05=030038f4 R06=0000064c R07=00000000 R08=03001b46 R09=03001b48 R10=00000000 R11=00000000 R12=0000064c R13=03007e84 R14=0800f83b R15=08014eca R16=2000003f nzCvifT VH
[0801:4eca] d0 5c  beq $08014f86                        R00=00000003 R01=00000000 R02=03002c5c R03=03002c5c R04=00000079 R05=030038f4 R06=0000064c R07=00000000 R08=03001b46 R09=03001b48 R10=00000000 R11=00000000 R12=0000064c R13=03007e84 R14=0800f83b R15=08014ecc R16=2000003f nzCvifT VH
[0801:4ecc] 38 01  sub r0, #0x1                         R00=00000003 R01=00000000 R02=03002c5c R03=03002c5c R04=00000079 R05=030038f4 R06=0000064c R07=00000000 R08=03001b46 R09=03001b48 R10=00000000 R11=00000000 R12=0000064c R13=03007e84 R14=0800f83b R15=08014ece R16=2000003f nzCvifT VH
[0801:4ece] 80 98  strh r0, [r3, #0x4]                  R00=00000002 R01=00000000 R02=03002c5c R03=03002c5c R04=00000079 R05=030038f4 R06=0000064c R07=00000000 R08=03001b46 R09=03001b48 R10=00000000 R11=00000000 R12=0000064c R13=03007e84 R14=0800f83b R15=08014ed0 R16=2000003f nzCvifT VH

接下来分析一下:

[0801:4ec6] 88 98  ldrh r0, [r3, #0x4] 把03002c60地址数据载入寄存器r0,你问我03002c60地址怎么来的?我怎么没看到,你看一下上边[0801:4ec6]一行右边寄存器R03=03002c5c,将此寄存器R03地址和4相加,不就等于03002c60么?
[0801:4ec8] 28 00  cmp r0, #0x0  将寄存器r0数据和立即数0比较
[0801:4eca] d0 5c  beq $08014f86 相等就跳转到08014f86,否则继续
[0801:4ecc] 38 01  sub r0, #0x1  寄存器r0数据和立即数1相减,结果存入寄存器r0
[0801:4ece] 80 98  strh r0, [r3, #0x4] 把寄存器r0数据写入到03002c60地址

接下来好办,把[0801:4ecc]38 01  sub r0, #0x1一行指令修改为38 00  sub r0, #0x0(寄存器r0数据和立即数0相减,结果存入寄存器r0)或nop掉(机器码是46C0)都可。

把38 01 80 98经过高低位对换变成01 38 98 80,用16进制编辑器(例如WINHEX或UE)打开《魂斗罗》日版ROM,查找01 38 98 80,将01 38修改为C0 46,保存退出,用VBA模拟器加载修改过的ROM测试一下,是否命不减了?命不减说明修改成功。

教程至此结束。

无聊就写了这个教程,有错误请指正。

疾风之狼

2009.10.14

分享吧~提高逼格:
分享代码网站注册去

相关阅读

文章评论


温馨提示:抵制不良游戏 拒绝盗版游戏 注意自我保护 谨防受骗上当 适度游戏益脑 沉边游戏伤身 合理安排时间 享受健康生活

游戏作品版权归原作者享有,如无意之中侵犯了您的版权,请您按照《版权保护投诉指引》来信告知,本网站将应您的要求删除。