加载中…
个人资料
南溟之野
南溟之野
  • 博客等级:
  • 博客积分:0
  • 博客访问:37,710
  • 关注人气:15
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

钻网络游戏的漏洞(1)

(2007-08-19 15:13:50)
标签:

游戏部落

外挂

作弊

客户端

反汇编

warden

魔兽世界

sniffer

分类: 游戏

作者:Greg Hoglund 和 Gary McGraw

 

【翻译声明】

1.翻译纯属自娱自乐,非商业行为(for non-commercial use!)。翻译居然花掉一整天的时间,这是事前低估了的。原文链接:Gamasutra - Book Excerpt: Exploiting Online Games。这篇文字为Exploiting Online Games一书的章节摘录。

本人非黑客专业人士,因此欢迎指正和讨论本文各种类型的翻译错误和问题。

 

2.原网站Gamasutra的声明强调它之所以刊出原书摘录,只是为了让游戏开发者了解一下游戏作弊技术,并不鼓励实际中使用这些技术。

我国也已经有与“外挂用于商业牟利”相关的法律案例(昨天的新闻)

技术本身并没有好坏之分。但是黑客的魔力总是会诱惑一些“技术魔人”和一些“商业头脑疯狂”的人(后一类人又往往是把技术拖入深渊的“导师”)。

 

3.关于游戏公司的反外挂措施侵犯隐私之类话题的讨论,请参看“Raph Koster:Never trust the client”(永远不要相信客户端)

 

数据,数据---数据无处不在

 

一个软件程序,有两种东西可以被更改:代码和与代码相关的数据。(如果非要把问题稍微复杂化一点,那么, 代码本身无疑也是存储数据的一种类型)。基本上,所有的东西都仅仅只是数据---许许多多精心设计的1和0的排列组合。对网络游戏的黑客来说,具备这种意识,意义十分重大。

 

任何发送到游戏客户端的数据都可以访问或修改。一旦数据存在于客户端,它们就是你的囊中之物(供你处理和操纵)---甚至包括一些你本不应该看到的数据。举个例子,如果游戏客户端辨识出一瓶隐藏的神秘魔法药剂的位置,那么那些数据一定存放在游戏客户端的某个地方,即使该数据在你的用户界面上根本看不到。更有趣的是,这些游戏数据可以被操作和修改很多次。比如,如果某神秘的魔法药剂离你的游戏角色太远,或许你不断修改它的位置坐标就可以最终让它老老实实的出现在你面前的地上。

 

游戏客户端通过用户界面向游戏玩家展示信息。然而,界面仅仅展示了客户端软件所处理信息的一部分---这部分是设计者期望玩家看到的。软件内部其实通常蕴含更多的信息。假如有一瓶魔法药剂,该药剂有力量(strength)、威力(power)和持续效果时间(duration)等属性。从代码运行的内幕来看,则是一个软件程序管理着这瓶药剂。在我们的例子里,规定如果魔法药剂的力量值大于100,你喝了就可以获得一个额外的奖励(bonus)。当你点击“喝”的按钮时,软件就会检查判断药剂的力量值,然后给予你奖励(但当且仅当奖励条件满足时才行)

 钻网络游戏的漏洞(1)

 

 

如前所述,在游戏客户端软件层级结构的最底层,一切都只是数据。甚至软件程序本身也是以数据格式存储的。对药剂做判断的程序放在一个位置,而描述药剂力量值的数据则存储在另外一个不同的地方。这是一种典型的情形---可执行的程序字节放在一个远离其他数据的特殊内存区域。为了弄清我们的例子并且了解这一切的重要性,如果你想通过作弊的方式获得那笔奖励的话,你可以到内存中改变决定药剂力量值的数据。如果你把药剂力量数据值设置为大于100的某个数,那么当程序执行时(就是你点击了“喝”的按钮后),它就会给你的角色一个额外的奖励。要达到这个目的,你可以使用错误注射引擎(Fault Injection Engine)或者调试器(debugger),甚至可能仅仅只需要手动把一个值写到相关内存区就行。

 

用户界面仅仅展示了客户端软件所拥有信息的一部分。不过有些时候你仍然可以了解客户端所包含的部分游戏内部的一些东西。这种情况下展示给用户关于魔法药剂的信息将会比平时更多。我们可以深入程序和数据了解更多。

 

以上讨论回避了问题的实质困难:找到药剂力量值存储位置的难度。这听起来有点像大海捞针,在一个单独运行的程序里有成千上万字节的数据,漫无目的的在数据海洋里乱找结果不会很理想。你需要一些指导来指引你需要找什么类型的数据,甚至更进一步,向你展示怎样使用这些数据。幸好,有不少工具和技术可供你使用。

 

首先,也是最重要的,明确数据的用途. 这里的“数据”要么是代码,要么是代码控制的操作数(在某些更复杂的情况下,两种情况都有)。如果这些二进制数据是代码,它们在某种情况下会被加载到CPU,然后被执行。大多数的反汇编器(Disassembler)可以发现这样的代码,并把它标记出来,之后反汇编器会显示其翻译出来的汇编语言形式的指令。图6-7显示当二进制数据通过反汇编器后,翻译出来的汇编语言的样子。

 

 钻网络游戏的漏洞(1)

