自1993年12月发布以来,这款曾凭借惊人宣传攻势席卷早期互联网的PC游戏《毁灭战士》(DOOM)不仅奠定了初生第一人称射击游戏类型的基本范式,其影响力之巨更使得“类毁灭战士游戏”成为此后多年间对该类游戏的统称。三十二年来,凭借海量模组与用户自定义关卡,玩家们在这款游戏中投入了数以亿计的时间,但几乎没人会让游戏持续运行两年以上——至少有一位玩家这么做了,而结果是……游戏崩溃了。

Cover Image

网站管理员Minki在LenOwO平台发文称,他通过在一台2003年生产的华硕MyPal A620掌上电脑(搭载英特尔XScale ARMv5处理器与当年新兴的Windows Mobile系统)上运行WinDOOM程序,成功复现了预期中的崩溃现象。据其描述,该设备经过改装采用“基于18650锂电池的自制UPS系统,并持续通过路由器USB端口获取5V供电”。这套系统一直默默运行直至昨日,他才发现设备屏幕上弹出的应用程序崩溃提示。

与同时代多数源码移植版本类似,WinDOOM基于1997年发布的原始代码构建,因此完美复刻了原版游戏的特性与缺陷。如同多数大型商业软件,《毁灭战士》即便在最终1.9版本中仍存在大量已知漏洞,其中一个奇特现象是:当内部回放用于宣传循环的“演示”文件时,“gametic”(游戏时钟计数)值不会随着新演示开始而重置。这个以35Hz频率递增的数值用于多线程计时,独立于游戏渲染循环之外。

无需高等数学知识即可推知:永不重置的gametic值随时间推移将累积为天文数字。主程序员约翰·卡马克(John Carmack)编程时必然意识到这点,但可能认为无伤大雅——该值采用32位有符号整数存储,最高可达2,147,483,647计数后溢出。虽然在C语言中整数溢出属于未定义行为,但在x86架构PC上通常会导致数值跳变至负最大值-2,147,483,647。毫不意外,游戏对此处理机制欠佳(至少Windows Mobile 2003系统上),最终导致崩溃。

按每秒35计数频率计算,约需1.95年就会触发溢出,略低于Minki的预估。考虑到无人知晓这台华硕PDA在弹出错误前实际运行时长(从照片看这台22年前的掌机显然不受日常关注),且其使用的Doom4CE移植版很可能为优化帧率将计数频率降至30Hz(类似Jaguar和超任主机版的处理方式),若属实则溢出时间将延长至2.26年,更接近其声称的2.5年。

无论如何,此事启示我们:切勿让《毁灭战士》持续运行两年——或许任何游戏客户端(非专用服务器)都应如此。Minki的实验既体现了科学严谨性(即使对无关结论的实验验证),也展现了废旧硬件巧思再利用的价值,这恰是Len0w0论坛的核心精神,值得为这项无人问津却坚持完成的工作致以敬意。


文章标签: #毁灭战士 #整数溢出 #华硕PDA #程序漏洞 #硬件实验

负责编辑

  菠萝老师先生 

  让你的每一个瞬间都充满意义地生活,因为在生命的尽头,衡量的不是你活了多少年,而是你如何度过这些年。