您的位置:首页 > 数码常识数码常识

网游加速器工作原理说明(游戏加速器工作原理)

2025-05-11人已围观

网游加速器工作原理说明(游戏加速器工作原理)
  相对于`Android APP`,针对`iOS APP`的分析和破解要少得多,这也导致上线`AppStore`的绝大部分应用都是裸奔的,这也给黑产带来了便利。这篇文章将对`iOS`平台的一款游戏加速辅助进行分析,便于进行防御研究。

  游戏加速器工作原理

  一、基础知识

  这款游戏加速器是以动态库方式注入到APP中加载运行的,其介绍说只能在越狱手机运行,因为动态库的注入依赖于框架:MobileSubstrate。但是在非越狱手机也可以实现注入的,一个方便的框架可以参考我们组刘培庆开发的 MonkeyDev。

  动态库本质是一个Mach-O格式的文件,和Windows的DLL文件、Linux的so文件作用类似。其不能直接运行,而是通过系统链接加载器dyld完成加载和初始化。dyld是开源的,可在 Source Browser 查看。简单介绍下动态库dylib的加载过程:

  1、系统内核加载dyld,执行其中的__dyld_start()函数2、初始化运行环境,如setContext(mainExecutableMH, ...)3、加载共享缓存,这个是为了优化程序启动,即映射在内存的动态库只会加载一次4、加载DYLD_INSERT_LIBRARIES指定的动态库5、链接主程序,如link(sMainExecutable, ...)6、链接依赖的动态库7、弱符号绑定8、调用所有的初始化方法,包括动态库的构造器,load方法等9、查找主程序的入口点然后返回二、加速器原理2.1 构造器入口

  本节主要使用 Hopper Disassembler 来进行分析。Hopper分析完成后如下图所示:

  其中加速器的构造器函数为:__GLOBAL__sub_I_MFAccelerator.mm。反编译结果如下:

  其区分了游戏的类型:U3D和cocos2d。伪代码如下:

  可以看见,对于 cocos2d,其是通过内联HOOK gettimeofday函数完成的。而对U3D游戏相关时间函数的内联HOOK是在fake_unity3d_finish_launching中完成的,其的反编译代码很长,这儿只给出了关键的部分:

  int __ZL29fake_unity3d_finish_launchingP10objc_classP13objc_selectormm(void * arg0, void * arg1, long arg2, long arg3) {...r4=dlsym(0x1 ^ 0xffffffff, "vm_region");r0=0x3972;asm{ vmov.i32 q4, #0x0 };r5=sp + 0x38;r8=0x0;*(r0 + 0x4e1e)=r4;stack[2026]=mach_task_self;goto loc_4e54;...loc_4f48:MSHookFunction();goto loc_4f62;...loc_4f48:MSHookFunction();goto loc_4f62;}

  通过动态调试发现:U3D游戏的内联HOOK是通过内存搜索特征串得到的。大致流程如下:

  1、使用vm_region获取当前可执行文件的内存空间2、在此内存空间搜索两个特征串,如下:3、只有在这两个特征串都存在的情况下,才会内联HOOK。至于这两个特征串的含义,笔者暂时不知。4、然后在距这两个特征串特定的位置进行内联HOOK,如下:

  对于不同的U3D程序,特征串在的位置并不固定。

  2.2 cocos2d 游戏加速

  cocos2d的游戏加速实现主要在__ZL13$gettimeofdayP7timevalPv中,主要反编译逻辑如下:

  int __ZL13$gettimeofdayP7timevalPv(void * arg0, void * arg1) {r4=arg0;r2=*0x87a8;r0=(r2)(r4, arg1, r2); // 这儿是调用gettimeofday并填充timeval结构if (r0==0x0) {r5=*(r4 + 0x4);r6=SAR(r5, 0x1f);r8=0x87b8;asm{ smlal r5, r6, r0, r1 };r0=*r8;r1=*(r8 + 0x4);if (r2 !=0x0) { // 这儿是判断全局变量 saved_usecs 是否有值r0=r5 - r0;r0=__floatdisf();r0 << 0x10 | r0;s0=*0x8700;r1=0x37ba;*(r8 + 0x4)=r6;asm{ vmul.f32 d0, d16, d0 };*r8=r5;r10=*(r1 + 0x5006);r11=*(r1 + 0x500a);r5=__fixsfdi() + r10;r6=r11 + CARRY(FLAGS) + r1 + 0x5006;*r4=__divdi3();*(r4 + 0x4)=__moddi3();}else { // 第一次调用才会到这// 保存 timeval 到 saved_usecs*0x87bc=r6;*0x87b8=r5;}// 保存上次获取的timeval值到saved_usecs_last*0x87c4=r6;*0x87c0=r5;r0=0x0;}return r0;}

  体现加速的代码主要在if (r2 !=0x0) {...}中,对应的汇编代码如下:

  所以加速器伪代码大致为:

  2.3 U3D 游戏加速

  U3D游戏的加速主要通过内存修改完成,涉及三个函数:setSpeed由外部传入加速倍速、fake_time_init和fake_time_scale都通过修改内存特定位置完成。它们的反编译代码如下:

  void -[MFAcceleratorMgr setSpeed:](void * self, void * _cmd, float arg2) {arg2 << 0x10 | arg2;if (*0x87a0==0x1) { // u3d*0x86ec=s0; // 倍速保存在 speed_3d 中CMP(*0x8794, 0x0); // 填充 g_param 结构,这个就是实现加速的内存位置}else { // cocos2d*0x8700=s0; // 倍速保存在 g_speed 中}return;}

  int __ZL14fake_time_initPv(void * arg0) {*0x8794=arg0;r1=*0x87ac;r0=(r1)(arg0, r1); //调用原始 ori_time_initif (*0x8794 !=0x0) { // g_param 不为 0*(*0x8794 + 0xb8)=*0x86ec; // 写 speed_3d 到内存特定位置}return r0;}

  int __ZL15fake_time_scalePv(void * arg0) {r0=arg0;r1=*0x8794;if (r1==0x0) { // g_param 不为 0r1=r0;*0x8794=r0;if (r0 !=0x0) {*(r1 + 0xb8)=*0x86ec; // 写 speed_3d 到内存特定位置}}else {*(r1 + 0xb8)=*0x86ec;}return 0x0;}

  三、反加速/加速检测防御

  从上面可以看见,本文介绍的加速器的一般流程:

  1、向APP注入加速模块,检测特征类2、运行时替换、内联HOOK时间函数或者内存直接搜索和修改

  所以我们的防御方法大致如下:

  防御方法说明APP完整性检测检测APP是否重打包,是否存在注入模块APP符号混淆去掉特征类APP逻辑混淆 + APP反调试提高APP破解分析难度APP HOOK函数检测检测关键函数(如时间函数)是否被替换

  ----------------!!喜大普奔!!----------------

  杭研iOS客户端安全组开发的iOS 加固套件已上线,支持的功能包括字符串加密、逻辑混淆、符号混淆、反调试等,支持应用APP、游戏APP、SDK等各种工程的加固,更多高级功能正在开发中,也承接各种专属定制,欢迎咨询,咨询热线:hzzhangwei15@corp.netease.com

  ----------------!!欢迎试用!!----------------

  四、 关于动态调试构造器的补充说明

  要想在动态库的构造器中调试,需要一点小技巧,如下:

  由基础知识中的动态库加载过程我们知道,构造器的初始化位于第8步,经过调试发现入口是在:doModInitFunctions函数中。所以在_dyld_start时,我们可以在doModInitFunctions下一个断点,如上面所示。下断点的技巧可以参考文章:一步一步用debugserver + lldb代替gdb进行动态调试。在执行到doModInitFunctions时,所有的动态库都完成了加载,只不过还没有初始化,现在可以对我们关注的动态库的构造器下断点,如下:

  多说一点,在动态分析时,可以直接在方法调用的地方中断,然后参考相应的传参寄存器,从而加快分析过程,也便于理解代码逻辑,一个例子如下:

  上面就是小居数码小编今天给大家介绍的关于(游戏加速器工作原理)的全部内容,希望可以帮助到你,想了解更多关于数码知识的问题,欢迎关注我们,并收藏,转发,分享。

  94%的朋友还想知道的:

  websocket工作原理(websocket的原理)

  网游加速器是什么工作原理解析(网游加速器的原理是什么)

  mysql原理和运行机制解释(MySQL工作原理)

  ajax工作原理步骤说明(ajax原理和实现步骤)



  154039
 

很赞哦! ()

随机图文