2017.9.22

《精灵宝可梦》第二世代游戏漏洞梳理

由Xzonn对《精灵宝可梦 金/银/水晶版》部分漏洞梳理。包括克隆漏洞、捕虫大赛数据复制漏洞、代币盒漏洞、错误维度、时拉比的蛋、不战而胜漏洞。

《精灵宝可梦》第二世代游戏漏洞梳理
《精灵宝可梦》第二世代游戏漏洞梳理

说明

本文最初写于2017年9月22日,发表于百度贴吧和bilibili。当时正值《精灵宝可梦 金/银》3DS虚拟控制台版发行,写这篇文章也有点蹭热度的味道。最初我计划写9个漏洞,但是最后坑掉了。2020年的今天,我重新整理了这篇文章提到的漏洞,也算是开始填这个史诗级的大坑。

以下漏洞均在神奇宝贝百科有记载,且在bilibili有参考视频。神奇宝贝百科的记载有一部分是被我补充完善了的,而本文所引用的视频也大多是我录制的。由于本文完全为我个人所写,难免带有一定的主观性。且本文虽然主要使用官方译名,但也会对常用的玩家译名进行解释。

克隆漏洞
克隆漏洞

1. 克隆漏洞

  • 神奇宝贝百科链接:克隆(漏洞)
  • 存在游戏:所有语言《金/银/水晶版》
  • 实用程度:高
  • 副作用:低
  • 参考视频:

克隆漏洞,有些玩家可能称之为“复制漏洞”、“复制大法”等。这个漏洞可能是第二世代最著名的游戏漏洞,或许也是很多老玩家对于第二世代印象最深刻的回忆。利用这个漏洞可以完全克隆任意宝可梦及其携带物品,因此无限大师球/神奇糖果/招式学习器等等都能通过此漏洞实现。

具体方法如下:

  1. 来到任意一个电脑前,存档。
  2. 重启后打开电脑,将要复制的宝可梦存入。
  3. 之后选择更改当前箱子,并在询问是否存档时选择“是”。在存档进行到一半时,关闭电源并重启。
  4. 再次读取存档后,可以发现:同行的宝可梦并未减少,但电脑中却有了同样的宝可梦。

一般情况下,由于本方法的克隆是“完全克隆”,宝可梦的数据不会发生变化,因此通过此方法克隆合法宝可梦得到的宝可梦仍然是合法的。然而,若控制好关机的时机,系统会在电脑中预设宝可梦的位置,但没有录入数据,借由这种情况,玩家有可能获得“失败克隆”,即得到“错误宝可梦”。这是之后“时拉比的蛋”漏洞的基础。

获得全部最初拿到的宝可梦
获得全部最初拿到的宝可梦

如果是在拿取最初拿到的宝可梦(即“御三家”)后到达吉花市宝可梦中心电脑进行此操作,之后再重新进行若叶镇至吉花市的剧情,可以领取三只最初拿到的宝可梦。但这种方法不能得到前两只宝可梦的图鉴信息,需要后期孵蛋解决。

很多人认为这个漏洞仅在《金/银》中存在,其实《水晶版》也可以触发此漏洞,只是由于《金/银》中容错的时间较长,而在《水晶版》第3步中重启的时间相对靠后且容错时间短,因此水晶版中触发此漏洞比较困难。以下视频是水晶版中获得全部最初拿到的宝可梦的流程,可以参考此视频估算《水晶版》的重启时间。

此外,在第一世代中也存在这这个漏洞,但要求更为严格,一旦操作时间不对就会造成存档损坏,因此不建议在第一世代实机上触发这个漏洞。

关于此漏洞出现的原因,我个人认为是游戏在存档时将箱子中宝可梦的数据和同行的宝可梦数据分别保存,由于存档保存时间较长,而游戏又没有检查存档是否保存完整,因此出现了这种漏洞。

捕虫大赛数据复制漏洞
捕虫大赛数据复制漏洞

2. 捕虫大赛数据复制漏洞

捕虫大赛数据复制漏洞也被称为“另一个复制漏洞”,但此漏洞与上方所述的“克隆漏洞”有所差异。这一漏洞并不能完美地复制宝可梦的数据结构,原因在于此漏洞复制的数据来自两只宝可梦,因此不属于克隆而属于“杂交”。顺带一提,这个漏洞之前被某知名up主制作了解说视频,但目前已被删除,因此将引用的视频改为我自己录制的版本。

