您的位置:首页 > 其它

手游外挂入侵(一)某助手加速器实现原理探究

2017-12-21 20:04 344 查看

- 简介

下载ghzs商店,搜索相应游戏即可下载,下载后安装运行,游戏中就会多出一个加速工具助手。

实现过程探究

打开游戏包查看发现dex中加入了com.gh.XXX相关的类,应该是将Dex重打包,加入了他们的SDK代码,然后他们SDK会加载cydia substrate框架的inline hook动态库和根据游戏定制的加速器动态库。

原理分析

① Inline hook libmono.so中的两个方法:

mono_class_from_name

mono_runtime_invoke

并且获取了mono_class_get_method_from_name和mono_method_full_name,将在之后使用。

② Hook mono_class_from_name方法内容:

原型:

MonoClass * mono_class_from_name (MonoImage *image, const char* name_space, const char *name)


Hook代码:

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);
}


Hook该函数最终目的获取到UnityEngine.Time.set_timeScale方法

③ Hook mono_runtime_invoke方法:

原型:

MonoObject*
mono_runtime_invoke (MonoMethod *method, void *obj, void **params, MonoObject **exc)


Hook代码:

int __fastcall sub_19D4(MonoMethod *method, void *obj, void **params, MonoObject **exc)
{
static int isUIRootUpdate = 0;
static int t = 0;
if ( !isUIRootUpdate )
{
dword_7044 = mono_method_full_name(method,1);
if ( !j_strcmp(dword_7044, "UIRoot:Update ()") )
{
dword_7048 = method;
isUIRootUpdate = 1;
}
}
if ( findset_timeScale && isUIRootUpdate && dword_7048 == method )
{
if ( t == 50 )
{
off_7008 = (int)&speed;
mono_runtime_invoke (set_timeScale, 0, (int)&off_7008, 0);
t = 0;
}
++t;
}
return mono_runtime_invoke (method);
}


最终调用set_timeScale函数,并根据设定速度大小传入进行更改时间。

总结

这种方法目前来说还挺特别的,可以绕过对HOOK的检测以及一些加速器外挂特征的监测,缺点就是只能对U3D的游戏有通用性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息