各位游戏大佬大家好,今天小编为大家分享关于苹果gg游戏修改器_GG修改器苹果下载的内容,轻松修改游戏数据,赶快来一起来看看吧。
相对于`Android APP`,针对`iOS APP`的分析和破解要少得多,这也导致上线`AppStore`的绝大部分应用都是裸奔的,这也给黑产带来了便利。这篇文章将对`iOS`平台的一款游戏加速辅助进行分析,便于进行防御研究。
这款游戏加速器是以动态库方式注入到APP中加载运行的,其介绍说只能在越狱手机运行,因为动态库的注入依赖于框架:MobileSubstrate。但是在非越狱手机也可以实现注入的,一个方便的框架可以参考我们组刘培庆开发的 MonkeyDev。
动态库本质是一个Mach-O格式的文件,和Windows的DLL文件、Linux的so文件作用类似。其不能直接运行,而是通过系统链接加载器dyld完成加载和初始化。dyld是开源的,可在 Source Browser 查看。简单介绍下动态库dylib的加载过程:
本节主要使用 Hopper Disassembler 来进行分析。Hopper分析完成后如下图所示:
其中加速器的构造器函数为:__GLOBAL__sub_I_MFAccelerator.mm。反编译结果如下:
int __GLOBAL__sub_I_MFAccelerator.mm() {
sp = sp - 0x1c;
if (objc_getClass("UnityAppController") == 0x0) goto loc_510a;
loc_50d6:
*0x87a0 = 0x1;
MSHookMessageEx();
goto loc_5150;
loc_5150:
r0 = [[NSDistributedNotificationCenter defaultCenter] addObserver:[MFAcceleratorMgr sharedMgr] selector:@selector(handleDistributedNotification:) name:[NSString stringWithUTF8String:"com.cyjh.ifengwoo.port.accelerator"] object:0x0];
return r0;
.l1:
return r0;
loc_510a:
r4 = objc_getClass("EAGLView");
r0 = objc_getClass("CCEAGLView");
r0 = r0 | r4;
if (r0 == 0x0) goto .l1;
loc_512c:
MSHookFunction();
goto loc_5150;
}
其区分了游戏的类型:U3D和cocos2d。伪代码如下:
Class u3d = objc_getClass("UnityAppController");
if(u3d) {
MSHookMessageEx(u3d, @selector(application:didFinishLaunchingWithOptions:), (IMP)fake_unity3d_finish_launching, &ori_unity3d_finish_launching)
} else {
Class cocos2d_f1 = objc_getClass("EAGLView");
Class cocos2d_f2 = objc_getClass("CCEAGLView");
if(cocos2d_f1 || cocos2d_f2) {
MSHookFunction((void *)gettimeofday, (void *)mygettimeofday, (void **)&orig_gettimeofday);
}
}
可以看见,对于 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是通过内存搜索特征串得到的。大致流程如下:
对于不同的U3D程序,特征串在的位置并不固定。
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) {…}中,对应的汇编代码如下:
所以加速器伪代码大致为:
int ret = gettimeofday(&tv, NULL);
if(ret == 0) {
if(saved_usecs->tv_sec && saved_usecs->tv_usec) {
long A = tv->tv_usec/1000000000+tv->tv_sec - saved_usecs->tv_sec;
A *= speed;
tv->tv_sec = saved_usecs_last->tv_sec + A;
} else {
saved_usecs = tv;
}
saved_usecs_last = tv;
}
return ret;
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_init
if (*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 不为 0
r1 = r0;
*0x8794 = r0;
if (r0 != 0x0) {
*(r1 + 0xb8) = *0x86ec; // 写 speed_3d 到内存特定位置
}
}
else {
*(r1 + 0xb8) = *0x86ec;
}
return 0x0;
}
从上面可以看见,本文介绍的加速器的一般流程:
所以我们的防御方法大致如下:
防御方法说明APP完整性检测检测APP是否重打包,是否存在注入模块APP符号混淆去掉特征类APP逻辑混淆 + APP反调试提高APP破解分析难度APP HOOK函数检测检测关键函数(如时间函数)是否被替换
—————-!!喜大普奔!!—————-
杭研iOS客户端安全组开发的iOS 加固套件已上线,支持的功能包括字符串加密、逻辑混淆、符号混淆、反调试等,支持应用APP、游戏APP、SDK等各种工程的加固,更多高级功能正在开发中,也承接各种专属定制,欢迎咨询,咨询热线:hzzhangwei15@corp.
—————-!!欢迎试用!!—————-
要想在动态库的构造器中调试,需要一点小技巧,如下:
(lldb) process connect connect://10.242.32.233:1234
Process 67366 stopped
* thread #1, stop reason = signal SIGSTOP
frame #0: 0x1fef0000 dyld`_dyld_start
dyld`_dyld_start:
-> 0x1fef0000 <+0>: mov r8, sp
0x1fef0004 <+4>: sub sp, sp, #16
0x1fef0008 <+8>: bic sp, sp, #15
0x1fef000c <+12>: ldr r3, [pc, #0x70] ; <+132>
(lldb) image list -o -f
[ 0] 0x000ef000 /Users/netease/Library/Developer/Xcode/iOS DeviceSupport/9.0.2 (13A452)/Symbols/usr/lib/dyld
(lldb) br s -a 0x1fe115ae+0xef000
Breakpoint 1: where = dyld`ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) + 2, address = 0x1ff005ae
由基础知识中的动态库加载过程我们知道,构造器的初始化位于第8步,经过调试发现入口是在:doModInitFunctions函数中。所以在_dyld_start时,我们可以在doModInitFunctions下一个断点,如上面所示。下断点的技巧可以参考文章:一步一步用debugserver + lldb代替gdb进行动态调试。在执行到doModInitFunctions时,所有的动态库都完成了加载,只不过还没有初始化,现在可以对我们关注的动态库的构造器下断点,如下:
(lldb) br s -a 0x50d0+0x280000
Breakpoint 2: where = MFAccelerator.dylib`_GLOBAL__sub_I_MFAccelerator.mm + 16, address = 0x002850d0
(lldb) c
Process 67366 resuming
Process 67366 stopped
* thread #1, stop reason = breakpoint 1.1
frame #0: 0x1ff005ae dyld`ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) + 2
dyld`ImageLoaderMachO::doModInitFunctions:
-> 0x1ff005ae <+2>: add r7, sp, #0xc
0x1ff005b0 <+4>: push.w {r8, r10, r11}
0x1ff005b4 <+8>: sub sp, #0x20
0x1ff005b6 <+10>: mov r11, r0
(lldb) br del 1
1 breakpoints deleted; 0 breakpoint locations disabled.
(lldb) c
Process 67366 resuming
Process 67366 stopped
* thread #1, queue = ’com.apple.main-thread’, stop reason = breakpoint 2.1
frame #0: 0x002850d0 MFAccelerator.dylib`_GLOBAL__sub_I_MFAccelerator.mm + 16
MFAccelerator.dylib`_GLOBAL__sub_I_MFAccelerator.mm:
-> 0x2850d0 <+16>: blx 0x287f54 ; symbol stub for: objc_getClass
0x2850d4 <+20>: cbz r0, 0x28510a ; <+74>
0x2850d6 <+22>: movw r1, #0x36b4
0x2850da <+26>: movs r6, #0x1
多说一点,在动态分析时,可以直接在方法调用的地方中断,然后参考相应的传参寄存器,从而加快分析过程,也便于理解代码逻辑,一个例子如下:
Process 67366 stopped
* thread #1, queue = ’com.apple.main-thread’, stop reason = instruction step over
frame #0: 0x0028514c MFAccelerator.dylib`_GLOBAL__sub_I_MFAccelerator.mm + 140
MFAccelerator.dylib`_GLOBAL__sub_I_MFAccelerator.mm:
-> 0x28514c <+140>: blx 0x287f0c ; symbol stub for: MSHookFunction
0x285150 <+144>: movw r0, #0x3410
0x285154 <+148>: movt r0, #0x0
0x285158 <+152>: movw r2, #0x34ce
(lldb) register read $r0
r0 = 0x37cd7241 libsystem_c.dylib`gettimeofday + 1
(lldb) register read $r1
r1 = 0x00284f8f MFAccelerator.dylib`$gettimeofday(timeval*, void*) + 1
(lldb) register read $r2
r2 = 0x002887a8 MFAccelerator.dylib`_gettimeofday
From:网易技术安全张维
如果对我的文章感兴趣,希望可以得到您的一个点赞和关注,这将是对我最大的鼓励和支持,感谢~另外,私聊我【Java】可以收获互联网大厂Java面经和丰富资料~
以上就是关于苹果gg游戏修改器_GG修改器苹果下载的全部内容,游戏大佬们学会了吗?
GG修改器免root版32位,下载GG修改器免root版32位,轻松hack游戏 分类:免root版 4,113人在玩 如果你是一名游戏玩家,那么你一定知道游戏内购和付费道具的存在。这些道具和购买通常需要大量金币或钻石,对于并不想花费过多时间和金钱的玩家来说,这无疑是一个非常棘手的问题。……
下载剑与远征gg修改器免root_剑与远征gg修改器怎么用 分类:免root版 5,036人在玩 各位游戏大佬大家好,今天小编为大家分享关于剑与远征gg修改器免root_剑与远征gg修改器怎么用的内容,轻松修改游戏数据,赶快来一起来看看吧。 此外,该游戏还加入了不限时获得奖……
下载gg修改器 需要root吗,下载一个无需root的gg修改器 分类:免root版 4,008人在玩 如果你是一名游戏爱好者,那么你一定知道 gg修改器。这是一款在手机游戏领域广受欢迎的工具,它可以帮助玩家修改游戏的数据,比如金币、经验值等等。但是,许多人不乐意给自己的手……
下载免root框架下载gg修改器_gg修改器免root免框架 分类:免root版 5,066人在玩 各位游戏大佬大家好,今天小编为大家分享关于免root框架下载gg修改器_gg修改器免root免框架的内容,轻松修改游戏数据,赶快来一起来看看吧。 大家好!我是胡柚。一个专注于TikTok玩……
下载gg修改器免root打包下载,GG修改器免root打包下载,让你轻松畅玩手机游戏 分类:免root版 3,075人在玩 手机游戏已经成为了人们日常娱乐生活中不可或缺的一部分。然而,很多游戏都存在着付费玩家变强、非付费玩家无法跟上的问题,让后者感觉到了很大的不公平。这时候,一款名叫GG修改器……
下载gg修改器已root,下载GG修改器已root,装逼神器来袭 分类:免root版 3,134人在玩 当今社会,手机不仅是我们的通讯工具和生活助手,更成为了我们展示自我、彰显个性的重要元素。而GG修改器已root就是一个能够满足用户“装逼”需求的神器。 什么是GG修改器已root? G……
下载华为gg修改器root怎么弄,华为gg修改器root软件下载 分类:免root版 2,547人在玩 如果您是一名华为手机用户,想要对您的手机进行root操作,那么华为gg修改器就是您需要的软件。这款软件可以帮助您快速、简单地对您的华为手机进行root,让您获得更多的自由和掌控力……
下载安卓免root框架gg修改器,什么是安卓免root框架gg修改器? 分类:免root版 4,348人在玩 安卓免root框架gg修改器:打造无限可能的游戏世界 安卓免root框架gg修改器是一款功能强大的游戏修改工具,可以在不需要root权限的情况下修改手机中的游戏数据。它可以让用户享受到……
下载光遇gg修改器root_光遇gg修改器下载ios 分类:免root版 4,543人在玩 各位游戏大佬大家好,今天小编为大家分享关于光遇gg修改器root_光遇gg修改器下载ios的内容,轻松修改游戏数据,赶快来一起来看看吧。 智能化浪潮席卷了十余年,除了手机,其他大量“……
下载gg修改器 要root,下载gg修改器:一个简单易用的root工具 分类:免root版 4,306人在玩 GG修改器是一款非常受欢迎的Android游戏内存修改器软件,它可以帮助用户轻松地修改游戏内部数据,比如金钱、经验和道具等。但是,这款软件需要root权限才能正常运行。如果你还没有r……
下载