天天酷跑后台反作弊方案
天天酷跑后台反作弊系统
《天天酷跑》在2013年9月正式公测,同时接入公司的微信和手Q手机游戏平台。经过平台和游戏的共同努力,游戏持续受到玩家的喜爱,DAU也不断攀升。随之而来的,外挂也开始泛滥,特别是PK系统上线之后,使用外挂可以获得钻石收益,进一步推动了外挂的使用。
1.客户端数据上报
后台反作弊的基础,是客户端在结算协议中上报的数百项数据。这些数据之间的关系错综复杂,简单的修改一项或某几项数据,很难完全模拟出完全正常的客户端数据。下图是部分上报的数据定义。
图1.部分结算统计数据
结算协议使用《天天酷跑》自定义的属性系统来上报数据,既可以基本上避免协议升级,也能够利用属性系统的随机成员读写功能,完成类似脚本的反作弊计算。关于属性系统的内容,可以参考相应的介绍文章。
图2是客户端上报的结算协议示例,其中的dwAttributeID 字段唯一标识了上报的数据,dwValue表示上报数据的具体值。图1定义了客户端上报的dwAttributeID列表。
图2.结算协议示例
客户端上报的数百项数据,为游戏后台提供了反作弊的基础,那如何利用好这些数据呢?
2.代码级反作弊
对于逻辑比较复杂的反作弊策略,会通过硬写代码的方式来实现。在具体实现时,基于属性系统的分层设计,将每项需要检测的数据交由一个函数来处理,好处是代码相对独立、清晰,便于理解。结算系统初始化时会注册结算上报属性与处理函数的映射,运行时结算系统会查找每个属性是否对应有处理函数,有的话就执行相应代码。
图3.注册处理函数
属性处理函数可以比较简单,也可以非常复杂。以游戏中的表现分校验为例,看下具体的校验逻辑:
1) 基本得分的计算,包括踩怪、吃金币等相关得分。
2) 额外得分的计算,包括糖果类道具相关得分。
3) 神偷萌萌得分。
4) 穿越关卡得分。
5) 恐龙蛋得分。
6) 动物头得分。
7) 奖励关得分。
8) 精灵加分。
9) 宠物、坐骑相关加分。
10) 得分buff。
代码级反作弊是个繁琐的逻辑计算过程,需要充分了解游戏得分相关的方方面面,需要有良好的编码能力、足够的耐心和反复与策划、客户端同学沟通的能力。而且一旦有修改就涉及到服务器程序发布版本,整个过程比较容易出错和出现误杀,为了尽量减少对现网用户的影响,酷跑对这块代码有一些要求:
1) 总体的游戏结算结果监控,能够看到结算总量和异常总量。
2) 结算异常需要有error级别日志,线上发布时能立即看到错误信息。
3) 每项检测需增加开关,随时可以通过改配置并reload来关闭和打开检测。
4) 数值比较类检测需增加buff,通过调整buff值可以控制检测的宽严程度。
3. 反作弊公式
基于属性系统的动态反作弊动态公式,可以根据数据之间的逻辑关系,配置出简单、有效的公式,用于检测玩家是否作弊。
反作弊公式规则如下:
1) 公式原型
a) X {加|减|乘|除} Y {大于|小于|等于} Z
b) X、Y、Z是公式中的核心变量,具体的值通过计算得出
2) 变量数值
a) X = Attr(a) {加|减|乘|除} Fa。Fa是Attr(a)的固定系数因子
b) Y = Attr(b) {加|减|乘|除} Fb。Fb是Attr(b)的固定系数因子
c) Z = Attr(c) {加|减|乘|除} Fc。Fc是Attr(c)的固定系数因子
3) 属性获取
a) Attr(a)、Attr(b)、Attr(c)是客户端上报给后台的属性值
b) 公式解析器根据配置中的属性堆ID和属性ID获取属性值
4) 公式逻辑
a) 单条公式计算结果为TRUE时,表示该公式命中
b) 规则由一条或者多条公式组成,当包含多条公式时,所有公式命中才表示规则命中,因此规则内部属于“与”的逻辑关系
c) 规则列表的任何一个命中,都会判定结算作弊,因此规则之间是“或”的逻辑关系
反作弊公式是一套由配置表驱动的逻辑规则,公式解析器会动态执行这些规则,根据规则的需要取出客户端上报的结算数据,进行计算并给出作弊判断。图4是反作弊配置表的示例。
图4.反作弊配置表
表中的“描述”字段用于作弊判断为TRUE时,打出比较好理解的日志,可以知道具体的原因。例如里面的日志表示用户数据触发105号规则,原因是实际产生的无敌时间大于应该的无敌时间的1.2倍(公式两边乘以10)。
do NOT pass safe rule check[id=105,rule=TotalGiantTime*10[262490] > RealGiantCount*12[257556]|]
4. CS协议反作弊
《天天酷跑》早期的C/S交互协议没有加密,只是简单的TDR打包后明文传输,导致后期出现请求包的重放和伪造类作弊,获取非法收益。此类作弊通过增加协议加密和请求唯一序列号,可以有效地防治。
5. 安全组数据分析
互娱研发部业务安全中心的小伙伴们,通过接入客户端的SDK和游戏后台上报的各项数据,进行分析和建模来发现作弊玩家,发现后通过游戏测提供的idip接口修改玩家的数据进行打击,例如清除排行榜分数和结算收益、封号等。
小结
国内独特的游戏环境,产生了游戏火爆程度和外挂(包括各种作弊器、修改版)数量成正比的局面,所以反作弊的工作会是长期、艰苦的。建议项目组在早期建立反作弊系统并投入相应人力,积极、主动地与作弊进行对抗,才能有效防止大规模的作弊泛滥。