欢迎光临散文网 会员登陆 & 注册

究极绿宝石5.3——科普向,什么是金手指(六)

2022-01-26 17:51 作者:围巾胖头鱼  | 我要投稿

说在前面:

    前五期专栏的内容算是基本上回答了这个系列专栏题目中的问题:什么是金手指。不过,那些内容最多只能算作是理解金手指的基础知识,虽然有难度,但也只是基础。从本期专栏开始,内容将会围绕金手指进行一系列探索和挖掘,其难度和精彩程度都会超过前面的五期专栏。

    温馨提醒一下:如果阅读起来感到有困难,不妨回到之前的专栏再巩固一下基础知识。

    上期专栏提到:描述一只精灵的全部信息,100个字节就够了。还提到:利用金手指修改变量取值在映射表查找方面是能起到很大作用的。本期专栏介绍的就是利用金手指可以修改变量取值这个特点,极大地拓展我们的映射表,从而找到描述一只精灵的全部信息,究竟是哪100个字节。

    在使用金手指时,为了避免触发反作弊机制或者导致坏档,请读者们再回顾一下使用金手指的原则:

    只要是按照游戏正常流程能达到的游戏状态,使用金手指也能达到,并且不会被反作弊机制检测到,更不会导致坏档。 

利用金手指探索映射表的未知领域

    在VBA模拟器中,第二期专栏介绍的“变量地址查看器”功能,和第三、四期专栏介绍的“查找金手指”功能,本质上都是查看VBA模拟器内存中的变量,这种“查看”的操作,术语上称为读操作。第五期专栏介绍的“金手指列表”界面,可以通过输入原始代码的方式对变量进行修改,这种“修改”的操作,术语上称为写操作

    以前我们只会“读操作”的时候,想要找到变量地址或者某个变量取值的映射表,只能是手头上有什么就可以找什么。比如游戏中我们的队伍首位精灵携带了“灼伤药”这个道具,我们就可以通过第三、四期专栏“查找金手指”的方法,先找到队伍首位精灵携带道具的变量地址,然后查看这个地址处的变量取值,从而找到“灼伤药”会映射到什么数字。前提就是我们有这个“灼伤药”,如果我们没有这个道具的话,就不知道它会映射到什么数字了。这个方向,是从游戏实体映射到数字的方向。

    上期专栏介绍了“写操作”,我们就可以使用金手指将变量修改为任意值,然后回到游戏查看它对应的实体变成了什么。这个方向,是从数字映射到游戏实体的方向。

    来举个例子,作者使用一个测试的存档,目前队伍的首位精灵没有携带任何道具:

首位精灵没有携带道具

    第三期专栏提到过,队伍首位精灵携带道具映射到的变量地址是0202450e,变量取值是4位十六进制数。我们可以先用“变量地址查看器”,使用"THUMB"模式查看,转到“0202450e”这个地址,查看一下现在的变量取值是什么:

队伍首位精灵携带道具的变量取值

    可以看到,现在的变量取值是0000,因此这就是“无道具”这个状态映射到的数字。接下来,我们使用“金手指列表”,采用原始代码的格式,输入0202450e:0001,看看0001会对应到什么道具:

金手指列表

    请注意,这个界面左下的“还原为前一个数值”的框是勾选状态。因为我们不知道这么修改改出来的道具是不是按照正常游戏流程可以获得的道具,是的话还好,不是的话,万一触发反作弊机制、坏档了怎么办?所以我们只是查看一下携带道具,查看之后就将携带道具恢复到使用金手指之前的样子。点击确定后,查看精灵的概况:

