手游加速器原理分析和代码实现

老子叫甜甜 提交于 2019-11-29 19:22:47

    前段时间手游加速器很火。以光环为代表,进行C层的HOOK,既可以实现加速,又可以免Root保证手机安全,看起来很不错。

    于是决定学习一下,并且自己用代码实现。经过一段时间的努力,基本上能实现和光环差不多的功能。

    1.首先是基础知识。我们先讲基础知识,再讲如何Hook

    何为加速?加速就是改变应用的运行速度。怎么样才能加速?根据不同的引擎有不同的加速方法。关键还是在认识引擎上。

    市面上大多数的 游戏引擎大致可以分为  cocos2dx、Unity3d、 AdobeAir、白鹭、OpenGL。接下来我们分开来讲解各个引擎的加速方案。

    (1)cocos2dx 引擎一般是会有一个cocos2dx引擎动态库。由于cocos2dx是开源的软件,所以cocos2dx的引擎动态库的名字可以自定义。但是判断是不是cocos2dx引擎的游戏可以查看Java代码目录,是否有org/cocos2dx/目录,如果有这个目录就是cocos2dx引擎。

    coco2dx游戏有个setTimeScale函数,这个函数用来控制运行时间。timeScale的值越大运行速度越快,timeScale值越小运行速度越慢。但是一般的情况下开发者不会去调用setTimeScale。所以我们基本没机会通过HOOK来改变setTimeScale的值。但是我们可以通过引擎的Director来实现。 Director 来有个定时器Scheduler,在每帧更新的时候都会调用Update(float delay)。而update函数里面则会调用timeScale的值,来乘以delay得到运行最终的时间。所以改变delay的值也可以达到加速减速的效果。

    (2)Uity3d 引擎是一个闭源软件,所以会有统一的动态库 libunity.so。所以只要看到有libunity.so动态库,就基本确定是Unity3d游戏。

     Unity3d游戏照样也是有一个setTimeScale函数。所以通过Hook 来达到更改timeScale的值,即能达到加速减速效果。但是Unity3d游戏一般通过C#来开发。然后通过il2cpp或者mono运行时来执行。所以我们要通过Hook il2cpp或者mono的运行时方法来调用setTimeScale。

      il2cpp的关键函数是il2cpp_method_get_class、il2cpp_class_from_name、il2cpp_class_get_method_from_name

     mono的关键函数是mono_get_object_class、mono_class_from_name、mono_class_get_method_from_name

通过HOOK这些函数,就可以更改timeScale的值了。

     (3)Adobo Air 白鹭等引擎。其他引擎没有特别针对的速度的控制函数。所以一般用改变系统时钟的方法来达到目的。

libc.so中有gettimeofday函数。我们通过Hook 系统的gettimeofday函数来改变时间的流逝速度,也能达到加速的目的。

    以上就是基本的理论基础。

2.接下来是Hook。既然知道了怎么去更改速度。那么要怎么去实现更改呢?那就要靠Hook了。

光环使用的是libsubstrate.so框架。以下就是API说明

 

其实也没有太难的地方。API都说的很清楚要怎么用。

 

好了,为了避免篇幅过长,看起来犯困。今天先讲基本的理论知识。后面的章节继续讲,代码实现,和实例演示

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!