(如果这是一个错误的地方,我很抱歉.我认为它肯定与编程相关,但如果这属于其他网站,请告诉我)
我一直在玩神奇宝贝红色和蓝色,这些游戏非常有趣,但因为有大量可利用的故障而臭名昭着(例如,看到这个使用内存损坏将项目屏幕变成十六进制编辑器的游戏的荒谬速度).
最近,我发现了一个有趣的游戏速度,使用一个名为"ZZAZZ故障"的小故障来破坏重要的记忆位置并让玩家几乎立即赢得比赛.根据作者对speedrun 的描述,ZZAZZ故障的工作原理如下:
要开始训练师之战,游戏需要加载大量数据,例如如果被击败他会承认的钱.当它加载钱时,事情会变得非常丑陋.由于超出我的原因,钱以完全不同的方式存储,游戏使用三个字节的数据结构,而不是将值转换为二进制,它将其存储在"人"表示中.例如,$ 123456将被存储为0x123456而不是0x01E240,即正确的转换.
[Trainer表中的某些无效条目]指向包含无效货币数据的位置.当游戏试图在所述结构中对这些数据进行算术运算时,它会疯狂并开始覆盖大部分RAM.更具体地说,对于每个三个字节的块,其中两个将包含0x9999(教练可以给出的最大金额).这种模式通过RAM重复多次.为了更好地看到这一点,我建议在面对ZZAZZ训练器后在模拟器上暂停视频并将VBA的内存查看器设置为0xD070.
这种分析是有道理的,但作为程序员,我不禁想知道程序员究竟是如何编写使这成为可能的代码的.如果输入不是有效的十六进制编码的十进制数,那么编写将十六进制编码的十进制数转换为十进制的函数的任何方法都不会开始用0x9999填充随机内存块.
我的问题是 - 没有专门设计算法以这种方式失败,是否有直接实现从十六进制编码的十进制到十进制的转换,当输入无效值时可能导致这种类型的内存损坏?
再说一次,如果这是偏离主题,我道歉.我的想法是,这个网站上的其他程序员也可能已经长大了玩这个游戏,这听起来像是一个有趣的逆向工程练习,试图弄清楚这样的故障怎么可能.