远飞闲记

阅读、思考、技术

Android和H5网游加速器解决方案的探索

🗓️发布日期:2020-07-02 · 🗺️总字数: 1270 字 · ⏱️阅读时间: 3 Minute

上个月业余时间和兴趣的驱使对网游加速器进行了研究和技术探索,这里对当前的手机网游加速原理和使用技术作个记录和总结,废话也不多说了直接上干货,在介绍原理之前我们先区分一下游戏加速的类型。 目前我们所说的网络加速器其实分为对游戏行为进行加速和对网络速度进行加速两种,我们研究的是第一种类型就是对游戏行为的速度进行加速已达到比如挂机类的游戏在上边耽误太多的时间直接最大化游戏的战斗速度来获得游戏结果;

在手游中的加速技术,我们还是主要讨论 Android 平台上边的加速原理,普遍情况下 Android 平台我们主要是对系统 Clock 时钟进行hook 然后通过修改系统的时钟时间值来达到我们的加速目的,其中还要确认需要加速的游戏是使用的什么引擎;在介绍游戏引擎的Hook 上边我们先来看以下Hook工具有哪些:

Hook 工具

包括目前市面上一些加速器比如:X8沙箱等都使用的是 CydiaSubstrate1 SDK来进行 hook, Cydiasubstrate 目前只支持Android2.3 以下版本,接入简单如果2.3以上需要对系统进行Root 才能使用;其次还有个国产的爱奇艺的Github上获得 xHook2 来达到我们的对上边游戏引擎对应接口的Hook;个人推荐 xHook 比较简单而且小巧不需要Root权限和支持到Android 4.0; 以上Hook工具接入都比较简单,有点Android NDK的基础几乎照着文档走一遍就行了,但Hook工具的使用范围还是比较广的,不能在多说了再多说就需要打屁股了;对注入工具进行NDK编译后可以通过获得对应版本的 .so 文件然后通过 apktool 工具修改包的 smali源代码 对apk包进行二次打包就可以了;

Cocos和Unitiy的加速原理

  • Cocos2d 我们查看其源代码得知使用 /system/lib/libc.sogettimeofday()/settimeofday() 两个接口来进行渲染帧获取得时间,所以我们可以Hook这两个接口来达到加速;

    具体参考代码如下:

    #define GETLR(store_lr)							\
        __asm__ _ _volatile__(						\
    			  "mov %0, lr\n\t"				\
    			  :	"=r"(store_lr)				\
    									)
    
    int SPEED=2; //速度值
    int (*oldgettimeofday)(struct timeval*tv, struct timezone *tz);
    int mygettimeofday(struct timeval*tv, struct timezone *tz) {
        unsigned lr;
        GETLR(lr);
        int ret = oldgettimeofday(tv,tz);
        if(ret == 0){
    	tv->tv_usec *= SPEED;
    	tv->tv_sec *= SPEED;
        }
        return ret;
    }
    
  • Unity 需要查看具体包使用的是mono平台运行C#还是il2cpp的方式来运行,怎么区分包使用的技术解压 apk 包如果其中包含 lib/*/libmono.so 则使用的是 mono 平台,如果是mono 平台我们查看 mono的代码得知可以通过 mono_class_from_name(MonoImage *image,const char* name_space,const char* name)和 mono_class_get_method_from_name 获取到 UnityEngine.Time 来修改游戏的运行时间达到加速目的;

    代码参见如下:

    int __fastcall sub_1A70(MonoImage *image, const char* name_space, const char *name)
    {
        static findset_timeScale = 0;
        if ( !j_strcmp(name, "Time") && ! findset_timeScale && !j_strcmp(name_space, "UnityEngine") )
    	{
    	    dword_705C = image;
    	    dword_7064 = mono_class_from_name(image, "UnityEngine", "Time");
    	    dword_7058 = mono_class_get_method_from_name(dword_7064,set_timeScale,1);
    	    findset_timeScale = 1;
    	}
        return mono_class_from_name(image, name_space, name);
    }
    

H5游戏的加速原理

其实H5游戏的加速相对Android和iOS等移动平台都比较简单,比如市面上常见的H5游戏引擎有Egret、Laybox、Cocos Creator等,我们可以通过神器 Chrome 浏览器来断点和抓取游戏的客户端代码进行查看,如Egret其中可以修改游戏运行的帧数和Hook Tween和Timer 两个类的接口对参数进行修改来来达到我们的加速目的,或者有很多游戏客户端逻辑其实通过某个全局的静态参数来控制,我们也可以找到直接修改其中参数值来达到我们目的;

注意事项

  • 在写Hook库时注意Android NDK版本;最好使用 android-ndk-r16b 来编译;
  • 在修改 smail 代码的时候注意 本地寄存器最大长度只支持3;

⚠️ 温馨提示: ️本文所讨论的技术仅做研讨使用,请遵守法律使用!


  1. Cydia Substrate ↩︎

  2. xHook ↩︎

🏷️ android 技术