精灵携带大师球

    可以看到此时首位精灵携带的道具是大师球,因此我们知道了大师球这个道具就映射到0001。

    改出来了大师球,各位也不要激动。这个大师球不是按照正常剧情流程能够获得的道具,所以使用的时候很有可能触发反作弊机制。在究极绿宝石5.3中,正常获得大师球的途径目前作者已知的有4个,一个在水舰队基地坂木的旁边,一个在大吾宅邸的西尔佛公司会长赠送,还有一个是打完彩虹火箭队之后,还是在大吾宅邸有个博士临走前会送,最后一个是水静市百货大楼抽奖可能获得。不是上述途径获得的大师球,大家会发现抓精灵必定是摇三下,然后抓不着,这就是触发了反作弊机制了。

    其实,从原理上来说,改出来的大师球和游戏中获得的大师球并没有本质区别,只是在游戏中获得大师球的时候,除了会修改背包里那个大师球对应的变量之外,游戏程序还会修改另一个变量:合法大师球的数量。当合法大师球的数量为0时,无论你修改出多少大师球都抓不着精灵。

    那有的读者会想:我要是找到了“合法大师球数量”对应的变量地址,然后把它修改成不是0的数,那我修改出来的大师球是不是就可以用了?道理没错,网上确实有“大师球解禁”这种金手指,只不过大家需要仔细看它是02开头的还是08/09开头的。上期专栏说过,08/09开头的金手指修改的是游戏程序,一旦修改,你玩的游戏就不再是究极绿宝石5了,而是一个改版了的游戏。会不会有不尊重制作组之嫌?请大家谨慎使用。

    还有另一方面的因素,让大师球这个道具意义没有那么大。比如说我们想抓拉帝欧斯/拉帝亚斯,这是公认的难抓精灵,但其实只要我们在游戏中达到了可以捕捉这种精灵的剧情流程时,我们用金手指改出来的精灵就是合法的,它模拟的过程就是我们费尽千辛万苦抓到了这只难抓的精灵,这个过程在游戏中是合法的,因此用金手指改出来也就是合法的,希望大家能认真体会使用金手指的原则!

    扯远了,让我们回到探索映射表的内容。我们把上一条金手指删掉,然后输入0202450e:0002,看看0002会对应到什么道具。把上面的过程重复一遍会发现,0002对应的道具是高级球。以此类推,0003、0004……(别忘了这是十六进制数,0009的下一个是000A,不是0010)依次探索下去,整个道具的映射表就全探索出来了!

    网上搜索“金手指代码”,会搜索到“道具代码”,然后下面列出来一整页一整页的数字和道具名称,其实这就是道具的映射表,不想自己费力去探索映射表的读者,可以直接拿过来用。不过提醒一句,那些映射表并不保证正确性,有些还没有同步到究极绿宝石5的版本,可能还是究4的映射表,如果按图索骥出了问题,那就用本期专栏的方法老老实实地自己测试。懂得了原理就会降低被误导的概率。

    上面说的全都是探索未知的变量取值,下面再举一个探索未知的变量地址的例子。

    0202450e对应的是首位精灵携带的道具,并且变量长度是4位十六进制数,也就是2个字节,那么它的下一个地址就是0202450e+2=02024510,这个变量地址有什么含义呢?

    我们现在不知道02024510这个地址处的变量的含义,也就不知道它的长度,为了保险起见,我们只修改1个字节,因为这是变量长度的最小单位。还是拿上面那个搭档伊布举例子,首先通过“变量地址查看器”,看一下02024510处的变量取值现在是多少:

02024510处的变量

    按THUMB模式查看,02024510处的取值是0b21,但是我们只想要1个字节,这是2个字节,如果读者还能回忆起第二期专栏中“小端序”的概念,就应该知道02024510处的单字节变量取值是21,而不是0b,高位放在高地址,低位放在低地址,再复习一下小端序的概念吧。

    在改动之前,我们需要将搭档伊布的概况页面再仔仔细细看一遍,争取把它的信息都记住,因为接下来输入的金手指我们不知道会改动什么地方。有的读者可能会问:要是这条金手指改的不是搭档伊布这只精灵该怎么办?对第四期专栏内容还有印象的读者,可能会记得那期专栏提到过:为了编写程序的时候便于管理,把相关的、相似的变量放在一起,找起来的时候会更方便。刚才的那个地址0202450e,改的是首位精灵,那么很大的概率上,它紧挨着的下一个地址02024510改的还是搭档伊布,只不过是它的另一条属性。

    现在我们要输入金手指了,把02024510处的取值改成00(可以修改成21之外的其他任何单字节数值,不能修改成21的原因是这里本来的取值就是21,改成21相当于没修改),看看是什么效果:

修改02024510处的变量

    注意,左下的那个“还原为前一个数值”的框还是勾选状态,原因已经说过很多次了:我们删除这条金手指后,可以把变量恢复到开金手指之前的样子。

    点击“确定后”,我们仔细看看搭档伊布发生了什么变化,来到概况的第一页,好像没什么变化;第二页,变化出现了!

新的金手指导致的变化在哪?

    这张图和上面那张搭档伊布携带大师球的图有什么不同呢?除了因为我们删掉了携带大师球的金手指,导致现在的搭档伊布恢复到没有携带道具的状态,其他地方还有什么区别?大家来找茬时间到!

    答案就是搭档伊布的经验值发生了变化,从原来的396065,减小到现在的396032,当然那个根据经验值计算出来的“再升级需”也相应发生了变化。如果还记得第五期专栏内容的话,就可以说“经验值”是非面板值,而“再升级需”就是面板值,因为“再升级需”是由“经验值”计算出来的。

    也就是说,02024510这个变量地址,映射到的就是队伍首位精灵的经验值。那么这个变量长度是多少呢?

    用win10系统的程序员模式计算器,输入十进制的396065,可以看到它的十六进制是60B21:

396065转换为其他进制

    再回过头看一下我们使用金手指之前的“变量地址查看器”,可以发现它的前两行:

    按照小端序的合并规则,其实就是

    这就和计算器里的结果对上了!因此我们可以下结论:02024510处的变量长度是8位16进制数,也就是4个字节,表示的是队伍首位精灵的经验值。这就是利用金手指探索未知的变量地址的例子。