具体方法如下:

  1. 首先,准备一只会飞翔或瞬间移动的宝可梦并放在首位,并将要复制种类的宝可梦放在第2位(记为“受体”),将要复制数据的宝可梦放在第6位(记为“供体”)。然后放入4只其他的宝可梦。
  2. 其次,从任意一侧的入口处询问工作人员进入捕虫大赛。
  3. 然后,进入自然公园后,返回任意一侧出口。当工作人员问是否结束时,选择不结束。
  4. 之后,主角会再次进入自然公园,此时立即打开菜单,用飞翔或瞬间移动离开。
  5. 之后将任意5只宝可梦存入电脑。
  6. 然后,从第3步一侧的入口处再次进入自然公园,并结束捕虫大赛活动。
  7. 最后,查看宝可梦,会发现队伍第2位出现了一只宝可梦。

如果“受体”“供体”是不同种的宝可梦,那么通过这种方法获得的“杂交宝可梦”是一种不稳定的非法宝可梦,不能在第二世代游戏间互相交换。利用这个漏洞可以获得进化形态的异色宝可梦,方法是在愤怒之湖捕捉红色暴鲤龙作为“供体”,想要获得异色宝可梦的进化前形态作为“受体”,之后进行上述操作,当获得的宝可梦升级后就能得到想要的异色宝可梦。

这只杂交宝可梦的具体表现为:

  • 此宝可梦在同行的宝可梦中的种类与宝可梦“受体”相同,但对战中形象是宝可梦“供体”的形象;其各项数值也与“供体”相同。以上述参考视频为例,“受体”为火恐龙,“供体”为红色暴鲤龙。在同行的宝可梦中查看时,杂交宝可梦为火恐龙,而对战时则为红色暴鲤龙。
  • 如果将这只宝可梦存入培育屋,再取出时,这只宝可梦的种类会变为宝可梦“供体”的种类。仍以上述参考视频为例,如果存入培育屋再取出则会得到另一只红色暴鲤龙。
  • 如果这只宝可梦可以进化,它的种类会变成宝可梦“受体”进化后的种类,其对战形象也会变为宝可梦“受体”进化后的形象。仍以上述参考视频为例,杂交宝可梦升至36级后进化为了喷火龙。
  • 这只宝可梦对战后,如果其现有经验值对应的等级低于现有等级,则其等级会先升至255级,然后回到1级并升级至正确的等级。

关于此漏洞出现的原因,我个人认为是由于捕虫大赛的机制需要让主角后5只同行的宝可梦暂时不可见,因此游戏暂时存储了第2只宝可梦在队伍中的形象,并将其替换为了“无宝可梦”,在捕虫大赛结束后恢复。由于游戏没有考虑到玩家离开的情况,因此当玩家将后5只宝可梦保存到电脑并结束捕虫大赛时,游戏将第2只宝可梦的形象写入了空白位置。而第2只宝可梦的数据则是原来的数据,在保存到电脑的过程中第6只宝可梦的数据上移到第2只,才导致了这样的结果。

这一漏洞在海外版和日文《水晶版》被修复。

3. 代币盒漏洞

代币盒漏洞是由听完宝可梦的叫声后使用代币盒引起的一系列游戏漏洞。利用这个漏洞可能会使游戏崩溃重启,或是执行一些代码。

关于此漏洞产生的原因,Glitch City Laboratories上给出了如下解释:

在日文《金/银》中对话文本的终止符为0x57,而英文《金/银》的终止符本应为0x50,但在代币盒的文本“Coins: (n)”中的终止符被错误使用了与日文相同的0x57。这使得游戏跳转到了RAM的地址0xE112(这一地址实质上是0xC112),并可以执行该地址处的代码。

这一地址处的代码会因宝可梦的叫声而改变,在玩家没有播放叫声时被0x00填充,因此什么都不会发生。而玩家播放叫声之后代码不再是0x00,一些宝可梦的叫声会使游戏进入错误维度,或是显示错误的文本等。

腕力、喇叭芽等宝可梦的叫声中含有代码0x33(位于地址0xE117),代表了指令inc sp(increment stack pointer,栈指针增加),造成接下来的指令ret(return,返回)指向地址0xEB12,这包括了地图数据注:此处原文为“overworld data”,我不确定该如何翻译。下方“地图数据”一词同样指代原文的“overworld data”。。目前尚不知道这部分数据如何计算得到的,但通过以特定方式移动可以保证这部分数据是恒定的。

