热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

网页游戏的攻击与防御

网页游戏的安全问题,在刚入职接触的时候,写过两篇比较浅显的文章《网页外挂防御有感》和《网页游戏常见外挂原理及防御》。算算时间,距离现在也有

   网页游戏的安全问题,在刚入职接触的时候,写过两篇比较浅显的文章《网页外挂防御有感》和《网页游戏常见外挂原理及防御》。算算时间,距离现在也有一年多了,虽然页游安全总体上并没有显著变化,没有新的攻击方法,也没有新的防御方法,我个人的工作重心也由页游安全转向了手游安全,但出于完美主义的偏执,还是希望写一篇覆盖完整的页游安全文章,希望能给页游产业一点帮助。

  大纲

  —————————————————————————————————————————————————-

  一、协议安全(swf安全):自动封包 (重点)

  二、自动游戏+加速

  三、内存安全:内存修改

  四、存档安全:存档修改

  五、帐号安全/充值安全:盗号/低价充值

  正文

  —————————————————————————————————————————————————-

  一、协议安全(swf安全):自动封包 (重点)

   页游,最最核心的就是客户端(swf)与服务端的游戏通信了。游戏通信产生的封包,内容是否可识别,可篡改,可重放,处理逻辑是否有漏洞,都决定了这款游戏是否有重大的漏洞。

   我们知道页游前端和后台的通信一般有两者方式,一种是http连接,一种是socket连接,前者适用于小型页游,例如内嵌在QQ平台的QQ农场,后者适用于大型页游。

   不同的通信方式,产生的数据包格式也不一样,像HTTP AMF的可以使用charles来抓包查看,像sockets的可以使用WPE抓包查看。

   以socket 通信为例,协议采用自定义格式,一般由两部分组成,包头与包体,包头一般是固定长度,包体为可变长度。包头一般是一些基本信息,例如包长度,版本号,命令号,用户ID,序列号等;包体就是操作命令对应的接收参数,参数个数不同,参数类型不同会导致包体长度不同。

   只要摸清楚协议算法,即包是如何生成的,就可以构造数据包与服务器自由通话,这一后果是非常严重的。自由通话意味着你不需要老老实实的在客户端操作,一条数据包就能代替你一连串的操作,例如发送一条数据包完成一个任务,常用于快速升级,淘宝上的页游代练绝大多数都是采用的这种方式;自由通话更意味着你可以绕过客户端的逻辑判断,传任意参数给服务端。

   说到这里,你可能觉得只要服务端能正常处理来自客户端的参数,不出逻辑错误,不出配置错误,就万事大吉。这种想法很常见,例如上海宝开公司的某个开发就说过,我们的游戏逻辑判断都在服务端,我们没有外挂。我推测这个人应该不怎么上外网。

   理想是丰满的,现实是骨感的,怎么能保证后台不将逻辑写错,策划运营不将配置弄错呢,特别是在高强度的通宵加班后。你可能说靠测试呀,中国页游行业,配给给游戏的测试人员是非常少的,相应的测试时间也是远远不足的,并且测试技术也非常需要提高,总的来说,在页游行业,能做完整协议测试的公司不多。

   但玩家,特别是从事外挂制作代练服务的打金工作室会“帮你”好好地彻底地做协议测试。他们会先反编译客户端上的SWF文件(缓存中的,内存中的)得到协议生成算法,制作成封包工具,遍历每个协议号,每个参数输入,让你的错误无从遁形。

   我见过一个非常聪明的外挂制作者,在外挂中添加了脚本分享平台,号召大家共同摸索,将有问题的封包以脚本的方式上传以供大家下载,这种集思广益真的很妙,脚本的分享会给“找bug”精神奖励,将其帐号公布出来以供大家瞻仰,因此乐意分享的人很多。而且作者还很负责的有脚本审核机制,并支持快捷的查询。这是什么样的用户体验呀,这就是页游外挂界的app store

   

   看到这里,你或许想,我保护好SWF文件,不让其逆向不就行了吗?有需求,就有满足需求的地方,市面上有不少给SWF提供加密服务的收费产品,例如Amayeta SWF Encrypt 和 DComSoft SWF Protector ,因为收费,没用过这些产品,不知道具体原理,但据了解,最常用SWF加密方式,就是破坏SWF标准文件头,通过向SWF的二进制文件的文件头写入无意义的数据,从而导致反编译软件无法正常解析SWF文件。下图是使用反编译器打开加密的SWF文件,会提示无法解析

   

 我们可以对比一下采用这种加密方式的swf文件头内容:

  (1)未加密swf文件  

   正常的SWF文件,文件头部是由一个三字节的标识符开始,为0×46、0×57、0×53(“FWS”)或者0×43、0×57、0×53(“CWS”)其中之一。“FWS”标识符说明该文件是未压缩的SWF文件,“CWS”标识符则说明该文件前8个字节之后(即文件长度字段之后)的全部数据为开源的标准ZLIB方式压缩

  (2)加密后的SWF文件

   

