查看原文
其他

GTA 5 祖传代码被修复,这位黑客喜提一笔“年终奖”

文章来源:安全圈

折磨全球无数 GTA 5 玩家的联机版超长加载时间问题,终于要修复了。


什么?R 星主动改善玩家游戏体验?不存在的。


打开 GTA 5 联机版,要跑 19.8 亿次 if 语句,一支烟的功夫游戏都加载不完。这堪称游戏开发史上最大的 " 屎山 " 代码,存在了 7 年,R 星从没想过要修复……


玩家对 GTA 5 联机版可谓又爱又恨,有人甚至破口大骂:



直到一位黑客大哥路过,实在忍不了恶臭的代码,嘲讽完 R 星后,随手按了 " 冲水键 ",直接将等待时间压缩 70%。


鉴于 R 星失误实在太低级太离谱,而这位老哥的方法又太有效,以致无数玩家称他 " 功德无量 "。


如果平均给每个玩家节省 10 秒,全球 500 万玩家一天就能节约 5000 万秒,一年中,节约的总时间大概能有数十年。相当于挽救了十多个人的生命!


R 星这才坐不住了,赶忙官宣修复 bug,不但采用了黑客的方案,还大方的给他奖励了 1 万美元 " 赏金 "。


黑客 " 治病救人 "


不久前,量子位曾经介绍过黑客大哥通过逆编译器检查 GTA 5,并且重写代码,一下节约 70% 加载时间的故事。


先来前情回顾一下。


简单地说,就是 GTA 5 联机版加载时间长得过分,有超过 80% 的玩家要等 3 分钟以上,有的人甚至要等 15~20 分钟。



一位黑客大哥实在忍不了,于是决定开扒 GTA 5 的代码,看看到底是哪里出了问题。


首先,他用 Windows 任务管理器,来判断联机版 GTA 5 在启动时,都调用了哪些计算机资源。



在 1 分钟的时间分界线上,之前是加载的是单机和联机版通用的基础内容,之后是联机版独有的内容。


可以看到,联机版 GTA 5,加载时调用大量 CPU 资源至少长达 4 分钟之久,而同时,内存、GPU、硬盘的使用情况几乎没有明显变化。

所以,问题大概率出在代码上。


黑客大哥说:


我闻到一股烂代码的味道……


为了找出到底那一部分程序卡住了 CPU,他使用了工具 Luke Stackwalker,对 CPU 任务堆栈进行采样分析。


沿着调用栈往下走,发现问题出在一个 sscanf 函数上。



sscanf 的功能是读取格式化的字符串中的数据,而在 GTA 5 中,它正在读取的是一个 10M 左右,有 63000 多个条目的 JSON 文件。


这个文件到底是干什么用的?黑客大哥推测,这可能是游戏内购商店的相关内容。


再看第二个问题,这是一个存储命令,对象是 item,具体是什么不得而知。


但是保存前,有一个 if 语句,逐一比较 item 内项目的哈希值,检查它们是否出现在某一列表中。

按照他计算,这一步 if,要执行(63000^2+63000)/2 = 1984531500 次!


没错,等待加载前的十多分钟里,GTA 5 用你的 CPU,执行了 19.8 亿次 if 命令。


如此简单粗暴的编程思路,让这位老哥哭笑不得:


既然对象有唯一哈希值,那为什么不用 hash map?


至于 R 星为什么不修正,有网友推测,最开始,if 的循环次数并没有这么多,而是随着开发,条目不断增多,最后到了积重难返的地步。


而之前的代码结构,谁也不愿意去动。


就是这样一个低级的失误,让全球玩家至今每次打开游戏,都要上演一遍 19.8 亿次的 if 循环……


这是不是堪称游戏开发史上最意外的 " 屎山 " 代码?


如何冲掉 " 屎山 "


第一个问题,黑客大哥采用 hook 大法,不一一读取字符串,而是:


hook strlen" 缓存 " 字符串起始和当前长度。如果在字符串范围内函数在此被调用,返回缓存的值。



版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。祝愿每一位读者生活愉快!谢谢!


推荐阅读




*0day狙击:网络安全公司遭黑客组织FIN11攻击

*查获窝点5个,抓获118人,受害人遍及全国多省市!苏州警方全链条斩断一通讯网络诈骗黑灰产业链

*印度800万核酸检测结果泄露

                                                                                         

                                                                        


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存