通过特定的移动方式修改地图数据,可以让游戏跳转到可被控制的内存地址。

对于“从若叶镇空木研究所出来向右走四步”的方法,游戏会跳转到地址0xFA98(实质上是0xDA98),这一地址是第3只同行的宝可梦的攻击的基础点数。

对于“从吉花市友好商店出来向右走四步”的方法,游戏会跳转到地址0xFA99(实质上是0xDA99),这一地址是第3只同行的宝可梦的防御的基础点数。

这一漏洞未在日文《金/银》原版出现,也未在其他语言版本中出现,并在英文《水晶版》中被修复。

这一漏洞的应用比较复杂,但可以执行任意代码,达到“任意代码注入”的效果。

下面举两个相对简单的实例:

实例1:读取未使用的游戏数据
读取未使用的游戏数据
读取未使用的游戏数据

准备:

  1. 携带HP增强剂、首位招式为梦话的沼王并将其放在第4位。
  2. 一只新捕捉的、无基础点数的宝可梦并将其放在第3位。
  3. 电脑中的道具按照以下次序排列:
*任意道具* × *任意数目*
*任意道具* × 4
PP提升剂 × 56
命中强化 × 99
黑色眼镜 × 44
要害攻击 × 44
要害攻击 × 44
招式学习器16 × 1

然后玩家需要回到空木研究所,保存游戏,出来并向右走4步,听腕力等宝可梦的叫声并使用代币盒,游戏可能会读取未使用的游戏数据。这个小游戏并未在正作中出现,可能是废案或是遗留的数据。

实例2:获得时拉比
获得时拉比
获得时拉比

准备:

  1. 低等级的、将要变成时拉比的宝可梦并将其放在第1位。
  2. 携带HP增强剂、首位招式为梦话的沼王并将其放在第4位。
  3. 一只新捕捉的、无基础点数的宝可梦并将其放在第3位。
  4. 电脑中的道具按照以下次序排列:
*任意道具* × *任意数目*
*任意道具* × 38
招式学习器27 × 2
美味之水 × 42
可爱邮件 × 1
秘传学习器07 × 1
精灵球 × 65
超级球 × 4
不变之石 × 1
*任意道具* × *任意数目*
冲浪邮件 × 51
万灵药 × 18
花案邮件 × 46
秘传学习器03 × 1
速度强化 × 1
招式学习器06 × 1
*任意道具* × *任意数目*
招式学习器41 × 1

然后玩家需要回到空木研究所,保存游戏,出来并向右走4步,听腕力等宝可梦的叫声并使用代币盒。之后玩家的第一只宝可梦会变成与“捕虫大赛数据复制漏洞”得到的宝可梦类似的“杂交宝可梦”,其对战中形象(“供体”)为时拉比。将其存入饲育屋后取出即可得到稳定的时拉比。

获得其他宝可梦
获得其他宝可梦

在上述两个实例中都用到了一只新捕捉的宝可梦和特殊条件的沼王。如上文引用的解释所说,游戏跳转到第3只宝可梦的攻击/防御基础点数,而新捕捉的宝可梦基础点数为0,于是游戏顺序读取了第4只宝可梦的数据。沼王的种类、携带物品HP增强剂、第一个招式梦话的内部编号恰好是0xC3 0x1A 0xD6,对应指令jp 0xD61A(jump 0xD61A)使得游戏跳转到地址0xD61A,而这一地址恰好是电脑中第2个道具的数量。然后游戏依次向下读取数据并执行。

实例2中获取的时拉比也可以改成其他宝可梦,这需要一些基础的编程知识。内部编号表和汇编指令表可以参考:https://pastebin.com/raw/arPmsvYu。道具列表第6个“秘传学习器07 x 1”的道具类型决定了宝可梦的种类,此处由于时拉比的编号为0xfb没有对应的道具,而选择了编号最大的可得到道具“秘传学习器07”(0xf9),并在第7个道具“精灵球 x 65”后增加了“超级球 x 4”(0x04 0x04,对应指令inc b; inc b)使该地址的值增加2。若想得到梦幻(0x97),则将“秘传学习器07”改为“龙之鳞片”并删去“超级球 x 4”。