很明显,文件头部变成了无意义的符号。

  

   有加密就有解密,加密的SWF文件需要还原,虽然反编译不了加密后的SWF文件,但可以反编译解密文件找到解密代码来还原加密SWF文件的文件头。

  

   很明显,这种SWF加密方法没什么作用。于是大家想着如何用一种无法反编译的实现方法来隐藏加密算法,例如利用Alchemy能够编译C/C++代码为AS字节码但无法被反编译的特性来隐藏加密算法。其实我怀疑目前有工具将Alchemy还原成C了,例如ASV(actionscript view 2012)就号称是目前最强悍的SWF解密工具,网上都有该工具的团购消息了。

   我不懂SWF的加密解密,但我知道有一条万能守则,任何加密在内存中都是解密状态的。当无法解密的时候,就从内存中查找导出吧,我们可以先使用SWF Memory Dumper从浏览器内存中导出解密并解压缩的SWF文件,再用传播程度都烂大街的硕思闪客反编译得到源码。这一方法对游戏协议安全来说,是非常非常非常悲剧的。如下图所示,包的组成结构,包中各个字段的生成算法都可以通过逆向解密SWF文件获得!

   

例如下图为游戏协议结构

   

   --------------------------------------------------------------------------------

  例如下图就是游戏协议对应的命令号

   

  例如下图为游戏配置表

   

  一切的一切,都注定了要想完全解决协议安全问题,只有靠AS混淆了。目前有一些收费软件提供AS混淆,例如secureSWF 。但奇怪的是,没有多少页游公司实施AS混淆。

   写到这里,或许你会幻想游戏协议算法不会被逆向得知,那不就完事大吉了吗?再次申明,现实是残忍的,即使不知道协议算法,照样可以修改游戏封包。我们可以通过耐心的反复操作来对比封包的不同,定位到修改点。一般使用WPE工具,修改包体。WPE工具的关键就是过滤器,查找到符合指定特征的封包,将特定的位置替换为修改的值。如下图所示,

   

   除了封包篡改,最简单的连封包结构都不要猜测的就是封包重放作弊了,例如打怪是一条封包,只要反复重放该封包,就能轻易刷取经验值了。

   好的协议设计,一定要考虑到防御封包篡改和封包重放,最简单的方法是在封包的某个字段加入一个序列号,该序列 号包含包体完整性检验值,时间因素值,来区分封包是否是重放的,是否有被篡改。

   有了好的协议设计,协议是否安全了呢?协议的实现方法在客户端SWF中,这一事实又讲安全问题引回到SWF被逆向的问题上,只要被成功逆向,一切努力都打水漂了。虽然防御艰难,但也不能放弃,一种方法不行,可以用多种方法。总的来说,为了协议安全,可以做如下措施(不仅仅从技术上):

  1.好的协议设计,防重放与篡改

  2.SWF加密 ,注意加密算法的安全,最好AS混淆

  3.耐心的做协议检测,开发在提交测试前,做协议测试;测试在完成了功能测试,性能测试后也要搞好协议测试;策划运营对配置表做认真的检查;

  4.设计一套监控系统,监控游戏中的收益与消费,大量的刷取物品肯定会在数值变化中体现出来;

  5.留意游戏论坛,游戏QQ群里是否有新漏洞的披露,外挂是否有更新;

  6.频繁更换加密算法,与外挂制作者PK更新速度