图6-7 反汇编器处理二进制代码并生成如图所示的汇编代码。左列的数字代表机器码所在的内存地址,右边的列代表相应的汇编语言

 

但是什么才是普通的数据呢(即非指令的数据)?如果你已经对代码进行反汇编,代码就可以提供数据位置的蛛丝马迹。图6-8表明代码正在访问内存地址为0001F574的数据。通过代码的构造方式,我们现在知道内存地址0001F574处存储有某种类型的数据。正如这里所显示的,许多代码包含大量类似的信息,有助于我们找到感兴趣的数据。

 

钻网络游戏的漏洞(1)

图6-8 如图所示。之前反汇编的代码访问了数据

 

 

数据暴露和反制措施

 

很显然,你可以在任意目标游戏程序中随意查找和更换数据。不过请记住,游戏程序也是可以检索内存的。游戏可能采取一些反制措施,这些对策会检测与游戏原来的代码或数据不一致的改动(比如,通过使用完整性检测integrity checking),它还可以扫描你写到内存的注入代码或者注入数据(采用“活跃恶意代码扫描”active malware scanning)

 

我们前面提到的一些攻击技术包括:更改代码、调整数据、向游戏进程注入线程或者DLL(动态链接库)。所有这些举动都可能会被一些游戏软件探测到。一个最明显的例子是暴雪公司为了保护《魔兽世界》而使用的The Warden(典狱官)。不过还是有一些办法可以躲过甚至击败许多形式的扫描(即使并非全部),只是其中有的办法可能会比较复杂。

 

静态数据,动态数据

 

有时候数据是静态的,也就是说,它存在你电脑的内存里。有时候数据是动态的,也就是说,它们通过网络连接在两个互相通讯的程序之间高速移动。如果你仅仅把目光集中在内存中的静态数据的话,你就会错过一半的乐趣。通过修改来来往往的数据包,你可以很容易的深度影响游戏的玩法,就像你在自己的电脑内存中更改本地的数据实例一样。事实上,如果你正确了解一个特定的网络通讯协议是如何工作的,你就可以用自己的独立客户程序来重写游戏客户端2。毕竟,你真正想要的是一个接受特殊输入和产生特殊输出的程序。

 

让我们说具体点:有时,仅通过嗅探到正确的传输数据包,你就可以判定神秘魔法药剂的位置,甚至不需要使用调试器,。图6-9 示例了这样一个嗅探器。该程序叫WoWSniffer,非常清晰的图示了其嗅探网络传输中聊天消息的能力。这一点非常有趣,因为网络上的通讯应该都是被加密过的。很显然,WoWSniffer的作者已经破解了加密信息。

 

 钻网络游戏的漏洞(1)

图6-9 图示为WoWSniffer程序运行在《魔兽世界》中。嗅探窗口显示的消息中有许多游戏客户端工作的内幕信息

 

在其他地方寻找数据

 

在本书的其他地方,我们介绍了自动瞄准型外挂(aimbots)的原理。回想下这种外挂可以为玩家提供不可思议的、超人的瞄准精度。它探测敌人的3D坐标、精确计算你的武器可以击中对手的最佳角度。自动将你的狙击步枪对准对手的左眼眼眶,需要查找存储游戏中被渲染对象3D坐标的数据。

 

自动瞄准型外挂特别有趣的地方是它们不是仅仅寻找游戏程序的数据,而是利用数据与显卡之间的数据交互来入侵。显卡都有自带的存储器(显存)用来存储渲染3D对象的数据结构(玩家对拥有最新的图形技术来玩他们的游戏非常重视)。结果就是,瞄准型外挂可以利用存储在显卡上的3D数据来找到游戏世界中目标对象的3D坐标。---多有才啊!!

 

图6-10 展示了一个瞄准型外挂如何计算和保持所有将在显存中被渲染对象的拷贝的---即使那些对象不直接在显示区域内。要做到这些,外挂需要截取游戏与微软Windows系统Direct3D视频库之间的通讯信息。

 

钻网络游戏的漏洞(1)

图6-10 为了计算诸如敌人位置之类的东西,当这些3D坐标值被发送到视频子系统时,外挂如何截取它们的

 

注2 这是我们的书Exploiting Software中提到的“Make the client invisible”攻击模式的一个实例。关于这个话题更多的信息请参考第9章

 

该系列文章链接快速访问:

钻网络游戏的漏洞(1)

钻网络游戏的漏洞(2) 

钻网络游戏的漏洞(3)

 

关于本文提到的人物:

1.Raph koster简介 其人游戏书籍著作

2.作者之一的Greg Hoglund :软件安全领域的先驱者。HBGary公司的CEO,该公司提供领先的软件安全认证服务。他是最早的网络漏洞扫描器之一的编写者(该软件在半数以上的财富500强公司中安装)。之后他编写了第一个基于Windows NT的rootkit并撰写了文档,同时创建了rootkit.com网站。经常在Black Hat、RSA以及其他安全会议上作演讲。

 

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有