映射表的通用性

    映射表的通用性,在第四期专栏中就提到过。其实这个通用性可以再细分一下:映射表内容的通用性,和映射表结构的通用性。第四期专栏说的其实是映射表内容的通用性。

    映射表内容的通用性,是针对变量取值来说的。例子就照抄第四期专栏的原话了:

    举例来说,队伍首位精灵的种族、野生战斗遇到的精灵种族、队伍第二位精灵的种族,用的是同一张精灵种族的映射表;精灵携带的道具、背包中存放的道具、电脑中存放的道具,用的是同一张道具的映射表;玩家的名称、精灵的名称,用的是同一张汉字的映射表……

    在这里,“队伍首位”、“野生战斗”、“背包中的”、“电脑中的”、“玩家的”、“精灵的”描述的都是实体所在的环境,真正的实体是“精灵种族”“道具”和“汉字”。由于环境的不同,这些实体的变量地址也会不同,但它们对应的映射表是同一张。例如02b0在精灵种族的映射表中代表三首恶龙,那么02b0无论是在首位精灵的精灵种族,还是野生战斗遇到的精灵种族,还是队伍第二位精灵的种族,代表的都是三首恶龙。

    映射表结构的通用性,是针对变量地址来说的。通过上面的例子和第三期专栏的例子,可以总结出来,描述一个精灵的变量地址映射表有下面这样一个片段:

    这里体现出来一个结构,就是精灵特性后面紧跟着精灵种族、精灵种族后面紧跟着携带物品,携带物品后面紧跟着经验值。这种结构是制作游戏的人设计出来的,为什么是这个顺序,可能本身没有太多的道理,但是利用映射表结构的通用性,我们马上就可以知道,对于队伍中的第二只精灵,它的变量地址肯定也有这么一个相同的结构片段,也是精灵特性后面紧跟着精灵种族、精灵种族后面紧跟着携带物品,携带物品后面紧跟着经验值。

    再结合这一条规律:为了编写程序的时候便于管理,把相关的、相似的变量放在一起,找起来的时候会更方便。(这里姑且称为“相似变量紧挨着放”)我们又会发现,描述队伍中第二只精灵的变量地址,会紧跟在描述队伍中第一只精灵的变量地址的后面,第三只紧跟在第二只的后面,以此类推。

    用第三期专栏的办法,我们很快就能找出来队伍中第二只精灵的精灵种族映射到的变量地址是02024570(不信的话可以动手试一下!)。做个减法,02024570-0202450c=64,这是十六进制的64,十进制就是100,因此作者才说:描述一只精灵的全部信息,100个字节就够了。

    利用上面的规律,我们马上就可以知道,02024572映射到的就是队伍中第二只精灵的携带物品(因为这个地址紧跟在精灵种族的后面,利用映射表结构的通用性),02024574映射到的就是队伍中第二只精灵的经验值,以此类推。

    继续做十六进制的运算:02024570+64=020245D4,这就是队伍中第三只精灵的精灵种族(利用“相似变量紧挨着放”这个规律),020245D4+64=02024638,这就是队伍中第四只精灵的精灵种族,以此类推。

    一支队伍最多六只精灵,那队伍里第六只精灵后面的地址是什么呢?继续尝试的话会发现,队伍中第六只精灵的后面,是对手队伍里的第一只精灵!如果是草丛遇到的野生精灵,单打就是描述的这一只,双打的话描述的是右面那只,左边的那只是对手队伍里的第二只精灵。如果是对战训练师的话,结构和主角队伍是一模一样的。当算到对手的第六只精灵后面的地址的时候,终于发现它映射到的不再是精灵了,这个探索过程就告一段落了。

    上面的例子,我们是从0202450e这个地址向后探索,其实也可以向前探索,看看描述队伍中的第一只精灵是从什么地址开始的。如果读者们自己动手尝试的话,就会发现描述队伍中第一只精灵,是从020244ec开始的,这个地址的含义是精灵的性格,长度4个字节

    在探索映射表的时候,总结一下三条重要的规律:

    相似变量紧挨着放、映射表内容的通用性、映射表结构的通用性。

    利用好这三条规律,探索映射表就会事半功倍。

    注:这里作者避免使用了“数组”“结构体”等编程中出现的术语,而是用自己的语言通俗地解释了这几个规律,其实了解这些编程概念的读者能够一眼看出这些数据设计的原理。

彩蛋:合法地“偷取”对方的精灵

    好久没发彩蛋了,上个彩蛋还是第二期的专栏。这期专栏给大家介绍一个合法“偷取”对方精灵的方法。

    精灵宝可梦有一个版本,是主角只能通过偷取对手的精灵来进行对战,自己是没有精灵球可以抓精灵的。我们利用上一期和本期专栏的知识,可以模拟一下“偷取”对方精灵的操作。这里的“偷取”,实际上是复制,并不是真的让对手的精灵消失了,但复制过来的精灵保证是和原版一模一样的。

    作者仍然是拿一个测试用的存档,这个存档已经来到了对战开拓区,可以找对战塔右边的桄榔进行对战,这次我们“偷”精灵的目标就是他了!

对战桄榔

    进入对战后,桄榔的首发精灵是美纳斯:

对面首发美纳斯

    稍等一下!桄榔首领,你的这只美纳斯,我可是知根知底,别看屏幕上只显示出来名称和级别,我其实连你的携带道具、技能,甚至你的努力值怎么配的我都知道!

    打开“工具——反汇编……”,来到我们熟悉的“变量地址查看器”。对手的第一只精灵地址从什么地方开始?我们可以算出来:我方的第一只精灵,地址开始的地方是020244ec,然后要跨过我方的六只精灵,而描述一只精灵需要64(16)个字节,所以计算一下:

计算020244ec+6*64

    转到02024744这个地址,桄榔首位美纳斯的信息一览无余:

美纳斯的全部信息

    按照ARM格式查看的时候,每行的变量长度是4个字节,需要25行才能包含100个字节的信息。上图蓝框中圈出来的,就是表示美纳斯这只精灵的全部信息。这些信息是什么含义呢?经过了这么多期专栏的介绍,读者们应该大致上有个了解了,比如第9行:

    取值的00db0149这里,00db代表美纳斯携带的道具是贝壳之铃,0149代表这只精灵是美纳斯。再比如说第12行和第13行:

    这两行是描述精灵的技能,005f是催眠术,003a是冰冻光束,00d5是迷人,0039是冲浪。

    更具体的信息,作者将会在下一期专栏介绍,这里就算一点都不懂也没关系,我们只需要照搬过来。只不过,桄榔的精灵不能抓,我们只能去抓一只野生的精灵。如果我们把上面的那些代码原样不动抄下来(当然要在中间加上冒号,满足原始代码的格式),那么开着这25行金手指的含义就是遇到的野生精灵就是桄榔的那只美纳斯:

    在游戏中,我们回到和桄榔对战之前的存档,把它们复制到“金手指列表”(直接从专栏中复制的话,可能会有很多空行,不过没有关系,金手指列表这个界面会自动将这些空行去掉):

遇到的野生精灵变成桄榔的美纳斯

    这个金手指开启之后,我们需要到草丛中去抓野生精灵,这段时间的金手指都是开启状态。在遇到野生精灵后:

野生精灵变成桄榔的美纳斯

    这只精灵就是对战开拓区桄榔手里的那只美纳斯了,只不过现在是可用精灵球捕捉的状态。在抓到这只精灵后,我们就需要把金手指关闭或者删除了,因为我们总不能之后碰到的每个野生精灵都是美纳斯吧。因此这25行金手指虽然只会用一次,却不是点击“确定”按钮后马上就关闭的,而是要等到我们抓到它的时候再关闭。及时关闭金手指非常重要!别因为一时兴奋忘了关,让使用金手指出现了不可预料的副作用。

    抓到这只精灵后,查看一下:

“偷”来的美纳斯

    这只美纳斯就是桄榔手里那只的完美复制品,里面有点小小的缺憾,就是精灵技能的PP数,当前值竟然超过了最大值,不过这并不关键。只要桄榔手里的那只美纳斯是合法的,我们手里的这只美纳斯也就是合法的!

    有兴趣的读者可以去尝试,这只美纳斯不管和谁去对战,都不会被删除,它的技能也不会消失,放在电脑里再拿出来或者在精灵中心回复都没问题。任何反作弊机制都检查不到这只美纳斯有什么问题,为什么?让我们再次强调使用金手指的原则:

    只要是按照游戏正常流程能达到的游戏状态,使用金手指也能达到,并且不会被反作弊机制检测到,更不会导致坏档。 

    这25行代码,模拟的是这样一个正常的游戏流程:主角和桄榔对战后,希望自己也能练一只桄榔那样的美纳斯,于是去119号道路的水路,在随机的6个钓鱼点中钓出丑丑鱼;为了配好个体值,还需要通过不断地生蛋;终于生了一个个体值合适的蛋,把它辛辛苦苦培养到100级,并配好努力值、技能和道具。

    这样,我们就成功把桄榔手里的那只美纳斯“偷”了过来。

    下一期专栏,作者打算扮演一个和神奇宝贝百科差不多的角色,只不过是围绕描述精灵的那100个字节展开,详细介绍每个地址处的变量都代表了些什么。神奇宝贝百科经常说一些和编程相关的内容,这一点在第四期专栏介绍个体值那里就举过例子了,如果不结合具体的数字会很难理解。

    如果大家还感兴趣的话,作者会继续更新!

究极绿宝石5.3——科普向,什么是金手指(六)的评论 (共 条)

分享到微博请遵守国家法律