- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
(如果这是错误的地方,我很抱歉。我认为这肯定与编程相关,但如果这属于其他网站,请告诉我)
我从小就玩神奇宝贝红和蓝,这些游戏非常有趣,但因存在许多可利用的故障而臭名昭著(例如,请参阅 this ridiculous speedrun of the game,它使用内存损坏将项目屏幕变成十六进制编辑器)。
最近,我发现了游戏中一个有趣的速通游戏,它使用了一个名为“ZZAZZ 故障”的故障来破坏重要的内存位置,并让玩家几乎立即赢得游戏。根据 the author's description of the speedrun ,ZZAZZ 故障的工作原理如下:
To start a Trainer battle, the game needs to load a lot of data, such as [...] the money he'll concede if defeated. When it loads the money is where things can get really ugly. For reasons that are beyond me, money is stored in a completely different manner, the game uses a data structure of three bytes and instead of converting the value to binary, it stores it in "human" representation. For example, $123456 would be stored as 0x123456 instead of 0x01E240, the proper conversion.
[Some invalid entries in the Trainer table] point to location with invalid money data. When the game tries to perform arithmetic with these data in said structure, it goes nuts and starts overwriting huge portions of RAM. More specifically, for every block of three bytes, two of them will contain 0x9999 (the maximum amount of money a trainer could give). This pattern repeats itself many times through RAM. To see this better, I recommend pausing the video on the emulator after the ZZAZZ trainer is faced and set VBA's memory viewer to 0xD070.
这种分析是有道理的,但作为一名程序员,我忍不住想知道程序员到底是如何编写使这成为可能的代码的。如果输入不是有效的十六进制编码的十进制数,我能想到的编写将十六进制编码的十进制数转换为十进制数的函数的方法都不会开始用 0x9999 填充随机内存块。
我的问题是 - 如果没有专门设计以这种方式失败的算法,是否有一种从十六进制编码的十进制到十进制的转换的直接实现,当输入无效值时可能会导致这种内存损坏?
再次,如果这是题外话,我深表歉意。我的想法是,这个网站上的其他程序员可能也是玩这个游戏长大的,这听起来像是逆向工程中的一个有趣的练习,试图找出这样的故障是如何可能发生的。
最佳答案
老实说,我的猜测是,这只是某人在目标上编写第一款游戏时出现的一个愚蠢而令人讨厌的故障。 《口袋妖怪红/蓝》是该系列中的第一个,并且有很多其他故障,任天堂通常会排除批处理测试,我想知道它是如何通过的。滚动屏幕移动问题是让我困扰的一个问题。无论如何,谁知道他们在想什么。也许这个区域是通过脚本写入的,因此存储的内容不同。也许位模式 0x0101
用于显示内存已释放,并且该代码意外地在奇怪的地方变得疯狂。我可以翻阅 Z80 代码并在该平台上重温我自己的游戏开发时间,但是呃。尝试解密他们的想法需要太多工作。
不过确实赚了很多钱......
好吧,你已经赏金了。我花了更多的时间仔细记忆,为你找到了一个花絮。 GBC/DMG 有一个称为DAA
的操作码。小数调整累加器 (A)。其作用是将累加器中的值转换为 BCD 格式。您看到的内存区域已经采用 BCD
格式:http://en.wikipedia.org/wiki/Binary-coded_decimal
现在我可以告诉你,在我手工编写游戏 Z80 汇编程序的 4 年左右的时间里,我从来没有需要过这个操作码,只在我们制作的棒球游戏中看到它使用过一次,用于显示一些内容分数。虽然它是 1 周期算术指令,但我在正常编码中从未真正找到它的良好用途。唔。实际上我还保留着任天堂的 DMG 技术文档。想想吧;)无论如何,除了它以时髦的方式与许多标志混淆之外,它也没有什么令人兴奋的。
我的猜测是该表被假定为 BCD
格式。将其更改为该格式之外的内容会导致内部数学变得极其困惑 - 在不应该设置的情况下设置进位和零标志。这会导致从一列溢出到下一列,从而导致计算非常大的数字。如果不直接查看读取该区域的相关操作码,我不能肯定地说,但我猜测这里有一个包罗万象的检查,表明在 BCD 完成后是否仍设置进位> 数学,设置最大值而不是存储负值或越界值。该指令或 DAA
指令在接收垃圾数据时返回 0x99
作为其返回值,尽管我对此不太确定。
希望这有帮助...
关于decimal - 解构神奇宝贝故障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6876642/
我在寻找有关 JavaScript 解构的信息,并在 Packt Publication 的视频系列中找到了视频“解构赋值”。在视频的一开始,我看到了以下代码: var [a, b] = [1,2,3
知识渊博的人可以帮助我理解 Scalaz 的工作原理吗?和 co.有效吗?我是 Scalaz 的新手,有点迷失在探索中。 我想做的是在 List 中累积错误,例如 (v0 v1) foldLeft
Haskell 中的模式匹配可以用这种方式解构数字吗: f (n + 1) = n 我期望 ex 的前身:f 6 = 5、f 5 = 4 等。 我在这里找到了这种模式匹配用法: https://wik
我有一个与此类似的文件: const COLORS = { PRIMARY_COLOR: 'red', SECONDARY_COLOR: 'green' }; const APP = {
作为对 SO 问题的回答,我构建了一个循环函数,并构建了我迄今为止最复杂的解构,这奇迹般地起作用了: (defn fib? [a b & [c & r]] (if (= c (+ a b))
我对破坏感到困惑。 我在其中使用了 React,我们这样做了 const [ books, setBooks ] = useState([{a:'v'}] 和 const {books} = useC
我确定这在某个地方得到了回答,但我缺乏制定搜索的词汇。 #include class Thing { public: int value; Thing(); virtual ~Thing()
如果我在 javascript 中有这样一个对象: let obj = {b: 3, c: 4, d: 6} 如果我解构它,我可以很容易地得到不同的部分,例如,如果我这样做,我可以得到 c 和 d:
这个问题在这里已经有了答案: One-liner to take some properties from object in ES 6 (11 个回答) 2年前关闭。 我似乎不记得如何写这个解构模式
我有一个函数可以查询我的数据库中最近的 X 个条目,它返回一个 map 向量,如下所示: [{:itemID "item1" :category "stuff" :price 5} {:itemI
根据所选语言,我需要销毁对象并获得所需的值。 我该怎么做才能不破坏整个对象? const translate = { "navMenu1": { "en": "Menu 1",
我试图理解这种 ES6 解构。有人可以解释这行代码将编译成什么吗? const { loading, route: { pageName = 'default' } = {} } = this.pro
我有一个程序,可以输出这样的一些条件(这是实际输出,它是伪代码): if ( first occurance of 'AB' -0.5 ) * (( number of products viewe
Serilog的@的目的是什么?句法? 如果我运行以下命令: var dummy = new { Foo = "Bar", Date = DateTime.Now }; Log.Information
JSON 编码的数组从 PHP 传递到 HTML 文档。目前还不清楚如何将该数组解构为 javascript 可用的片段。例如,考虑以下 HTML: {"foo":[{"id":1},{"id":3}
我正在 Chrome 的控制台选项卡中尝试使用以下代码进行 JavaScript 解构,这给了我未捕获的语法错误:标识符“a”已被声明异常 o = { a: "foo", b: 12, c: "bar
我有一个 JavaSCript 对象 person,其中包含 id、name、phone 和 地址属性。我想修改属性名称并将它们放入新对象 personData 中。这可以一步完成吗?: 第 1 步(
有没有办法从 WPF 中获取 Geometry 实例的内部结构? 我需要转换一串用户输入的几何数据,例如 M10,100 C10,300 300,-200 300,100 Z 用于分离几何命令(移动、
我的代码中有一个 promise : req.getValidationResult() .then(result => { let errors = resu
我正在为 Apollo Client 生成 Flow 类型,我目前有这个: type FetchModuleQuery = {| // Fetch single module module:
我是一名优秀的程序员,十分优秀!