关键词:

GBA TRAINERS 制作指南

来源:未知 时间:2007/6/29,点击:0

GBA TRAINERS 制作指南

  开始和其他的东西 欢迎您阅读GBA HACK 指南。本指南的目的在于告诉人们制作trainers既不是很神奇的玩意也不是很复杂。(如果你正在做基础的东西)。我从没将我自己做过的trainer公布出来,我HACK的目的只是为了娱乐和处于个人兴趣。但是我感觉很多人很想做trainers但是又找不到开头,所以一直是此方面的门外汉,我希望这对他们有帮助

我们需要的工具,为配合本指南,您需要以下:

●一个大脑
●一点ARM的汇编知识
●一个16位编辑器
●一个ARM汇编工具
●一个ARM反汇编工具

我使用下列的工具,我推荐你们在开始前先获得他们:

Hexeditor:Hex Workshop (从http://www.bpsoft.com获得)
ARM汇编工具:Goldroad ARM-Assembler (从http://www.goldroad.co.uk/grARM.html获得)
ARM反汇编工具:IDA Pro with arm functionality(商业软件,从你当地的经销商获得J)

你也可以试试这个:dsmgba,但是我不知道他是否好用。 (从http://www.postbox.javamaster.co.uk获得) 但是为了完美的HACK尽量使用IDA Pro。 (译者:直接用no$gba1.4cr好了,汇编反汇编通吃) 在我们开始前:一些基础

  使用本指南前你要保证已经获得一些HACK来的VBA代码,即Trainer。 这并不总是一些你不得不要做的简单无用的主要工作。如果你现在问我怎么做,我只能告诉你可以试试一些附带了查找代码和金手指功能的模拟器(例如Visual Boy Advance)。No$gba是个带有设置高级断点功能特征的模拟器,也值得一用哦。 (译者:放P,哪个个人会付5000$它啊,哪个公司会放弃N厂免费提供的工具另外花钱买它啊。)

  译者:目前出现的GBA模拟器有: VBA1.6-1.71-1.72,推荐1.71版;bgb:主页:http://bgb.bircd.org/, http://www.xs4all.nl/~beware3/bgb;RascalBoy1284;Agb;No$gba1.4cr或者以前更老的版本,别指望新的1.9和2.0版的能帮你什么忙,他们只是单纯的模拟器;Dsemu目前是0.01b版,连GBA都不能模拟,汗;CowBiteSpec,兼容性不太好;BATGBA;还有老Y制作的EMUCHEAT FOR VBA版,此外还有可文先生的国产模拟器,混沌星辰的国产模拟器等。

  举个简单的例子,如果你已经用VBA成功找到某游戏的无限能源的代码了:

此代码条的含义无外乎是:“一直将16进制数值0x06写到GBA内存地址0x3004b20上。”所以当你在玩游戏时使用这个条代码的话,失去一点能量,那么原数值0x06(在游戏中重现你的能量点)将会减少为0x05,但是它将总是很快的(太快了往往注意不到)重新变成0x06(所以你又是6点能量了)。 并且,在GBA的内存中这个显示你能量点数的16进制数0x06被储存到地址0x3004b20上了。 之后,我们的Trainer确实一直在做着将0x06写到地址0x3004b20上这个循环。并且保证Trainer的循环(不停的更新)一直在运行,我们不得不钩上它使他成为一个不断的被唤醒的游戏代码,这就是Trainer循环的定义。(多好的一个复杂句啊J)。我希望下图可帮助你理解:

对于这个定义的另个解释,我建议你最好看看Nintendo64 trainermaking guide,由Icarus of Paradox制作,这里下载:http://n64dev.50megs.com/trainer.html

第一步:找到关于游戏ROM的相关信息 trainer中的一处:

  打开HexWorkshop搜索ROM中无用的空间。翻到ROM的底部,通常能找到被填充为FF或者00的无用处的空间(但是不是总是这样的)。对于这分指南,我们假定我们在游戏ROM中找到一片好地方断点在:0x7fb900处,将此数字写在一张纸上。 (译者:嘿嘿,我们常说的多用笔记地址和数据,得到公认了。)

  找到“经常唤醒”的游戏代码,钩中我们的trainer循环。 我们在ROM中在许多地方可以钩中我们的循环到代码。但是不幸的很,我们不得不逐寸的搜索此被唤醒和运行的循环程式。在GBA ROM中的好地方这个循环程式被唤醒,以在游戏中检查按键是否被按下

关于GBA的按键:

  OK!我承认,GBA并没有真正的实际的键盘。 GBA有10个按键, UP, DOWN, LEFT, RIGHT, A, B, START, SELECT, L, 和R.当你按一个键的时候,相应的位(二进制数据)就会被清除(0或off)。键区的寄存器在0x04000130。Keypad.h(你可以从这里下载到它,同样是将ThePernProject的相同的部分转换成asm的代码的)里有如下几个定义:

KEY_A 1
KEY_B 2
KEY_SELECT 4
KEY_START 8
KEY_RIGHT 16
KEY_LEFT 32
KEY_UP 64
KEY_DOWN 128
KEY_R 256
KEY_L 512
KEYS 0x04000130

检查是否有一个键被按下了,你可以这样做:

  ldr r3,=KEYS ; 这两行将按键存储器的内容 ldr r4,[r3] ; 装载进r4寄存器 ands r4,r4,#KEY_A ; 这一行将按键寄存器和一个键进行与操作 ;注意一下AND指令的后缀,这将会把条件(状态标志)设置为操作的结果 假如A键被按下了,则条件就会是Equal(相等),那么那以后的任何指令,只要有EQ(Equal)后缀的,都将会被执行。我想很明显如何去测试别的按键了吧,那我就不show了。)

  画外音:所以对于不同的游戏只要以按键寄存器地址[04000130h]变化为中断条件就可找到此游戏的哪个内存地址保存了按键按下时瞬间的值,之后马上又变回0;哪个又保存当前按键的状态值。)。 这个程式一直作为默认被唤醒,因为这个对游戏中一些精灵的控制是必要的。 所以再次打开HexWorkshop搜索以下的16进制的数值:

  在HexWorkshop中也许是象下面这样的:

  在我们的测试ROM里我们得到一处按键的断点:0x3a2e4。在纸上写下这个断点

第二步:为找到更多的相关信息反汇编ROM

  OK..我做了个新的一章。现在我用IDE Pro来反汇编这个ROM。如果你用别的反汇编工具来完成这些步骤。我希望你能成功。 (译者:国内HACKER们有福啊,现在可以用CrystalDisassemble这个钻石牌GBA反汇编工具了。)

  OK,打开IDE-Pro,读入ROM并选择ARM为processor type.来到地址0x3a2e4上,我们会发现在HexWorkshop中和反汇编器中这个地址上的数值。(在THUMB-MODE!)。因为我们的测试ROM我们将找到反汇编如下:

上图黄色标记处告诉我们,那串长的数字0x4000130在断点0x3a2e4处被使用,同样在0x3a2a6处也被使用(看上图)。 写下在0x3a2a6后的第二个命令行的断点,在这个例子就是:0x3a2a8:

  还要记下运行中的这个命令:“ldrh r2,[r1]”和“ldr r1=0x4000130”.同时,记下这个我们还要再次跳回的命令的断点:0x3a2aa。 然后看下这个循环程式周围,发现我们之后可以用来跳转的register。当然我们将使用一个没用的register为我们使用。(那样我们就不会抹消其他重要的东西了)。 在这个例子中R4 register比较好用。注意:在大部分游戏的rom中使用R4是个好办法,但是当然你不得不在运行时不时的看一看你HACK的ROM确保没用BUG。 我们就做到这里吧,关闭IDA-Pro吧。

第三步:重写循环程式使之适应你的要求

  OK我们要写个小汇编程序来将之前找到的代码:03004b20 06 代入进去。这个代码说我们要将16进制数字(0x06)写到内存地址0x3004b20上,记得吗? 所以的代码应按如下写:

ldr r4,=0x03004b20
mov r5,#6
strb r5,[r4]

  好了。但是我们要在这将register r4和r5 压入栈,可能在我们返回原游戏代码后会导致问题。所以我们要把他们存到堆栈中,这个新的代码应该这么写:

push {r4-r5}
ldr r4,=0x03004b20
mov r5,#6
strb r5,[r4]
pop {r4-r5}

  好了,我们仍然还没准本好。我们的trainer程式在一切都结束后还要跳回原游戏代码,你写下这处的断点0x3a2aa。这是个文件断点,但是我们需要的是rom断点,所以OR这个基地址0x08000000就得到:0x08003a2aa.(译者:OR就是或,反正就是将3a2aa加到08000000上得到08003a2aa就是了)。现在还需要将这个地址数值加上1得到0x08003a2ab。 Phew..现在我们可以更新trainer循环程式了,如下:

  但是,还有一些事没处理完:在我们回去之前我们要运行跳进我们的trainer循环程式的指令,我们写曾经记下来的记得吗:-> ldrh r2,[r1] – 而且我们还要在跳回前运行指令 ldr r1,=0x4000130 ,因为我们马上就要在下面编辑中用到他们了! 所以这里就是我们的“最终”的trainer循环程式:

push {r4-r5}
ldr r4,=0x03004b20
mov r5,#6
strb r5,[r4]
pop {r4-r5}
ldr r1,=#0x04000130
ldrh r2,[r1]
ldr r2,[r1]
ldr r4,=0x08003a2ab
bx r4

  好了,真的是最终了吗?-不幸啊,还不是。这是在GBA内存中我们更新后的能量数值的程式。但是在trainer的菜单中,如果这个配置可以被玩家选择打开或关闭。我们的当前的程式并不具备被选择性,那个C作弊码将会一直是打开状态。所以我们需要能告诉我们代码是否更新或没有的东西。就是这个原因trainer菜单如果配置打开需要在某处放置TRUE(1)数值,如果没有就放置FALSE(0)数值。 如下做:如果你不需要这个配置就要使配置and 0,那就将0x01放到内存地址0x03007fb0上。你必须在你的trainer菜单上这样做,我不会深入,我只希望你在为GBA做trainer菜单时知道怎么做(如果不是,那你为什么无论如何要读这该死的东西?) (译者:好饶舌的作者啊) 此地址0x03007fb0是个相对安全的空间,你可在此存放些小东西。 所以我们的完结篇的trainer程式需要检查这个地址然后这样写:

  现在用Goldroad assembler完成这些代码后。你能得到一个文件:binary.gba。 (译者:骗了我们好多次,作者终于将最终的最后的程序写出来了。+_+b) 第四步:对游戏ROM最后的修正。 OK,现在我们有了我们的trainer.gba文件,和原始的(未修改过的,初始的)游戏ROM,和纸上一些没用处的数值J。 现在是对原ROM用上trainer.gba的时候了,还要做一些其他的必要的小事使一切都完美。 第一件事:你要将binary trainer.gba文件放到本地,我们在开始的地方找到(此处就是ROM中有许多没用空间的地方)。在我们的例子中它是:0x7fb900。完成后你会用HexWorkshop的insert-mode或者其他工具完成这件工作。 然后:我们要补丁我们制作的游戏程式,那样它就会在运行到文件断点 0x7fb900 和ROM断点 0x087fb900(记得是OR时的0x08000000)时运行我们的trainer程式。现在我们再次在当前的地址上加上1得到:0x087fb901。 因为这个原因再次打开HexWorkshop然后跳到先前我们搜索奇怪数值得到的断点处,记得吗?-我不是告诉要写在纸上的吗?你不听我的话写在纸上你怎么记的住呢,所以要听我的话,乖哦,以后都要记住将重要的数据写在草稿纸上啊J-在我们的例子中它是:0x3a2e4。 (译者:算了,我也被作者感染了,也唐僧一回好了)

  在此处你将会再次找到奇怪的数值:30010004:

  现在用我们的trainer程式的ROM断点覆盖这个数值(要记得加上1哦):0x087f901(看上面的)。但是还有一个问题,你在做这些时要注意了:结尾的格式!-用从最后的字节开始的顺序覆盖它(译者:就是将字节每两个就倒置下顺序),例如你用来覆盖的是0x087fb901-那么就写成0x0197f08。所以在修正后它会是这个样子:

  现在我们修正了一个我们的第一个gba-trainerJ。再次打开IDE-Pro然后跳到地址0x3a2a8上(译者:作者在此处把IDE-Pro错误的写成HexWorkshop了)。在这个地址上我们会找到这个东西“ldrh r2,[r1]”,我告诉你要写下来的吧,记得吗? (译者:作者再次体现了他的唐僧水平,拜啊)

  现在你知道我要说什么了吧,这里是这个地址的上反汇编语句:

(译者:废话,你不说我也知道。TF)

  你看见这个指令了吗“ldr r1,=0x4000130”?好的,它对于了解此处ldr指令要使用哪个register=寄存器(前同)非常的重要,因为我们现在要适当的设置我们的指令段。 如果它是R1,那么在地址0x3a2a8上用0x0847覆盖当前这个16位(2字节)的数值。(译者:其实用no$gba的直接改写语句的功能可以很简单的做到,嘿嘿)象这样:

  如果其他的register=寄存器被使用到的话,这个数值是不同的。通过下图你将找到一个表格,它将告诉你不同的寄存器对应的数值:

  如果我们在修正它后反汇编这个ROM它就象这样了:

  你看那个ldr-指令现在在这个地址上正在装载的是我们的trainer的程式,然后通过使用指令“bx r1”(译者:bx:跳转到thumb代码)跳进。原来的老的指令“ldrh r2,[r1]”已经被它覆盖了(那就是为什么在我们的trainer程式中我们需要在跳回到0x3a2aa前运行这些)。恭喜你,你的Trainer已经完工了..(一直都是OK,现在做个合适尺寸的trainer菜单吧!J) (译者:作者还在唐僧,我忍无可忍了,怒啊>_<)

  最后的话 我希望在我能帮你提高你的GBA方面的trainer-hacking技能或者秀下你是怎样完成你自己的Trainer的;-)-当然主要的hack过程在搜索VBA代码时就已经完成了。有时这个并不简单,但是其乐无穷J(译者:想到某厂的小X王“其乐无穷啊”的声音了。汗)。所以对所有的trainer制作者说:继续这个非常好的工作吧! 谢谢你阅读本指南。并且感谢您耐心听完我的话并在以后使用到它。并且对我蹩脚的英语说声抱歉。…恩!

签名:无名氏
原作时间:2004-2-26
翻译时间:2004-12-14

  上一篇: ♦ VBA1.7.21版局域网联机教程 2007/6/29
  下一篇: ♦ 汉化基础教程——完结篇 2007/6/29
记住电玩天空域名,方便下次访问:VGSKY.COM

【分类导航】

【热门游戏资讯】

更多

【推荐游戏资讯】

更多

【最新资讯更新】

更多

【赞助商链接】

<