设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 IT综合资讯 查看内容

九个非常规的游戏开发故事

2013-7-15 11:46| 发布者: joejoe0332| 查看: 1946| 评论: 0|原作者: 浅水清流|来自: 伯乐在线

摘要:   从2009年开始”非常规编程技巧”成为了开发者之间的一个热门话题,通过这个话题,我们得知了一些开发者为了按期发布或是通过测试而”发明”的非 常手段。在这里我们将为大家分享9个(带着硝烟味的)故事,包括( ...

  从2009年开始”非常规编程技巧”成为了开发者之间的一个热门话题,通过这个话题,我们得知了一些开发者为了按期发布或是通过测试而”发明”的非 常手段。在这里我们将为大家分享9个(带着硝烟味的)故事,包括(非编程的)其他开发行业的故事。阅读这篇文章,可以使你陶醉于同事的奇思妙想,并且长出 一起口气——因为你不是唯一一个在压力下掉节操的。


  1. Crouching RSX隐藏的纹理资源


  Joe Valenzuela, Insomniac Games


  这一招使用在了PS3上:当时在Insomniac的引擎团队,我们希望将一些纹理资源和我们的引擎/工具一起发布。这些资源类似于噪音纹理并且用 于全局滤镜特效。出于一些无关紧要的原因,我们没有直接发布这些资源,而是将它转为二进制数据并且编译到可执行文件之中。这样做有一个缺点,我们希望这些 资源在不同的内存块中(RSX可见),所以我们最终将它们复制出来但是浪费了一些内存。


  PS3的链接工具有一个功能可以将一些段放在RSX内存中,但是需要占用至少1MB的内存,并且在我们的需求中会浪费700KB。所以最终我们向可 执行文件中添加了一个新的数据段别名为BSS(the “bss alias” or “balias” section)。在最终发布版中我们有3MB的BSS段,这样我们有足够的空间在保存我们的纹理资源。在CRT初始化目标内存之前,我们执行一段代码, 将BSS中的纹理数据拷出,然后重新将BSS段初始化为0。


  不管你信不信,这段代码工作良好。为了适应BSS段的使用和工具的更新我们做了一些调整,不过总体来说还是很简单。

 

  2. 这不是你正在寻找的错误(Bug)


  Brett Douville, LucasArts


  在2002年,我们准备发布为Sony开发的游戏”星球大战:绝地战机”。一个琐碎的TCR bug仍然没有解决,在我们加载过关的过场动画时,这个bug会导致控制器的模拟摇杆功能关闭以及中心控制器的红灯熄灭。当我们更新为sony提供的库版 本时,这个bug被发现,而开发加载动画和IOP逻辑控制器功能的程序员已经离职了2个月。


  为了在这些我不熟悉的代码中快速的定位问题,我在7处代码可能出错的地方插入了不同颜色的清屏代码,希望通过观察控制器关闭模拟功能前的屏幕颜色来缩小错误代码的范围(很常规的采用log排查bug,这个方法的价值比故事大)。但是当我再次测试时,bug没有重现。


  有一个古老的编程谚语,如果你不知道确切的原因,你就不能说已经解决bug。但是现在我们离版本发布只剩下2-3天,而这个bug并没有什么大不了,所以我将所有的清屏颜色改为黑色,并将bug标志为已经解决,然后测试了一整天。之后我们如期发布,而TCR bug没有来搅局。


 

  3. (s)elf-exploitation


  Jonathan Garrett, Insomniac Games


  Ratchet and Clank: Up Your Arsenal是一款有着在线的名义但是很不幸缺乏在线升级功能的游戏。


  每次游戏发布需要下载并显示一个最终用户许可协议。许可协议以ASCII字符串的形式存储在静态缓冲区,缓冲区被写入从服务器下载的数据,并且不会检查缓冲区的大小。


   我们利用这个隐患,在EULA下载的时候导致静态缓冲区溢出并且覆盖了一个全局的变量。这个变量正好是处理网络数据的回调函数地址。一旦覆盖了这个变量,我们就可以发送数据,并且跳转到新的(被覆盖写入的)地址。这个地址指向了一些再下载EULA之前下载的可执行的代码。


  有效的数据在EULA缓冲区尾部和被覆盖的全局变量之间,所以代码执行的首要工作是恢复被丢弃的数据。一旦数据恢复正常,就可以开始实际的修补工作。


  一个复杂的问题是使用strcpy复制EULA文本。当strcpy发现一个值为0的字节(一般是字符串结尾)时会停止工作。而我们的字符串通常包含值为0的字节。因此我们对编译后的代码编码为不含值为0的字节的并且有一块精心制作的引导区进行解码。


  最终,这个手段过程如下:


  • 1 发送一块超大的EULA
  • 2 EULA缓冲区溢出,杂项数据,覆盖回调函数指针
  • 3 发送数据包触发处理程序
  • 4 游戏跳转到引导代码地址
  • 5 解码有效数据
  • 6 下载有效数据和恢复杂项数据
  • 7 执行补丁


  要点:发布的游戏包含在线升级和不要使用不安全的strcpy。Include patching code in your shipped game, and don’t use unbounded strcpy.

 


酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部