二、自动游戏+加速

   自动游戏,简单的说就是模拟鼠标或键盘对游戏UI的操作,代替你做重复的工作。最简单的自动游戏脚本可以使用按键精灵来制作,先对正常操作进行录制,然后编辑,设置热键,最后回放即可。程序实现中一般会有以下几个关键函数

  (1)模拟键盘

  VOID keybd_event(

  BYTE bVk, // 虚拟键码

  BYTE bScan, // 扫描码

  DWORD dwFlags,

  ULONG_PTR dwExtraInfo // 附加键状态

  )

  (2)模拟鼠标

  VOID mouse_event(

  DWORD dwFlags, // motion and click options

  DWORD dx, // horizontal position or change

  DWORD dy, // vertical position or change

  DWORD dwData, // wheel movement

  ULONG_PTR dwExtraInfo // application-defined information

  )

   自动游戏的作弊方式常见于对战刷怪类游戏,自动识别地图中怪物出现的位置,自动出招打怪,自动拾取掉落宝物。往往还会配合加速外挂,总的来说,就是靠达成那种不知疲倦(脚本操作)、准确度高(自动识别地图中UI特征)、快速(对页游就是加速flash的动画播放速度)的操作方式来快速升级。

   自动游戏类型外挂的防御比较简单,增加人机识别的因素,类似于论坛避免批量注册,采用只有人类才能识别的验证码(题外话,不少网站的验证码其实可以机器识别),例如对于对战类游戏,记录每次对战的频率和操作时间特性,对异常的操作弹出图片验证,中断自动游戏。

   在实施图片验证的时候,要考虑到两个要素:

   一是图片是否真正的机器难以识别,要预防简单的像素采集技术;

   二是图片库是否及时更新,要预防图片库的遍历。

   而加速外挂,也常见于对战类游戏。改变操作速度有两种情况。一种是使用变速齿轮之类的加速外挂加快flash动画播放速度,一种是速度值为游戏中的某个变量值,修改了对应的数值。

  对于加快flash动画播放速度的加速外挂,我们可以通过对比客户端服务端时间是否同步来检测,当检测到异常的时候,可以弹出图片验证,中断加速。  

   对于速度由游戏中数值控制的,做好协议安全,使其无法改封包中对应的数值;做好SWF反逆向保护,使其无法修改源码中控制速度的逻辑。

 

 三、内存安全:内存修改

   修改游戏在内存中的数值是经典的单机游戏作弊方法,同样也适用于网页游戏,原因很简单,不可能每个来自客户端的数据,服务端都做验证。(看看页游公司开发前端和后台的比例吧!)以社交类网页游戏为例,其中会内嵌不少小游戏,这些小游戏可能是用来赚取游戏经验或货币等数值的,很显然,这种类型的小游戏基本就是主逻辑在客户端的单机游戏,只是最后将游戏分数上传给服务器,服务器再根据游戏分数的不同来下发相应数额的游戏货币。我们完全可以在积分上传前,在内存中查找并修改该数值。 如下图所示,用cheat engine去查找IE进程中游戏分数。

  (cheat engine是我最喜欢的内存修改工具,手游上的内存修改工具和这个比起来简直是胎儿版的。该工具支持自定义格式的内存搜索,具备强大的反汇编功能,更妙的是可以直接生成外挂,特别赞的是竟然采用了游戏通关的方式来教授工具使用,我的博客中有第八关于第九关通关方法)

  

  程序实现一般会有以下几个关键函数

  (1)读取进程数据ReadProcessMemory

  (2) 查找,查找算法可以按数值类型、扫描类型及内存扫描方式来实现

  例如数值类型有二进制,1字节,2字节,4字节(游戏最常用),8字节,浮点数,双浮点数,文本,字节数组,自定义(这个最牛);

  例如扫描类型可以支持精确查找,模糊查找(比…大,比…小,两者之间),数值变化趋势(数值处于增加中,数值出于减少中,数值没有变动,与首次扫描数值相同,数值增加了某个指定值,数值减少了某个指定值);

  例如内存扫描方式有自定义扫描起始与终止地址,同时扫描只读内存,深度扫描,快速扫描,扫描时暂停游戏

  (3)写数据WriteProcessMemory

  内存修改的防御,有以下几种建议:

  (1)重要数值在内存中拆分存放,使其无法简单定位到(会使得游戏逻辑变复杂)

  (2)默认可以修改,在服务端控制收益上线。(考虑到成本,为目前主流控制方法)

  --------------------------------------------------------------------------------

   四、存档安全:存档修改

   在flas在flash单机游戏时代,修改本地存档文件,是游戏作弊的重要方式,相信有不少人就用过Flash存档修改器。

   随着页游兴起到现在的页游繁盛,依赖于存档进行逻辑判断的设计减少了,但这块也不能完全忽略掉。总会有一些功能是需要调用本地存档的。例如登录模块中,记住密码功能,会将密码信息存储在本地,以IE浏览器为例,在C:Documents and Settings(你的Windows用户名)Application DataMacromedia Flash Player#SharedObjects(一些随机数字和字母) 文件夹下就可以看到存储密码的SOL文件,可以使用minerva工具查看,如下图所示,密码明文明文存储的,SOL文件是永久性保存的,除非手动清除,如果玩家在公共环境下登录,就会有盗号威胁。

   也有些开发意识到了这个问题,而采用加密存储方式,一般采用md5(其实md5不是真正的加密算法)。md5解密的在线网站非常多,如下图所示,密码通过两次md5后存储。

   

  所以建议存档加密,采用自定义的加密算法,例如md5后转置再md5,等等。

  五、帐号安全/充值安全:盗号/低价充值

  帐号安全和充值安全不仅页游如此,所有游戏,甚至所有线上应用都如此。如果说开是个大的话题,我仅仅介绍页游中常见的威胁与防御。

  (一)、帐号安全

  威胁:

  1.外挂盗号

  例如下面号称可以无限刷取游戏货币的外挂,实际上在用户输入帐号和密码后,将信息发送给盗号者的邮箱。

   

  2. 社工盗号

  在游戏中获取信任,以为对方代练等好处为引诱盗取帐号。或通过获取个人信息,从密保问题下手进行盗号。

  3.从游戏的帐号管理中心等web入口下手,进行盗号。

  例如登录模块没有验证码或验证码实现机制漏洞,使用字典扫描批量盗号

  4.传输嗅探盗号

  5.利用帐号申诉流程漏洞进行盗号

  例如有些申诉打分机制存在提供多次充值证明就可以取回密码的方式,先充值,再盗号。

  防御:

  1.安全意识宣传

  2.弱口令检测

  3.异地登录提醒

  4.登录行为监控

  5.设计好帐号相关功能,例如申诉流程

  (二)、充值安全

  威胁:

  1.社工

  在网上发帖慌称发现充值漏洞,骗取贪心网友给自己指定的帐号进行充值

   

  2.利用手机充值漏洞

  使用快过期的手机废卡进行充值,大多数的充值不会再次检测手机卡是否存活状态

  3.利用宽带充值漏洞

  盗取宽带帐号进行充值,由于不会实际影响游戏收益,顶多会出现受害者损失严重的情况下投诉带来的不好影响。

   4. 真正的充值漏洞

  比如说广泛采用的点卡充值,可能存在点卡被重放使用的漏洞

  防御:

  1.安全意识宣传

  2.充值相关功能的安全检测

   结论

   总的来说,页游的各种外挂问题很普遍,端游有的它都有,但安全防御不如端游,这很大程度上是因为页游的开发周期短,生存周期也短,例如较长的神仙道游页才两年了,甚至大多数页游,只是为了短时间洗用户抢钱,因此不会投入人力物力在外挂防御方面,或许第三方的安全服务会有点市场吧,比如说他们乐意购买支持多项目的AS混淆工具。总之,页游是个浮躁的市场,只有生命周期强大的游戏,才会注意到外挂问题。

转:https://www.cnblogs.com/tinytiny/archive/2012/11/12/2765908.html



推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 集成电路企业在进行跨隔离网数据交换时面临着安全性问题,传统的数据交换方式存在安全性堪忧、效率低下等问题。本文以《Ftrans跨网文件安全交换系统》为例,介绍了如何通过丰富的审批流程来满足企业的合规要求,保障数据交换的安全性。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文详细介绍了git常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
author-avatar
大印文化
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有