其它实例

在整理资料时我还找到了其它玩家给出的实例,列出链接,供有兴趣的玩家研究:

  • 获得?????家族:
  • 贪吃蛇:
错误维度
错误维度

4. 错误维度

  • 神奇宝贝百科链接:错误维度(漏洞)
  • 存在游戏:所有语言《皮卡丘/金/银/水晶版》
  • 实用程度:中
  • 副作用:无
  • 参考视频:

错误维度指的实际上是游戏出现了配色错误,一般不会对游戏数据造成实质性影响。如果游戏执行了错误代码,那么游戏会重启并使用错误配色,即进入了错误维度。如果想解除漏洞影响,仅需正常重启即可。

关于此漏洞产生的原因,@Sakura12546 给出了如下解释:

内存读取色彩配置出现溢出,不影响游戏。顺带说句,以前的游戏机颜色不仅要写入内存,还要CPU写缓存得出画面。所以颜色是CPU写缓存得出的,后来颜色大量使用就产生了显卡和GPU。只不过GPU使用的比显卡少,GPU主要辅助显卡处理图像。

触发方法包括:

  1. 听取腕力等宝可梦的叫声后触发代币盒漏洞。
  2. 使用“穿墙术”走出地图外。
  3. 《皮卡丘》中的错误招式“—”。
  4. 《水晶版》中的错误招式“TM52 (FC)注:此处的下标表示内部编号,16进制。以下所有类似写法含义均相似。,“TM54 (FE)”。
  5. 《皮卡丘》中,对方队伍有“MissingNo.”。

触发此漏洞后,游戏会认为运行在Game Boy平台,因此游戏配色不会改变,无法获得神秘礼物,而《水晶版》无法运行。此外还有一些附加效果,如一些需要闪光的洞穴可以在不使用闪光的情况下看清,没有淡入淡出效果等。有趣的是,在《金》中进入错误维度可能会是开始界面的凤王变成“正常”配色;而在正常游戏中这只凤王是黑色的。

有时游戏可能会进入一种近乎全白的状态,即为“影子戏剧”。在“影子戏剧”中,几乎一切都是白色的,包括地图、菜单、对战时的宝可梦等。NPC的图像只有轮廓可见,而在战斗中的一些招式动画也是可见的。

时拉比的蛋
时拉比的蛋

5. 时拉比的蛋

  • 神奇宝贝百科链接:时拉比的蛋(漏洞)
  • 存在游戏:所有语言《金/银/水晶版》
  • 实用程度:高
  • 副作用:高
  • 参考视频:

提醒:这个漏洞可能会造成存档损坏等后果,想要触发者请慎重考虑!!!

时拉比的蛋是利用错误宝可梦“????? (00)”的隐身功能得到幻之宝可梦时拉比的一个漏洞,最早由 @Paco81 记录于Glitch City Laboratories网站。利用这个漏洞理论上可以获得任何宝可梦和道具,但实际上存在操作上的困难。

@萌x主x席 曾经在2011年的帖子https://tieba.baidu.com/p/1207548825的321楼讲过这个漏洞,并给出了存档的115网盘提取码,然而几年后115网盘提取码失效,因此我自己尝试并得出了一个可用的存档:1eSFkwhW。这个存档的同行的宝可梦有一个蛋,里面是“????? (00)”,可以用来测试或者复制(孵化后的“?????”在电脑中不可见因此无法复制)。

要求:

  1. 一个第3个招式为围攻的蛋。最可行的方法是学会了围攻的两只异性狃拉,再将两只狃拉的围攻招式排在第3位,即确保该招式能够被遗传,并把这两只狃拉放进培育屋生蛋。将获得的蛋存入电脑,并确保培育屋中至少有一个空位。
  2. 一只错误宝可梦“????? (00)”。可以采用前文所述的“克隆漏洞”,如果控制好关机时机可能会得到此错误宝可梦。然而触发的时机极难控制,因此玩家可能会耗费大量的经历用于此步操作。也可用“代币盒漏洞”获得。
  3. 其他任意6只宝可梦。这6只宝可梦最好是常见的,因为触发漏洞的步骤会使这6只宝可梦的数据被打乱。

