前段时间手游加速器很火。以光环为代表,进行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都说的很清楚要怎么用。
好了,为了避免篇幅过长,看起来犯困。今天先讲基本的理论知识。后面的章节继续讲,代码实现,和实例演示
来源:https://blog.csdn.net/MarketAndTechnology/article/details/100897953