游戏安全实验室 首页 外挂分析 查看内容

叉叉助手Zygote注入功能分析

发布于:2016-1-12 17:20   |    358948次阅读 作者: 管理员    |   原作者: TP   |   来自: 原创

背景

Xx助手安卓版实现了注入游戏并修改数据实现外挂功能,本文侧重分析XX助手Zygote注入方式的实现原理。

 

实现原理

Xx助手实现的方式是通过注入zygote进程(前提是要有root权限),加载自己的共享库并Hook几个API。当游戏启动时,因为进程从zygote进程fork出来,所以游戏进程自然也就被注入。

一、注入流程分析

1 . 用ida打开injectso,ida会帮你反汇编injectso,生成多个角度的代码分析。在反汇编代码视图中,在左边的符号列表中找到并选择start,可以看出该代码段主要是为调用C程序作准备工作,最后调用__libc_init,就会调到main函数了。

2 . Main函数的位置就是该代码段的下一段,即sub_8cd0,它一进去的时候会先输出日志,即xxlog.log中看到的内容,如下:

3 . 然后,它会先转换参数1,即上面的138为进程id,获取参数2中的共享库名,检查游戏进程的内存镜像中是否有该共享库,如果有,则表示zygote进程已经被注入,直接返回。

4 . 接下来的几步主要是对selinux作设置,包括sub_A1AC、sub_A2E0、sub_A390。具体逻辑如果找到"/sys/fs/selinux"分区或"selinux "分区,然后读该分区下的"enforce"文件开头19个字节,转化成整型,然后往enforce开头写入0,注入完成以后,会把第一次读 到整型再写入到"enforece"文件的前20字节。

 

5 . 接下来,就进入最重要的部分,注入实现,由sub_9040函数完成。首先,检查参数格式,如果参数有误,函数返回。然后,通过函数sub_8E48获取共享库在某进程的合法起始地址,以检查注入共享库是否在目标进程的内存镜像中,如果是,打印日志后函数返回。

6 . 接下来,通过 ptrace函数的APTRACE_ATTACH(16)操作开始调试zygote进程,成功后,调用waitpid函数等待zygote进程进入被调试状态。

7 . 成功后,使用ptrace函数的PTRACE_GETREGS(12)操作获得zygote进程的当前寄存器列表值,保存在dword_E07C中,然后在unk_E034存放要使用的寄存器列表值。

8 . 之后,获取"/sysstem/lib/libc.so"在当前进程和zygote进程中的内存合法起始地址,并获取"mmap"、"munmap"、"mprotect"在当前进程的内存地址,通过函数和共享库加载地址的对应关系,计算出mmap函数在zygote进程的内存地址,然后构造寄存器值和堆栈,通过ptrace函数的2次PTRACE_POKEDATA(5)操作、1次PTRACE_SETREGS(13)操作、2次(PTRACE_SYSCALL[24]+waitpid)操作、1次PTRACE_GETREGS(12),调用zygote进程的mmap函数分配内存空间,并把内存地址获取到,以存放shellcode内容。

9 . 然后,获取"/system/bin/linker"在当前进程和zygote进程内存镜像的合法起始地址,动态打开动态库"libdl.so",获取"dlopen"、"dlsym"、"dlclose"、"dlerror"在当前进程的内存地址,根据函数和动态库的对应关系,计算出zygote进程中的函数地址。接下来,准备shellcode的其它内容。

10 . 准备好shellcode之后,就可以往前面分配好的内存空间里面拷贝shellcode。在正式进行PTRACE_SETREGS(13)之前,还进行了mmap的返回值判断,如果为0,则会调用zygote进程中的"mprotect"处理(看代码也没做什么实质处理),否则,通过PTRACE_SETREGS(13)、PTRACE_CONT(7)、waitpid来执行shellcode(因为shellcode末尾会置pc为0,所以shellcode执行完会有个异常抛出,被当前进程的waitpid函数获取到,因此zygote进程进入暂时,当前进程继续分析zygote进程)。

11 . 如果shellcode执行完成,调用PTRACE_GETREGS(12)获取执行完shellcode的寄存器列表值,检查shellcode的执行情况(shellcode中的r1保存状态),如果出错,通过PTRACE_PEEKDATA(1)从zygote进程读取出错信息并打印

12 . 之后,再调用zygote进程中的munmap函数,释放mmap分配的内存空间,之间使用了PTRACE_SETREGS(13)、PTRACE_SYSCALL(24)、waitpid、PTRACE_SYSCALL(24)、waitpid、PTRACE_GETREGS(12)操作。

13 . 最后,检查最开始的寄存器列表值,根据情况修改相应的值,然后通过PTRACE_SETREGS(13)和PTRACE_DETACH(17)操作让zygote进程恢复运行,如果PTRACE_DETACH(17)操作无反应,则会向zygote进程发送SIGSTOP信号,然后wait进程状态改变,再调用PTRACE_DETACH(17)停止调试zygote进程

 

到此,xx助手的注入功能已经解析完成了。

 

总结

以上针对XX助手注入进行详细分析和介绍,xx助手是通过Zygote方式巧妙的将外挂模块注入游戏进程。


*转载请注明来自游戏安全实验室(https://gslab.qq.com

分享到:
踩1 赞2

收藏

下一篇:穿越火线外挂幽灵显鬼分析报告

最新评论
B Color Image Link Quote Code Smilies

发表评论

top 问题反馈

返回顶部