"知物由学" 是网易云易盾打造的一个品牌栏目, 词语出自汉. 王充论衡. 实知. 人, 能力有高下之分, 学习才知道事物的道理, 而后才有智慧, 不去求问就不会知道."知物由学" 希望通过一篇篇技术干货, 趋势解读, 人物思考和沉淀给你带来收获的同时, 也希望打开你的眼界, 成就不一样的你. 当然, 如果你有不错的认知或分享, 也欢迎通过邮件 (zhangyong02@corp.netease.com) 投稿.
以下为正文:
3 月 25 日, 2018 Unity 技术路演首站: 移动游戏技术分享日在广州举办. 此次活动, 旨在为移动游戏开发者们搭建一个更好的交流平台, 学习 Unity 在移动游戏开发领域的最新工具与应用技巧, 分享最炫酷的游戏开发与行业应用案例, 了解移动游戏开发中的安全问题所能给企业带来的隐患, 帮助开发者提前感知安全隐患, 避免受到损失.
网易云易盾移动游戏安全技术专家陈士留
网易云易盾移动游戏安全技术专家陈士留出席交流活动, 并进行了Unity 手游风险及安全问题 -- 网易云易盾来保驾护航的技术演讲. 在分享中, 他介绍了时下 Unity 手游面临的众多风险及热门外挂, 并重点讲解了易盾安全解决方案的技术原理和实践案例.
一, Unity 手游面临的风险
据统计, 2017 年国内活跃移动游戏 APP 应用约有 9000 款, 其多数存在被破解, 恶意代码插入, 广告插入, 外挂, 二次打包等安全问题. 而这些安全问题为企业带来隐患是, 研发难度增加, 研发成本的提高, 玩家付费意愿减低, 游戏失去公平性, 玩家流失, 直接损失收入 -- 因此, 破除 Unity 手游风险对于开发者来说十分重要.
常见的 Unity 手游风险主要包括破解风险, 外挂工具这两类.
破解风险
破解风险主要有 Unity mono 脚本解密, Unity il2cpp 脚本解析, Assetbundle 资源篡改这三项.
Unity mono 脚本解密
以下两张图为 mono 脚本文件的二进制形式及源码转换.
Unity il2cpp 脚本解析
以 libil2cpp.so 和 global-metadata.dat 作为输入, 使用 Il2CppDumper 即可进行解析:
解析出来的效果如下所示, 类名, 函数名以及对应的偏移都能够被解析出来:
目前 iOS 中还没有能够解析为源码的工具, 但是如果可以解密或解析 Android 脚本, 将会大大方便 iOS 的破解. 因此 Android 的有效脚本加密非常有必要.
Assetbundle 资源篡改
透视功能可让使用修改版的玩家获取不对称优势. 如下所示的某枪击游戏, 将其中 Assetbundle 资源里面的材质属性修改为透明, 即可达到透视的效果.
除了资源被篡改的风险外, 游戏中还存在资源被竞品盗取, 分析的风险.
存档数据被修改
某些游戏存档数据以明文形式存在, 如果这些数据不去服务端校验, 或者是单机游戏的话, 则存在巨大的安全风险, 游戏的各种属性可以直接修改.
外挂工具
游戏修改器
使用修改器能够将伤害倍率从 18% 改成 999.9%, 使得攻击伤害提升了几十倍. 类似的原理也可以实现无敌, 秒杀, 无限蓝, 技能无 CD 等效果, 因此修改器对游戏平衡的危害相当大.
常用的修改器有烧饼修改器, 八门神器和 GameGuardian(GG 修改器及其各种修改版), 其中的 GG 修改器 (GameGuardian) 流行于即时对战类游戏(比如吃鸡游戏).
上图为搜索数值界面, 下图为调用 lua 脚本界面
某 QQ 群售卖的 GG lua 脚本
免 ROOT 修改器
免 ROOT 修改器是指通过第三方软件获得 Root 权限, 可以访问和修改手机游戏中几乎所有的文件, 但这样操作有可能影响游戏的稳定性, 出现死机, 卡顿, 重启等人为性故障.
八门神器附带的免 ROOT 修改器
GG 大玩家附带的免 ROOT 修改器
游戏加速器
加速器分 2 种类型, 一种是手机加速器, 例如烧饼加速器, GG 加速器; 另一种是模拟器加速器, 例如天天加速器. 加速器除了可以加速, 还可以减速. 如下图所示, 使用烧饼加速器, 背景速度会随加速倍数加大而提高.
游戏破解版
破解版提供了很多变态的功能来吸引玩家. 下图是某个站专门破解游戏售卖进行盈利, 他们除了有售卖网站, 还开了淘宝店. 只要月付 150 元, 就已经超过很多游戏的 ARPU 值了. 这样破解版的存在会严重影响普通玩家体验, 给游戏收入和口碑都造成很大的损失.
包括 GG 大玩家, 光环助手等等, 市面上都有各种破解版售卖.
GG 大玩家游戏破解版, 上图为修改版列表, 下图为修改版功能
光环助手游戏破解版, 上图为修改版列表, 下图为修改版功能
模拟按键挂
上图就是一个模拟按键挂, 虽然只是模拟点击, 但是可以做到自动游戏, 可以刷各种金币, 积分, 对游戏平衡也会有比较大的影响. 常见的模拟按键挂包括有触动精灵, 触摸精灵, 按键精灵, 叉叉助手, 游戏蜂窝等等.
二, 易盾是怎么做的?
网易易盾能够提供 Unity mono DLL 脚本加密, IL2CPP 加密, Assetbundle 加密等加密解决方案, 以及反修改器, 反加速, 反模拟器, 反调试等手游通用保护功能和手游风险感知.
Unity mono DLL 脚本加密
通过修改或者 HOOK mono_image_open_from_data_with_name 能够对 DLL 脚本加解密. mono_image_open_from_data_with_name 是 CSharp 脚本的加载函数, 如果 CSharpDLL 脚本做了加密, 需要在这个函数执行之前解密. 因此只要在这个函数这里下断点或者 HOOK, 就可以解密出原始 DLL, 而不需要逆向加密算法. 需要注意的是, 这里有个 memcpy 拷贝操作, mono 会把解密后的 DLL 在内存中留存一份拷贝.
Unity mono DLL 脚本加密经历了三代的技术演进.
第一代加密直接对 DLL 文件进行加密, 在 mono_image_open_from_data_with_name 函数开始处解密. 对于这个的破解方法很简单, PE 结构的文件, 以 4d 5a90 00 这四个字节为 magic head, 这可以做为 CSharp DLL 脚本的特征, 只要搜索 0x905a4d 这个数值就可以了, 由于烧饼修改器是使用 10 进制数值, 将其转换成 10 进制值: 9460301. 因此解密门槛很低, 只要使用修改器就可以解密.
第二代加密基于第一代加密的明显弱点, 针对解密加强了防护. 解密后, 把下图所示的 PE 头抹掉, 使得修改器无法定位到脚本位置. 因此解密门槛比较高, 需要非常强的逆向开发能力才能破解.
第三代加密针对 Csharp 函数做了加密, 也就是方法级加密, 需动态解密.
原始未加密 dnspy 函数解析结果
函数加密后 dnspy 函数解析报错
IL2CPP 加密
Il2cpp 脚本信息以 lib2cpp.so 形式存在, 结合 global-metadata.dat 文件内的符号信息, 即可进行解析, 因此需要对 libil2cpp.so 做 so 加壳, 如下图所示, 原始 libil2cpp.so 用 IDA 可以看到 475 个导出函数:
加固后的 libil2cpp.so 导出函数则为空:
Assetbundle 加密
Assetbundle 未加密时, Unity Studio 可解析出各种资源:
对 Assetbundle 加密后, Unity Studio 就无法解析了:
手游通用保护功能
除去 Unity mono DLL 脚本加密, IL2CPP 加密, Assetbundle 加密等加密解决方案外, 网易易盾也能够提供通用的手游保护功能, 包括反修改器, 反加速, 反模拟器, 反调试, 反模拟点击, 文件校验, 防二次打包, 存档加密, 引擎 SO 定制化加壳等. 一般而言, 这些通用功能任何游戏引擎都支持, 可以根据游戏需求选择一个或多个. 目前, 网易易盾支持的游戏主要包含 Unity3d,COCOS,NEOX 和 UE4.
反修改器
修改器可以实现很多功能, 如无限蓝, 技能无 CD, 无敌, 秒杀, 倍攻等, 是工具党的最爱, 也是专业破解者常用的工具之一. 常见的修改器除了常见的烧饼, 八门神器, 葫芦侠, GG(GameGuardian)以外, 还有很多定制修改版.
其中, GG 修改器是做的最专业的修改器, 专门做了反检测措施(随机化包名, 子进程使用系统进程名等), 因此常规的进程检测对 GG 无效. 但是易盾手游保护采用修改行为检测, 可以通杀所有修改器, 包括所有已知和未知的修改器. 下图是检测效果示例:
反加速
加速器可加速可减速, 主要分为两类: 一是 Android 系统内的加速器, 如烧饼加速器, 叉叉加速器, 一般修改器都附带加速功能; 二是对模拟器进程加速的加速器, 此加速原理跟端游加速相同, 实质是对整个模拟器做了加速, Android 系统内并没有加速器在运行, 比较典型的是天天模拟器附带的天天加速器.
加速器的使用会让个别玩家获得游戏优势, 影响游戏平衡. 但是易盾手游保护对以上这 2 种加速都有检测方案, 而且是针对行为的检测方案, 不针对特定的某些加速器, 通用性更好 -- 对于天天加速器这样的进程加速器, 即使只加速 0.1 倍也可以检测到.
上图是一个加固过的跑酷游戏, 用天天加速器加速生效后, 过了一秒钟左右, 即会闪退.
反模拟点击
模拟点击严格上来说不属于非法外挂, 处于灰色地带, 因此模拟点击器都是公司化动作, 应用很广泛, 但是模拟点击脚本提供的功能对游戏平衡也会带来很大的不良影响. 目前比较知名的模拟点击器, 有叉叉助手, 触动精灵, 触摸精灵, 按键精灵, 游戏蜂窝等.
如下图所示, 触动精灵启动后, 再启动游戏, 保护检测到模拟点击器的存在即会闪退:
但是易盾手游保护使用了进程 + 行为检测相结合的方式, 能够对模拟点击器进行检测.
以上介绍的这些手游通用保护功能各有其特点, 开发者可以按实际需求进行选择:
手游风险感知
网易易盾还能够提供手游风险感知功能, 主要包括包含破解包的检测, 跟破解者无感知对抗, 恶意用户风险评估以及支持私有化部署.
三, 易盾保护方案特点
网易易盾保护方案具有纯 Native 保护, 对引擎 SO 做加壳, 兼容性和稳定性高, 性能影响小, 支持 Windows,Linux,Mac 三平台加固等性能特点.
纯 Native 保护
游戏 dex 内部都是第三方 SDK 以及游戏内部不涉及到游戏逻辑的 SDK. 如果对 Dex 加壳的话, 一方面容易造成 Android 碎片化, 导致 Dex 加壳会降低 app 的兼容性; 另外 Android 存在 Dalvik 和 Art 两种虚拟机, 所以 Dex 加壳会为了兼容 2 种虚拟机而增加处理成本, 从而导致启动耗时增加比较厉害. 阿里和腾讯都有 Dex 加壳服务, 但是支付宝, 微信都没做 Dex 加壳. 支付宝和微信的安全问题应该是所有 APP 中间最严重的, 他们都没做 Dex 加壳, 这很能说明问题, 此外所有腾讯的游戏都没有做 Dex 加壳. 所以如果手游保护需要依赖于 Dex 加壳的话, 兼容性和安全性都是很难保证的. 因此建议游戏不要使用 Dex 加壳.
下图是以一个第三方游戏为例, 使用 jeb 分析其 Dex 包含的模块:
网易易盾可以提供纯 Native 保护, 使游戏保护不依赖 Dex 加壳. Dex 加壳和纯 Native 保护优缺点比较如下:
对引擎 SO 做加壳
基本上所有的破解都依赖于对引擎 so 的逆向分析, 如果对 so 进行了加壳保护, 会大大增加游戏被破解的门槛. 除了对引擎 SO 加壳, 网易易盾还会对敏感函数代码做校验.
兼容性和稳定性高
兼容强的原理在于所有保护都在 SO 层, 不会对 DEX 进行修改, 有效避免了 Android 碎片化导致的兼容问题. 网易易盾的兼容性极高, 可以兼容从 Android 2.3 到 Android 9.0 所有版本系统, 所有模拟器以及所有游戏引擎使用的指令集.
手游保护的稳定性, 需要遵循如下发布流程:
QA 测试: 在 200 台手机上以及各种模拟器上测试;
预线上测试: 将安全模块集成到日活 1000 的 APP 上线测试 2 周;
版本发布: 前面 2 轮都测试稳定后, 正式发布;
线上回归: 先在内部比较小的游戏上线测试, 确保稳定性.
性能影响小
易盾保护方案还具有性能影响小的特点, 无论是 CPU 占用, 内存占用, 启动时间, 电量消耗等方面的影响几乎都可忽略不计.
支持 Windows,Linux,Mac 三平台加固
此外, 易盾保护方案还支持 Windows,Linux,Mac 三平台加固, 加固工具以 jar 包形式提供, 不仅自带极速签名功能, 而且对加固做了全面优化, 速度更快.
加固接入的对接过程包括:
确定游戏加固项;
易盾技术支持云端配置好加固项;
获取 appkey;
下载加固 jar 包工具, 根据使用说明配置好 appkey.
四, 易盾的解决方案获得了哪些客户认可?
网易易盾保护方案广泛应用于实际案例中, 包括网易公司内部的倩女幽魂, 终结者 2: 审判日等手游之中.
在外部, 也有游戏公司多个游戏皆采用了易盾手游保护方案.
最后: 易盾还在现场举办了安全诊断环节, 现场有用户问及加固的流程. 网易客户全工程师李沛然表示, 加固流程上, 一条命令行即可接入, 不会影响开发流程.
"使用很便捷." 李沛然强调. 点击这里可免费试用易盾加固 https://www.163yun.com/product/android-protect?tag=M_cnblogs_8985562 .
来源: https://www.cnblogs.com/163yun/p/8985562.html