外挂介绍
风之旅游戏IOS 1.1.3.210版曾经出现过神器助手外挂,外挂存在无敌功能,风之旅游戏属于Unity3D引擎开发的手游,下面详细介绍神奇助手无敌功能实现方式。
实现原理
神奇助手更新版本之后,针对外挂模块分析发下,外挂提高了安全意识,主要体现为加强代码安全性,增加逆向的难度,相关操作如下:
1、抹除了功能实现过程中主要的函数符号。
2、对实现功能的关键函数加了混淆。
外挂出现时Unity引擎针对IOS版本采用Mono机制编译代码。下面分析外挂无敌功能实现方式。
一、Mono机制简介
Unity3D引擎采用Mono机制实现跨平台支持,针对Android和IOS不同平台,Unity引擎采用了Mono的不同机制实现跨平台。
1)Android平台的Unity
Android平台的Unity引擎采用了Mono的JIT机制,从而可以支持C#静态编译的文件为IL的中间层代码,运行期间采用Mono的JIT方式动态将IL中间层代码转换为Arm代码,从而实现动态编译动态执行过程。
2)IOS平台
IOS平台中,Unity引擎采用了Mono的AOT(Ahead-Of-Time)机制,静态编译过程中将C#实现的函数直接编译为CPU可执行的原生码(例如:Arm、X86等),用户开发的C#代码编译之后会生成AOT模块的mono_aot_module_
其中g_RegisterMonoModules函数调用了RegisterMonoModules函数,RegisterMonoModules函数负责注册所以静态编译模块全局符号,例如下图所示:
风之旅注册了较多模块,其中mono_aot_module_Assembly_CSharp_info为游戏逻辑相关的模块全局符号,之后调用UIApplicationMain函数开始执行App相关代码。
二、神奇助手无敌功能实现
通过Dump模块方式发现外挂没有修改风之旅主逻辑模块Alice的相关代码,接下来针对外挂模块(Alice.dylib)进行静态分析,发现外挂设置Hook的功能函数如下图所示:
通过上图可看出外挂首先保存了几个重要的全局变量,然后对IOS的UIKit库UIApplicationMain函数进行了InlineHook,通过Hook UIApplicationMain库函数致使外挂能够感知到游戏注册模块的全服符号之后获得执行时机,外挂执行时机中对逻辑代码进行了处理私有化处理,其中外挂将游戏逻辑的mono_aot_module_Assembly_CSharp_info文件符号结构进行私有拷贝,之后将mono_aot_module_Assembly_CSharp_info符号中的MethodTable进行拷贝,对应代码如下图所示:
外挂将拷贝的目的内存以全局方式分配在Alice.dylib功能模块中,之后外挂对MethodTable中两个重要函数进行替换,替换的函数如下图所示:
外挂使用替换MethodTable两个函数指针的方式实现感知游戏逻辑,其中替换的两个函数指针分别为:EntityCollider_LateUpdate和DamgeTrigger_Damage_UnityEngine_Collide,替换指针之后,调用mono的mono_aot_register_modules函数重新注册逻辑模块的全局符号,其中mono_aot_register_modules代码如下图所示:
其中mono_aot_register_modules函数调用g_hash_table_insert_replace以强制替换的方式将原来注册的逻辑模块符号进行替换,从而在游戏执行过程中获得执行实际。
EntityCollider_LateUpdate和DamgeTrigger_Damage_UnityEngine_Collide两个函数负责处理不同类型的碰撞探测,其中DamgeTrigger_Damage_UnityEngine_Collide函数的Hook处理逻辑如下图所示(由于外挂对关键代码进行混淆,贴图为简化之后的伪代码):
通过上图可看出如果打开无敌开关之后,外挂Hook的代码不会执行原来的函数。
通过以上分析发现外挂作者对Unity3D引擎编译的IOS游戏处理机制非常熟悉,可随意替换Methodtable中的函数地址实现InlineHook,通过将全局符号和MethodTable重新拷贝一份。
*转载请注明来自游戏安全实验室(GSLAB.QQ.COM)
原文始发于微信公众号(游戏安全实验室):【案例分析】天天风之旅IOS神奇助手新版本无敌
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论