具体方法:

  1. 使队伍中共有6只宝可梦,其中队首为错误宝可梦“?????”。而这只错误宝可梦有“隐身”功能,即在电脑上查看队伍时,“?????”及它后面的宝可梦会变得不可见。此时用电脑的“移动宝可梦而不切换箱子”(Move PKMN w/o mail)功能,将任意一只宝可梦移到队伍首位,此时这只宝可梦的名字会变为其初训家的名字。
  2. 这时,队伍中会有7只宝可梦,为了防止以后的进程出现错误,需再把错误宝可梦“?????”放入培育屋。
  3. 之后通过任意电脑,将队伍里的第1、2只宝可梦放进电脑里,然后将要求中第1步获得的蛋排到队伍第1位,再将除了蛋之外的宝可梦全都存入电脑。
  4. 现在队伍中只有一个蛋而没有能够战斗的宝可梦(这在正常情况下是不可能的),为避免发生错误,需要找一个不会涉及战斗的地方把蛋孵化出来。
  5. 孵化成功后,玩家会获得一只时拉比。但还没完全结束,因为这只时拉比是0级的。可以通过神奇糖果或将其存入培育屋使其升至2级以上,便可获得正常的时拉比。

关于此漏洞出现的原因,我个人认为是“????? 00”使得游戏认为没有同行的宝可梦,从而使玩家可以取出1只宝可梦使同行的宝可梦变为7只。然后的操作会使宝可梦的数据结构重排,因此会使蛋变为杂交宝可梦,供体为时拉比。当其孵化后,即变成了正常的宝可梦。

这个漏洞根据原有蛋中第3个招式的内部编号来决定孵化出任意宝可梦,而孵化出的宝可梦携带的道具由第4个招式的内部编号决定。在示例中,原有蛋的第3个招式是围攻(0xfb),对应宝可梦中的时拉比。第四个招式是乱抓(0x9a),对应道具中的卡比丘。

利用这个原理也可以孵化出其它宝可梦或获得道具。若用第3个招式是跃起(0x96)的蛋触发漏洞,孵化出来的宝可梦就是超梦。而用第4个招式是反射壁(0x73)的蛋触发漏洞,孵化出来的宝可梦会携带GS球。

由于挣扎(0xa5)正常情况下不能学会,因此其对应的宝可梦芭瓢虫不能通过此漏洞获得,同理月亮球也不能通过此漏洞获得。

在第3步中,存入电脑的6只宝可梦的数据可能会被打乱。有些可能会变为“失败克隆”,但也有些会变为“混合宝可梦”,即对战外形象与对战形象不同。这些宝可梦的数据也已经被打乱,而且可能会变为错误宝可梦或是携带错误道具。有时候,这些宝可梦还会感染宝可病毒。

而触发此漏洞后取出“????? (00)”,它会变成“????? (FF)”。这只宝可梦是触发“不战而胜漏洞”的前提。

不战而胜漏洞
不战而胜漏洞

6. 不战而胜漏洞

这个漏洞利用了“????? (FF)”的“隐身”功能。在宝可梦中心回复宝可梦时,这只宝可梦及后面的宝可梦不会被回复。如果将这只错误宝可梦排在队伍首位,并在战斗中陷入濒死状态,玩家只会被传送至宝可梦中心,而同行的宝可梦不会被回复。这意味着玩家可以在没有能作战宝可梦的情况下走动,此时若触发对战,游戏会自动判定玩家胜利。因此玩家可以利用这个方法轻易通关。这是由于游戏不会在对战外判定队伍中是否有能对战的宝可梦。

第一世代中的错误宝可梦“M (FF)”也有类似功能,但与第二世代的游戏不同,第一世代中即使在对战外游戏也会判定队伍中是否有能对战的宝可梦,因此玩家会“寸步难行”,且此时若触发对战,游戏会自动判定玩家战败,因而后者也可称为“不战而败漏洞”。

“错误蛋”也有类似效果,因为游戏不会回复蛋。

如果利用所谓的“穿墙术”在没有宝可梦的情况下触发对战,也会发生相应的结果。

后记

以上内容是我在2017年9月写下的,在2020年进行了一些修订。原计划介绍的9个漏洞中,除上述6个漏洞外,还包括:重要物品合并漏洞城都宝可梦漏洞进化形交换漏洞。如果之后有时间的话,我再慢慢填坑吧。

如果需要在留言中发布图片,请前往GitHub上的Discussions。您也可以通过bilibili的私信功能与我联系。