建一座安全的“天空城” ——揭秘腾讯WeTest如何与祖龙共同挖掘手游安全漏洞
作者:腾讯WeTest手游安全测试团队
商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。
WeTest导读
《九州天空城3D》上线至今,长期稳定在APP Store畅销排行的前五,本文将介绍腾讯WeTest手游安全团队在游戏上线前为《九州天空城3D》挖掘安全漏洞的全过程。
《九州天空城3D》(下文简称《九州》)是祖龙娱乐的一款正版授权次世代3D飞行手游,在8月,正式向全平台开放。作为一个前身是端游研发工作室的研发商,祖龙娱乐在《九州》中将端游中经典的“飞行功能”重新展现给了玩家,《九州》以东方幻想元素为基调,熟练运用了PBR材质渲染、全局动态光影、超清粒子特效、真实物理碰撞等技术,实现了“双人飞行”,“360°全方位自由空战”等创新玩法。在这款手游推出时,我们发现,祖龙娱乐在手游的研发技术上正变得越来越娴熟。
游戏设计方面,《九州》设计了很大的地图,不做任何的地形限制;另外玩家在飞行过程中也能发生战斗,全方位的空战体验在手游中还是相对比较少见的。
玩法方面,《九州》设计了“双人飞行”的特色功能,将玩家之间的互动与这款游戏的核心卖点“飞行”巧妙地结合到一起。不过,《九州》的游戏策划很清楚,作为一款MMO游戏,为了留住玩家,其最终的落脚点还是在社交上,为了让玩法和社交能够更好的结合,游戏的平衡性和游戏社区内的氛围建设非常重要。为了保证游戏的健康运转,祖龙娱乐对反外挂的工作非常重视。
《九州天空城3D》安全测试的开端
安全问题相比游戏的其他问题,由于其测试的门槛较高,经常会被手游开发者忽略。一些手游开发者会抱有“等出现了问题之后再去修复”的想法, 然而等到问题出现的时候,往往对游戏的收入、口碑已经产生了很大的影响,常见的外挂危害包括以下几点:
腾讯游戏从进入游戏行业之后,就遭遇过不少外挂的侵袭,因为不断的踩坑,腾讯在进入手游领域之初,非常的重视安全测试。腾讯WeTest手游安全测试团队从2011年就开始对手游安全领域进行探索和技术积累,旨在通过提前发现游戏版本的安全漏洞,预警风险,帮助提高腾讯游戏的品牌和口碑。目前腾讯WeTest团队对腾讯内部所有游戏都会进行详尽的安全测试,《王者荣耀》、《乱世王者》、《穿越火线:枪战王者》以及《火影忍者手游》等精品游戏每个对外版本都会进行严格的安全测试。
在端游领域沉淀多年的祖龙娱乐,同样非常清楚外挂对于游戏平衡性的危害,由于在游戏质量测试方面与WeTest有过多次成功的合作,因此在《九州》上线前,祖龙方面很果断的就决定与腾讯WeTest手游安全测试进行合作,腾讯WeTest也希望能将自己在手游安全领域的经验传递给《九州》团队。
本文整理了《九州》安全测试过程中的一些思路和实践内容,与手游开发者分享,希望手游开发者能够了解安全测试,重视安全测试。(文中的漏洞均已修复,仅做学习交流参考)
技术难点
手游的使用场景与传统APP有着巨大的差异,不同的游戏玩法, 技术实现都不一样,因此手游安全测试团队需要对《九州》所有模块进行比较全面的风险分析,针对游戏核心玩法和游戏中高价值产出点重点进行漏洞挖掘,提前暴露游戏中潜在的安全风险,最大程度降低线上外挂打击成本。
《九州》游戏客户端使用Unity3D引擎开发,但是手游安全测试团队在接入协议工具中发现客户端并不是100%用C#实现,仅从C#层接入工具无法获取游戏所有通信协议数据。逆向分析游戏客户端后发现实际还有大量游戏逻辑使用Lua开发,对应功能的协议数据也在Lua层进行组包。接入协议工具必须从C#和Lua层进行Hook,获取协议明文数据。
另外,在对协议数据的解析中也遇到一些挑战,游戏同时使用了自定义和PB两种协议结构,需优先对自定义协议结构进行格式转换,实现针对自定义协议Decoder进行解析,PB部分则直接用PB Decoder进行解析。
测试方案
一、测试分析及规划
1、确定游戏核心玩法
《九州》的核心玩法主要是组队副本及各种活动,另外还有战斗外角色技能学习、装备、宠物等。
2、确定安全测试策略
《九州 》是一款使用Unity引擎开发的RPG游戏,游戏采用自定义的二进制协议 (XML +PB),逻辑使用 c#+lua开发。
本次安全测试目标覆盖整个游戏模块,主要分为周边系统和局内战斗逻辑,针对该游戏类型,本次测试以协议为主,针对部分游戏内的战斗逻辑,采用逻辑修改的方式进行测试。
WeTest手游安全测试针对三方面进行检查:
1)游戏客户端资源安全测试
2)游戏逻辑安全测试
3)服务器稳定性
二、测试的实施
腾讯WeTest手游安全测试团队将审核的内容分为静态安全漏洞和动态安全漏洞。
静态漏洞扫描
主要通过静态扫描的方式,对游戏apk中配置档、资源文件、脚本文件、manifest.xml、so文件,通过自动扫描的方式来进行检查项的确认。(目前此块内容已集成到SR手游安全测试方案中,覆盖了120+条安全检查项和信息安全测试项)
动态风险分析
主要根据游戏特定的内容和玩法,针对性地分析安全风险点,通过协议、函数、内存、脚本等技术,多维度检查游戏服务器对相应的风险点是否有完善的校验或反外挂策略。
根据对漏洞类型的提炼,WeTest手游安全测试团队根据《九州》具体玩法,推导出相应的获益方式。通常根据风险点分析的方式,可以完整覆盖到游戏中涉及到安全的部分,结合检查点,就生成了可以在实际操作中执行的用例,形成闭环。
SR手游安全测试深度覆盖
其中比较典型的检测方式有:
1、双端协议修改
手游安全测试工具通过直接注入游戏的组包函数,自动解析协议结构,免去了需要依赖测试人员分析二进制数据进行协议破解。在没有协议结构文件时也能自动解析协议结构。手机和web端都可以进行协议数据展示,在手机上可以实施地显示协议发包的效果,在web上可以动态一键修改相应字段,互补不足。
双端协议修改工具web效果展示
2、函数动态修改
函数动态修改原理
对于单局类玩法的手游,函数动态修改具备最强的漏洞能力。但是早期的测试方法效率非常低下,需要每个函数单独编写hook函数、定义函数指针变量、申请独立hook资源、重新编译代码。同时,使用门槛很高,只有专业的安全专项测试人员才能操作。手游安全测试团队的函数动态修改工具通过动态通用hook技术,不需要测试人员再进行hook函数编码。
函数动态web效果展示
3、内存对象修改
WeTest手游安全测试团队为测试人员直接展示出游戏中对象列表、对象属性名称、属性值等信息,并且可以以对象为单位进行搜索,告别传统手游内存测试工具搜索“内存数值”方式定位目标内存地址的低效方案,实现该项测试成本降低70%。
WeTest手游安全测试团队为《九州》挖掘出的部分漏洞和修复方案
一、客户端安全漏洞
1、游戏逻辑 DLL未加密,可直接被反编译,降低了外网破解游戏的难度,也存在被外挂利用的风险。
2、游戏LUA脚本未加密,可直接从内存中dump出源码,增加了游戏被外挂利用的风险。
二、游戏逻辑问题
1、部分协议字段冗余,且校验不严格,存在严重逻辑问题。如生活制作功能中,物品 随机应该由服务器下发,而非客户端上报,否则存在制作指定物品的风险;对物品等级缺失 校验,导致低等级可制作高等级物品 。
2、部分验证逻辑只存在于客户端。客户端是不可信任的,客户端验证只能用于UI显示 控制,后台应该同样增加校验,防止客户端伪造或构造数据来绕过验证。如“宠物更名”中,服务器应该检查长度限制,否则由于该数据会写入DB,可能被利用造成客户端对服务器数据库攻击。
问题示例
问题一:生活技能制作漏洞 ,低等级技能可生产高等级物品
【漏洞类型】:越权操作
【问题描述】
生活技能存在漏洞,使用道具制作请求篡改 recipeXXX参数,可生产高于现有等级的道具
【影响面】
属于越权操作风险,利用漏洞可在游戏中获益。
问题二:一个同伴可以重复助战,存在刷评分排行榜的风险
【漏洞类型】:刷战力
【问题描述】
使用一个同伴ID通过forXXXXX_pos多次发送,可用一个同伴重复助战
【影响面】
可用于刷评分,影响游戏平衡
问题三:对达到购买上限的道具,可修改购买方式无限购买
【漏洞类型】:无限购买
【问题描述】
用其他货币可以无限购买道具
操作方法:
1.录制交易系统—商铺购买协议“MalXXXXping”
2.修改协议字段“pa_type”参数为“1”
3.发送协议
银币购买达到上限:
修改用金币购买成功:
【影响面】
突破游戏限制,使用元宝可加快成长。
强调文字解决办法
1、游戏客户端安全方面,需对客户端进行加壳,dll代码文件加密,Lua脚本则建议改为Luac或Jit模式,有效提升客户端被分析和破解的难度。
2、其他协议漏洞大部分属于后台检验疏忽型,需针对性完善后台逻辑校验。
最终效果
在项目测试阶段,手游安全测试团队为《九州天空城3D》发现了数个漏洞,并针对这些漏洞产生的原因和修正都提供了专业意见,并很快顺利修正了问题,与开发商一起将隐患消除。《九州》的技术负责人表示:“外挂问题一直是祖龙在做游戏过程中要跨越的雷区,MMO类型游戏内容很多,需要专业的安全团队来对游戏进行一个全方位的检测,WeTest手游安全测试为《九州天空城3D》正式开启不删档,创造安全、公平、健康的游戏环境提供了坚实支撑和保障。”
关于腾讯WeTest手游安全测试团队
腾讯WeTest手游安全测试团队从2011年初开始对手游安全领域进行探索和技术积累,旨在通过提前发现游戏版本的安全漏洞,预警风险,打造出业界领先的手游安全测试技术方案,在工具上已经支持所有腾讯在研和运营的手游项目。团队通过使用与正式服同样的游戏客户端和服务器,模拟外挂工作室制作外挂的过程,依靠自身的技术积累来提高专业程度,持续保持漏洞的发现率。
目前提供了专家测试服务,希望通过提前发现游戏版本的安全漏洞,预警风险,帮助提高腾讯游戏的品牌和口碑。
服务目前已经对外开放,欢迎前来使用http://wetest.qq.com/product/sr
如果对使用当中有任何疑问,欢迎联系腾讯WeTest企业qq:800024531
建一座安全的“天空城” ——揭秘腾讯WeTest如何与祖龙共同挖掘手游安全漏洞的更多相关文章
- MTSC2019大会日程重磅发布,腾讯WeTest独家Topic大揭秘!
WeTest 导读 中国移动互联网测试开发大会 Mobile Testing Summit China(简称 MTSC)是由国内最大的移动测试技术社区 TesterHome 发起的软件测试行业技术会议 ...
- MTSC2019-腾讯WeTest独家揭秘移动游戏测试和质量保障 QA 黑科技
WeTest 导读 TesterHome 联合腾讯 WeTest 出品 MTSC2019 重磅游戏测试 Topic ,首次公开揭秘腾讯亿级用户游戏背后的质量保障 QA 黑科技. 2019 年,中国游戏 ...
- 深度揭秘腾讯云TSF日调用量超万亿次背后技术架构
腾讯云TSF是整合外部开源框架和腾讯内部历经多年锤炼的PaaS平台打造而成的企业级分布式应用服务开发与托管平台,本文重点对TSF中负责服务托管的PaaS平台进行揭秘,从技术角度解析TSF 平台是如何每 ...
- Cocos2d-x官方在线视频-Cocos2d-x3.2《2048》手游开发揭秘
Cocoachina 官方在线视频 http://cn.cocos2d-x.org/tutorial/lists?id=58 一.游戏介绍 2048游戏是一款风靡全球的休闲类游戏,通过控制4X4范围内 ...
- “战术竞技类”外挂打击已开始!揭秘腾讯We Test游戏安全服务新动作!
商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/353.html We Test导读 国服PUBG的游戏安全将由我 ...
- 剑指Kubernetes 揭秘腾讯云的PaaS技术选型策略
1.前言 Kubernetes 很火,一大批互联网公司早已领先一步,搭建起专有的 PaaS平台,传统企业们看到的 Kubernetes的趋势,亦不甘落后,在试水的道上一路狂奔-- 虽然,Kuberne ...
- 深度揭秘腾讯云新一代企业级HTAP数据库TBase核心概念
腾讯云PostgreSQL-XZ(PGXZ)经过公司内部多年业务的打磨,在2017年改名为TBase后,正式对外推出,目前已在政务.医疗.公安.消防.电信.金融等行业等行业的解决方案中大量应用.TBa ...
- 破解者是如何篡改游戏内数值的,揭秘Android手游破解全过程
由于Android系统的开放性,让人人都是开发者成为可能,也正因如此,手机APP遭受破解和盗版问题长期存在,且愈演愈烈.尤其是手游 行业,如刀塔传奇.植物大战僵尸.2048等知名游戏被破解的案例不胜枚 ...
- 揭秘重度MMORPG手游后台性能优化方案
本文节选自<2018腾讯移动游戏技术评审标准与实践案例>手册,由腾讯互娱工程师王杰分享<仙剑奇侠传online>项目中游戏后台的优化经验,深度解析寻路算法.视野管理.内存优化. ...
随机推荐
- JDK API文档中,<E>、<T>、<?>分别代表什么意思?
Type ParameterConventionsYou have already seen the angle bracketand single letter notation used tore ...
- Struts2学习笔记(五)——Action访问Servlet API
在Strut2中访问Servlet API有三种方式: 1.通过ActionContext访问Servlet API,推荐使用这种,但是这种方案它获取的不是真正的事Servlet API. 步骤: 1 ...
- go web 第二天 学习笔记之文件上传
package main import ( "crypto/md5" "fmt" "html/template" "io" ...
- jquery的2.0.3版本源码系列(6):2880-3042行,回调对象,对函数的统一管理
目录 1 . 回调对象callbacks的演示 回调的使用有一点像事件绑定,先绑定好,等到有点击事件或者其他时就触发. <script src="js/jquery-2.0.3.js& ...
- Java内存原型分析
Java虚拟机内存原型 寄存器:在程序中无法控制 栈:存放基本类型的数据和对象的引用,但是对象本身不存放在栈中,而是存放在堆中 堆:存放用new产生的数据 静态域:存放在对象中用static定义的静态 ...
- 关于Java的静态:静态类、静态方法、静态变量、静态块等
原文地址:Java static keyword - Class, Method, Variable, Block, import - JournalDev 很少看到文章能把静态这个问题解释的很清楚, ...
- jQuery给表单设置值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- jumpserver-0.3.2 堡垒机环境搭建(图文详解)
下载安装包:https://github.com/jumpserver/jumpserver.git 解压 三.执行快速安装脚本 cd /opt/jumpserver/install pip inst ...
- 延迟实例化 Lazy<T>
之前写的设计模式 单例模式中,推荐了使用Lazy<T>来达到线程安全和减少系统资源消耗的作用. 作用及优点: 创建某一个对象需要很大的消耗,而这个对象在运行过程中又不一定用到,为了避免每次 ...
- Selenium+IDEA+Maven+TestNG环境搭建
第一 安装java环境. 1. 下载并安装Jdk1.7或Jdk1.8 http://www.oracle.com/technetwork/java/javase/downloads/index.htm ...