导读:2022 年 9 月 15日,网易智企“易+”开源计划正式发布网易易盾游戏安全测试工具——GameSentry,本文将从技术角度分析 GameSentry 的设计逻辑与设计经验。
背景
GameSentry 诞生自网易易盾移动安全团队,源自团队多年在一线的经验和方法论沉淀。是一款简单、高效的工具,主要通过分析游戏协议内容、游戏函数逻辑和对应的地址、部分代码热更、自动化 Hook 等功能达到降低深层次安全测试门槛的目的。
GameSentry 目前已正式开源(网易易盾 GameSentry 正式开源,做游戏安全保障的尖兵利刃),我们希望通过降低安全测试的复杂度,让游戏公司能够提前发现和感知漏洞和风险点,构建更成熟的安全保障体系,降低游戏风险,回馈玩家对游戏的热爱。
什么是安全测试
通常游戏的生命周期可分为【开发】【测试】【发布】【运营】四个阶段。
在游戏发布之前,做好安全测试工作是非常关键的一环,好的【测试】不仅能更好加强外部防御,抵御发布后的外挂破解等侵害,同时还能查漏补缺,发现此前内部设计和代码架构上的疏忽,提前优化以期减少正式上线后的 bug,让玩家们获得更好的游戏体验,使得游戏的生命周期更为长久。
目前,常见的游戏安全测试有以下三种方向:
游戏协议漏洞测试:通过修改协议内容来检查游戏在设计、数据校验、逻辑或数值设计上有无可被利用的风险点。这里与 QA 测试存在一定的重合,但侧重点不同。协议测试的输入不受客户端的限制。比如聊天功能,客户端的输入框是一定会有长度、类型限制的,而协议则没有这些限制。
服务器健壮性测试:通过发送畸形、大量、无序的数据,校验服务器是否能正常运行。防止外挂或工作室恶意攻击,使服务器异常或宕机。
外挂模拟测试:模拟外挂对游戏进行内存修改、变速、资源文件修改等操作,检测是否能在游戏中获得收益或降低游戏难度。
测试者们一般会根据需求选用合适的技术和工具,从攻击者的角度对游戏进行逆向分析和破解,进而主动发现和挖掘系统中存在的弱点、技术缺陷和安全漏洞,并进行缺陷放大和风险性评估,以期提前暴露游戏应用程序中潜在的安全风险,提供安全漏洞修复方案,最大程度降低事后危害与外挂打击成本。
通常有哪些测试方法
资源提取:AssetStudio、UABE
C# 代码:il2cppdumper、dnspy
Lua 代码:dump、load、reload
修改内存:GG、frida、hook技术、root 相关
下文将介绍主要的风险以及测试方法。
资源破解
危害:游戏资源泄露
测试步骤:使用工具破解资源,观察是否存在未加密或可破解的资源,包括图片、音频、模型等;
注意:以游戏中不应该暴露的内容为判断,比如道具图标,背景音乐等;不因开场动画,主题曲,CG 这类的资源置为不通过。
unity3d 引擎使用:AssetStudio/GD Ripper;
UE4 引擎使用:umodel;
neox 引擎:GD Ripper/quickBMS;
npk 文件:NXPK 格式,EXPK 格式使用 NPKExtractor1.1.5.5;
使用 Extractor 工具提取
重签名校验
危害:
删除关键美术模型(怪物、角色、宠物等)文件,重打包,观察是否影响游戏逻辑-引发漏洞,且玩家因此获益。
删除音频资源(战斗音效、背景音乐等)文件,重打包,观察是否影响游戏逻辑-引发漏洞,且玩家因此获益。
删除特效资源(技能特效等)文件,重打包,观察是否影响游戏逻辑-引发漏洞,且玩家因此获益。
如不能精确定位文件内容与类型,随机抽样测试。
如果美术资源是多个文件分开放置,并可以从文件名中看出,尝试修改文件名,观察能否让免费皮肤或道具替换为收费资源。
测试步骤:
APK 解析后删除部分资源文件后依旧可以重打包,观察是否可以正常安装游戏、运行游戏。
dll 修改风险
危害:修改游戏逻辑。
测试步骤:
使用 ilspy 的 reflexil 插件修改 Assembly-Csharp.dll。
重新编译为 dll,重命名替换原有 dll 文件。
打包 APK,安装运行,观察是否生效。
SO 破解风险
危害:修改游戏正常逻辑
测试步骤:
观察函数列表,逻辑函数名是否被删除。例如:
mono_image_open_from_data_with_name 、
luaL_loadbufferx 、
il2cpp_image_get_class 等。
符号查找
查找 data-%p,观察是否存在(il2cpp.so),一些特殊符号一定程度上能增加游戏被破解的概率。
反调试检测
测试步骤:
使用工具打开游戏。
在 libc.so 和 open 处下断点。
运行游戏,观察是否暂停。
存档移植
测试步骤:
将游戏目录下的文件拷贝到 PC 中。
将文件拷贝到另外一台设备/模拟器中。
观察是否继承(部分继承)原先游戏的进度。
存档文件明文存储
测试步骤:
观察是否存在存档文件,.sqlite, .db 后缀的文件,测试能否用 sqlitemanager 打开。
观察是否存在其他存档文件,直接用 notepad 打开,查看是否存在明文。
观察在配置文件中是否存在明文隐私信息,例如用户的账户密码,资源的存放路径等。
内存测试
测试方法:分析游戏逻辑,修改对应位置的内存。(此过程需要使用工具对 APK 反编译、并 dump 内存内容,并使用 Hook 进行修改)
此内容需要根据不同游戏、不同逻辑进行测试。主要检测越权、数值、逻辑等异常。
协议测试
测试方法:获取游戏中全部协议,并对其进行修改重发。(此过程需要工具对 apk 反编译,获取到协议发送相关代码,必要时需要对其进行解密。也需要使用到 Hook 对相关函数进行修改)
主要检测越权、畸形数据、重发等。不同游戏需要构造不同的测试用例。
GameSentry 有什么优势
普通安全测试需要测试人员有较高的逆向水平,对人员的技术要求较高。对于结果导向的测试,虽然逆向必不可少,但逆向费时费力,测试质量与逆向水平关系并不大。所以需要一款工具让工作内容不再放在逆向、Hook、Lua 修改这些技术上,而是直接关注游戏的逻辑。
就以结果为导向的测试而言,虽然对逆向水平要求没那么高,但逆向却费时费力,也并非每个团队所能接受的。
GameSentry 主要通过分析游戏协议内容、游戏函数逻辑和对应的地址、部分代码热更、自动化 Hook 等功能达到降低深层次安全测试门槛的目的。可以简化内存测试、协议测试过程中对于 APK 逆向、Hook 编写、脚本修改、脚本 dump 的繁杂操作,大大降低测试人员的上手门槛和逆向工作。
而从实践效果上看,GameSentry 的设计思路是从攻击者的角度对游戏进行逆向分析和破解,主动发现和挖掘系统中的弱点、技术缺陷和安全漏洞,并进行缺陷放大和风险性评估,提前暴露游戏潜在安全风险,让安全团队可以在危害发生前就着手准备漏洞修复方案,可以最大程度降低事后外挂危害与外挂打击成本。
为什么要开源
网易易盾在二十多年的一线实战经验中面对不同游戏类型场景痛点,沉淀了大量的经验、方法论,并基于此构建了一套成熟的工具集。这些年我们从社区吸取了很多营养,所以也想把这样一个融合团队多年经验的新一代产品回馈到社区。
作为一个开放的项目,我们认为将项目开源也有利于推动产品迭代,比如 Unity 的版本众多,且 il2cpp 改动比较频繁,在兼容性上面临着巨大的挑战。而开源,不仅能让大家能享受到集体的智慧成果,便捷了游戏开发者的测试工作,也可以通过社区的贡献,覆盖兼容更多的引擎版本,提升行业整体效率,不重复造轮子。
更重要的是,作为游戏热爱者,我们希望通过降低安全测试的复杂度,让游戏公司提前发现并感知到漏洞和风险,构建更成熟的安全保障体系,降低游戏风险,延长游戏生命周期,提升用户体验,回馈玩家对游戏的热爱!期待未来与更多游戏爱好者、游戏开发商们携手共进,生态共享。
目前版本的简要说明
功能 | 支持情况 |
函数展示 | ✔ |
函数 Hook | ✔ |
内存实例展示 | ✔ |
函数调用 | ✔ |
函数修改 | ✔ |
一键 Log 展示 | ✔ |
dump(Lua、dll) | ✔ |
Lua 无重启修改 | ✔ |
协议展示 | ✔ |
协议修改 | ✔ |
自定义 | ✔ |
欢迎加入贡献
你是否正在规划新项目上线前的安全测试?
你是否正在头疼项目 APK 逆向的问题?
非常欢迎你参与游戏安全测试工具使用及意见反馈,我们期待你的加入。