以下内容完整转载自:超绝可爱陆陆酱 原创发布的:Breeze进阶技巧:模糊搜索与一键自动生成Code cave
上一篇讲了使用Breeze从搜索出数值→设置断点→追踪程序→修改程序→生成金手指代码,整个工具的基本用法。
本篇再来玩一些更花里胡哨的东西。
什么是模糊搜索?
需要模糊搜索,说明无法从游戏中直观知道,想找数值,具体是多少。
不过我们可以将内存dump下来,令游戏中的数值变化,使用旧内存中的数值,与当前内存中的数值进行对比,筛选出满足条件的数值。一般可以通过设置各种条件,++(变大了),–(变小了),same(无变化),diff(有变化),==val(等于val),!=val(不等于val)。来进行筛选,从而减少搜索到的结果。
++和–用得最多,比如说有的游戏,只看得到血条,没有实际的血量数值,就可以根据血条变化,血条变多就搜++,挨打就搜–,多搜几次就搜出来了。
same,diff用得比较少,一般是用在数值加密非常离谱的游戏里,或者对于某些数值你没法去判断它是加还是减,只是知道它有无变化,可以用这个去搜索。
==val,!=val。这个也是用得比较多的,我是经常用来找一些开关之类的东西,比如说对应游戏中的某个机关的开关。可以猜得出来,默认关的状态数值是0,而开的状态,简单的游戏,它一般就是1,但如果不等于1呢,就可以通过==0,!=0这样的设置去查找。当然用++,–去找也可以,但毕竟有一项已知的数值,用==,!=去找肯定更快一些的。
什么是Code cave?
Code cave是汇编修改中经常需要使用到的技巧,指在内存中寻找未被游戏程序使用的空白地址,在上面写入自己编写的程序,再将原程序跳转至自己编写的程序,用来代替原程序的执行,这样的方式来修改。使用Code cave 扩展程序,可以实现更强大的功能。如果你想学习制作金手指,Code cave是你必须得要会的。
科普完知识,开始回到正题。本篇会以最近发售的游戏《勇者赶时间》,为例,修改游戏中抽卡的冷却时间,达到快速抽卡的目的,此次修改会用到上面讲的两个东西。
修改之前,先理一下搜索思路,虽要找的数值没法知道具体是多少,但大致可以猜出来它是什么数据类型的。
首先计时器,肯定会是个浮点数,因为需要精准控制。而大多数游戏的计时器,都是单精度浮点数,那么可以从这个方面开始下手去搜。
一般我找单浮点,会先给一个范围1000000000…1300000000,十位数的。至于为什么那么大,浮点数是需要储存很多数字的,需要很多字节来储存,而再将它从16进制转成10进制后,它就是那么大,制作金手指不需要太多去理解这个,这属于计算机知识,感兴趣自行百度了解吧。
那么打开Breeze,搜索方式选择[A…B],数据类型U32。
Edit A 写入1000000000,Edit B 写入1300000000,然后start search,开始搜索。
划定范围搜索这个是需要一点经验的,属于你改的游戏多了,看游戏厂商,或者使用的引擎,对数字的使用习惯,一下就可以猜出来,大概在哪个范围。设定最小值和最大值,如果猜对了,可以加快搜索速度,猜错了,那就搜不出来。
如果你比较缺乏经验,不知道怎么划范围的话,就使用memory dump,也就是unknown搜索。把整个内存dump下来,极大概率是可以找得到的,只是花的时间会比较长。其实也还好,用Breeze也比别的软件快好几倍。要是用edizon-se或者jnoexs来干这个事,没有半个小时都找不出来。我一般只有在几次范围搜索过后,实在找不出来,才会用到这个。
第一次搜索完成,之后就要开始思考,数值是怎么变化的。
计时器嘛,肯定随时间流逝,逐渐减少(或者增加),直到等于某个值,完成某项动作,然后重置计时器,再次循环。
那么我先假定,冷却时间逐渐递减,递减至0时,玩家抽卡,抽卡动作完成后,初始化计时器,再次开始递减。
这样搜索的思路就完成了,正常游戏,让冷却时间减少,用–去搜索,当完成抽卡动作后,数值++,一直重复上面的动作。
那么打开Search Setup,将搜索方式修改为–或者++,选择Continue search(继续搜索)。接下来就是非常枯燥的重复++、–搜索,重复个几十次都是正常的,做老金,是需要更多耐心的。
好,那么在经过八次继续搜索后,200W个候选结果就被过滤得只剩下4个了。
这就不得不提一下Breeze非常好用功能,可以使用Mode toggle(模式转换),来切换数值显示的类型。看一下上面找出来的那几个,无论是1xxxxxxxx这一串十位数的整数,还是那一串十六进制数,根本看不懂,因为那是给机器看的,只有机器才看得懂。而切换成常规的小数,人就可以看懂了。
接下来左边的光标移动到[H+1084F741C]上,按下X将数值锁定住,再返回游戏看看,抽卡的冷却动画是否被暂停住。
试了一下并没有,锁定住数值,抽卡的冷却时间计时器依旧再进行,看来是之前的搜索思路出了点问题。
我不认为是之前规划的的范围有问题,可能数值变化上有问题,那么这次再来一次重新搜索,数值变化这一块反向去搜。
这一回我打算,当冷却时间计时器减少时,搜索++,当完成抽卡动作,计时器重置,搜索–。左边的搜索结果就按“-”,“X”,先删掉吧,没用了。
再次经过一轮搜索后,又抓到了一个非常可疑的地址,[H+109D6EBA4],按X锁定住看看。
果然就是它,在这一行锁定住之后,抽卡的动画就定住了,稍微观察一下后发现,这个地址上的值,在等于4.0时,就会执行抽卡,然后数值变为0,重新开始递增,大概意思就是,人物每隔4秒抽一张卡吧。
做老金就是这样,有经验的成分,也有赌的成分,找不出来,不要气馁,不要放弃,换个方法去搜,换个姿势去搜,实在不行再去洗把脸,或许就能找出来了。
那么接下来就是,添加书签,设置断点,追踪程序,这三个步骤上一篇讲过了,这里不再重复讲。
触发断点后,这回抓到了两行程序,分别是
[M+0x01997C00] STR s0,[x19,#0xf4]
[M+0x01998480] STR wzr,[x0,#0xf4]
wzr是零寄存器,作用就是将我找到的那个数值归零的程序,大概就是在完成抽卡动作后,将数值清零,用的就是它,这行与我要修改的目的无关,不管它,主要看[M+0x01997C00]这一行。
左边光标选择[M+0x01997C00]这一行,按x查看程序,再选择page up向上翻页,开始程序分析
绝大多数游戏,LDR和STR配对的,有输出就自然就有加载,一般我也只看从LDR到STR之间的这一段,对于修改来说,是够用的,除非你想溯源到更高权限的根源去进行修改,或者游戏开发者把程序写得非常恶心。
这段程序就非常的简单,[x19,#0xf4]这个位置,就是我刚才找到的冷却时间的地址,所以整段程序的意思就是
LDR s0,[x19,#0xf4] 加载内存中计时器的数值至s0
FADD s0,s0,s8 将s0加上s8的数值,赋值给s0
STR s0,[x19,#0xf4] 将经过计算的s0写回刚才加载的位置
S0是当前冷却时间计时器对应的值,S8是游戏中控制时间增量的数值,从别的程序跳过来的。
最关键的就是这一行,FADD s0,s0,s8,只要将这一行加法的功能进一步放大,使其能增加更多的值,就可以提高游戏中抽卡的速度。
但显然这个位置并没有足够的地方,够我去编写程序,因此就需要Code cave来对其进行修改。
Breeze提供了自动生成Code cave的功能,不需要自己的去找,非常方便。
此时只需要在FADD FADD s0,s0,s8这一行上,按ZL+Y,命名,添加进金手指。
退回Breeze的主页,进入cheats菜单,左边选中刚才添加进来的代码,按ZL进入Edit Cheats菜单(编辑金手指)
就可以看到刚才添加进来的金手指了,选择Toggle Disassembly在机器码与汇编码之间互转,先转成汇编码。
接下来左边选中金手指代码,按ZL+↑ (Add ASM),就可以自动生成Code cave了
一下子多了好几行,第一行是还原码,程序未修改的样子。第二行就是修改码,程序修改后的样子,已经被Breeze自动修改为跳转进Code cave所在的地址了。
再往后的第三行到第五行就是Breeze自动生成的Code cave地址。同时第五行也被自动修改为跳转至原程序地址+4的位置,也就是原程序的下一行代码,这一行也不需要再修改。
只需要简单修改一下第三行和第四行,改一个浮点数的两行我觉得够用了,如果你想尝试更花里胡哨的改法,地址不够用,再自己添加几行地址吧。
左边选择要修改的行,按右摇杆进行编辑(ASM edit)将程序修改为这个样子
FADD s0,s0,s8 还原原程序
FADD s0,s0,s0 新增修改,将s0增加s0后赋值给s0,其实就是给s0再翻一倍。
上面已经说过了,浮点数本身数值是其实是非常大的,翻一倍这个数值,应该能改到瞬间把卡抽满。
把金手指打开,进游戏测试一下,测试ok。
再按一下Toggle Disassembly转换成机器码,就得到了这样一串代码。
[time_hack]
04000000 01997BFC 1E282800
04000000 01997BFC 14599C25
04000000 02FFEC90 1E282800
04000000 02FFEC94 1E202800
04000000 02FFEC98 17A663DA
这就是大家常用的金手指代码,看不懂当然也没关系,反正机器码是给机器看的又不是给人看的。
之后别忘了在退出来之前用一下Write Cheat to file,将金手指写入到文件。就可以在switch/breeze/cheats/TID/BID.txt查看到刚才制作的金手指代码,非常方便,一行代码都不用自己写。
再将txt里的代码简单编辑一下,变成方便使用的样子
[快速抽卡]
04000000 01997BFC 14599C25
04000000 02FFEC90 1E282800
04000000 02FFEC94 1E202800
04000000 02FFEC98 17A663DA
[关闭快速抽卡]
04000000 01997BFC 1E282800
这就是本篇教程最终的成果了。
如您从本文得到了有价值的信息或帮助,请考虑扫描文末二维码捐赠和鼓励。
如本文对您有用,捐赠和留言 将是对我最好的支持~(捐赠可转为站内积分)
如愿意,请向朋友推荐本站,谢谢。
尊重他人劳动成果。转载请务必附上原文链接,我将感激不尽。
留言