页游,最最核心的就是客户端(swf)与服务端的游戏通信了。游戏通信产生的封包,内容是否可识别,可篡改,可重放,处理逻辑是否有漏洞,都决定了这款游戏是否有重大的漏洞。
一、协议安全(swf安全):自动封包(重点)
不同的通信方式,产生的数据包格式也不一样,像HTTPAMF的可以使用charles来抓包查看,像sockets的可以使用WPE抓包查看。
以socket通信为例,协议采用自定义格式,一般由两部分组成,包头与包体,包头一般是固定长度,包体为可变长度。包头一般是一些基本信息,例如包长度,版本号,命令号,用户ID,序列号等;包体就是操作命令对应的接收参数,参数个数不同,参数类型不同会导致包体长度不同。
只要摸清楚协议算法,即包是如何生成的,就可以构造数据包与服务器自由通话,这一后果是非常严重的。自由通话意味着你不需要老老实实的在客户端操作,一条数据包就能代替你一连串的操作,例如发送一条数据包完成一个任务,常用于快速升级,淘宝上的页游代练绝大多数都是采用的这种方式;自由通话更意味着你可以绕过客户端的逻辑判断,传任意参数给服务端。说到这里,你可能觉得只要服务端能正常处理来自客户端的参数,不出逻辑错误,不出配置错误,就万事大吉。这种想法很常见,例如上海宝开公司的某个开发就说过,我们的游戏逻辑判断都在服务端,我们没有外挂。我推测这个人应该不怎么上外网。
看到这里,你或许想,我保护好SWF文件,不让其逆向不就行了吗?有需求,就有满足需求的地方,市面上有不少给SWF提供加密服务的收费产品,例如AmayetaSWFEncrypt和DComSoftSWFProtector,因为收费,没用过这些产品,不知道具体原理,但据了解,最常用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加密方法没什么作用。于是大家想着如何用一种无法反编译的实现方法来隐藏加密算法,例如利用Alchemy能够编译C/C++代码为AS字节码但无法被反编译的特性来隐藏加密算法。其实我怀疑目前有工具将Alchemy还原成C了,例如ASV(actionscriptview2012)就号称是目前最强悍的SWF解密工具,网上都有该工具的团购消息了。
我不懂SWF的加密解密,但我知道有一条万能守则,任何加密在内存中都是解密状态的。当无法解密的时候,就从内存中查找导出吧,我们可以先使用SWFMemoryDumper从浏览器内存中导出解密并解压缩的SWF文件,再用传播程度都烂大街的硕思闪客反编译得到源码。这一方法对游戏协议安全来说,是非常非常非常悲剧的。如下图所示,包的组成结构,包中各个字段的生成算法都可以通过逆向解密SWF文件获得!
例如下图为游戏协议结构
例如下图就是游戏协议对应的命令号
例如下图为游戏配置表
一切的一切,都注定了要想完全解决协议安全问题,只有靠AS混淆了。目前有一些收费软件提供AS混淆,例如secureSWF。但奇怪的是,没有多少页游公司实施AS混淆。
写到这里,或许你会幻想游戏协议算法不会被逆向得知,那不就完事大吉了吗?再次申明,现实是残忍的,即使不知道协议算法,照样可以修改游戏封包。我们可以通过耐心的反复操作来对比封包的不同,定位到修改点。一般使用WPE工具,修改包体。WPE工具的关键就是过滤器,查找到符合指定特征的封包,将特定的位置替换为修改的值。如下图所示,
除了封包篡改,最简单的连封包结构都不要猜测的就是封包重放作弊了,例如打怪是一条封包,只要反复重放该封包,就能轻易刷取经验值了。
有了好的协议设计,协议是否安全了呢?协议的实现方法在客户端SWF中,这一事实又讲安全问题引回到SWF被逆向的问题上,只要被成功逆向,一切努力都打水漂了。虽然防御艰难,但也不能放弃,一种方法不行,可以用多种方法。总的来说,为了协议安全,可以做如下措施(不仅仅从技术上):
1.好的协议设计,防重放与篡改
2.SWF加密,注意加密算法的安全,最好AS混淆
3.耐心的做协议检测,开发在提交测试前,做协议测试;测试在完成了功能测试,性能测试后也要搞好协议测试;策划运营对配置表做认真的检查;
4.设计一套监控系统,监控游戏中的收益与消费,大量的刷取物品肯定会在数值变化中体现出来;
6.频繁更换加密算法,与外挂制作者PK更新速度。
二、自动游戏+加速
自动游戏,简单的说就是模拟鼠标或键盘对游戏UI的操作,代替你做重复的工作。最简单的自动游戏脚本可以使用按键精灵来制作,先对正常操作进行录制,然后编辑,设置热键,最后回放即可。程序实现中一般会有以下几个关键函数
(1)模拟键盘
VOIDkeybd_event(
BYTEbVk,//虚拟键码
BYTEbScan,//扫描码
DWORDdwFlags,
ULONG_PTRdwExtraInfo//附加键状态
)
(2)模拟鼠标
VOIDmouse_event(
DWORDdwFlags,//motionandclickoptions
DWORDdx,//horizontalpositionorchange
DWORDdy,//verticalpositionorchange
DWORDdwData,//wheelmovement
ULONG_PTRdwExtraInfo//application-definedinformation
自动游戏的作弊方式常见于对战刷怪类游戏,自动识别地图中怪物出现的位置,自动出招打怪,自动拾取掉落宝物。往往还会配合加速外挂,总的来说,就是靠达成那种不知疲倦(脚本操作)、准确度高(自动识别地图中UI特征)、快速(对页游就是加速flash的动画播放速度)的操作方式来快速升级。
在实施图片验证的时候,要考虑到两个要素:
一是图片是否真正的机器难以识别,要预防简单的像素采集技术;
二是图片库是否及时更新,要预防图片库的遍历。
而加速外挂,也常见于对战类游戏。改变操作速度有两种情况。一种是使用变速齿轮之类的加速外挂加快flash动画播放速度,一种是速度值为游戏中的某个变量值,修改了对应的数值。
对于速度由游戏中数值控制的,做好协议安全,使其无法改封包中对应的数值;做好SWF反逆向保护,使其无法修改源码中控制速度的逻辑。
三、内存安全:内存修改
修改游戏在内存中的数值是经典的单机游戏作弊方法,同样也适用于网页游戏,原因很简单,不可能每个来自客户端的数据,服务端都做验证。(看看页游公司开发前端和后台的比例吧!)以社交类网页游戏为例,其中会内嵌不少小游戏,这些小游戏可能是用来赚取游戏经验或货币等数值的,很显然,这种类型的小游戏基本就是主逻辑在客户端的单机游戏,只是最后将游戏分数上传给服务器,服务器再根据游戏分数的不同来下发相应数额的游戏货币。我们完全可以在积分上传前,在内存中查找并修改该数值。如下图所示,用cheatengine去查找IE进程中游戏分数。
(cheatengine是我最喜欢的内存修改工具,手游上的内存修改工具和这个比起来简直是胎儿版的。该工具支持自定义格式的内存搜索,具备强大的反汇编功能,更妙的是可以直接生成外挂,特别赞的是竟然采用了游戏通关的方式来教授工具使用,我的博客中有第八关于第九关通关方法)
程序实现一般会有以下几个关键函数
(1)读取进程数据ReadProcessMemory
(2)查找,查找算法可以按数值类型、扫描类型及内存扫描方式来实现
例如数值类型有二进制,1字节,2字节,4字节(游戏最常用),8字节,浮点数,双浮点数,文本,字节数组,自定义(这个最牛);
例如扫描类型可以支持精确查找,模糊查找(比...大,比...小,两者之间),数值变化趋势(数值处于增加中,数值出于减少中,数值没有变动,与首次扫描数值相同,数值增加了某个指定值,数值减少了某个指定值);
例如内存扫描方式有自定义扫描起始与终止地址,同时扫描只读内存,深度扫描,快速扫描,扫描时暂停游戏
(3)写数据WriteProcessMemory
内存修改的防御,有以下几种建议:
(1)重要数值在内存中拆分存放,使其无法简单定位到(会使得游戏逻辑变复杂)
(2)默认可以修改,在服务端控制收益上线。(考虑到成本,为目前主流控制方法)
四、存档安全:存档修改
在flas在flash单机游戏时代,修改本地存档文件,是游戏作弊的重要方式,相信有不少人就用过Flash存档修改器。
所以建议存档加密,采用自定义的加密算法,例如md5后转置再md5,等等。
五、帐号安全/充值安全:盗号/低价充值
帐号安全和充值安全不仅页游如此,所有游戏,甚至所有线上应用都如此。如果说开是个大的话题,我仅仅介绍页游中常见的威胁与防御。
(一)、帐号安全
威胁:
1.外挂盗号
2.社工盗号
在游戏中获取信任,以为对方代练等好处为引诱盗取帐号。或通过获取个人信息,从密保问题下手进行盗号。
3.从游戏的帐号管理中心等web入口下手,进行盗号。
4.传输嗅探盗号
5.利用帐号申诉流程漏洞进行盗号
例如有些申诉打分机制存在提供多次充值证明就可以取回密码的方式,先充值,再盗号。
防御:
1.安全意识宣传
2.弱口令检测
(二)、充值安全
1.社工
在网上发帖慌称发现充值漏洞,骗取贪心网友给自己指定的帐号进行充值
2.利用手机充值漏洞
使用快过期的手机废卡进行充值,大多数的充值不会再次检测手机卡是否存活状态
3.利用宽带充值漏洞
盗取宽带帐号进行充值,由于不会实际影响游戏收益,顶多会出现受害者损失严重的情况下投诉带来的不好影响。
4.真正的充值漏洞
比如说广泛采用的点卡充值,可能存在点卡被重放使用的漏洞
结论
==========================================================================================================================