手机黑客?android平台注入技术

背景在Android系统中,进程之间是相互隔离的,两个进程之间是没办法直接跨进程访问其他进程的空间信息的 。那么在android平台中要对某个App进程进行内存操作,并获取目标进程的地址空间内信息或者修改目标进程的地址空间内的私有信息,就需要涉及到注入技术 。
通过注入技术可以将指定so模块或代码注入到目标进程中,只要注入成功后,就可以进行访问和篡改目标进程空间内的信息,包括数据和代码 。
Android的注入技术的应用场景主要是进行一些非法的操作和实现如游戏辅助功能软件、恶意功能软件 。
下面主要进行对zygote注入、ptrace注入、修改so文件注入,这三种注入方式进行详细解析 。
zygote注入zygote是一个在android系统中是非常重要的一个进程,因为在android中绝大部分的应用程序进程都是由它孵化(fork)出来的,fork是一种进程复用技术 。也就是说在android系统中普通应用APP进程的父亲都是zygote进程 。
zygote注入目的就是将指定的so模块注入到指定的APP进程中,这个注入过程不是直接向指定进程进程注入so模块,而是先将so模块注入到zygote进程 。
在so模块注入到zygote进程后,在点击操作android系统中启动的应用程序APP进程,启动的App进程中包括需要注入到指定进程的so模块,太都是由zygote进程fork生成,因而在新创建的进程中都会包含已注入zygote进程的so模块 。
这种注入是通过间接注入方式完成的,也是一种相对安全的注入so模块方式 。目前xposed框架就是基于zygote注入 。
zygote注入so模块流程
1.通过注入器将要注入的so模块注入到zygote进程;
2.手动启动要注入so模块的APP进程,由于APP进程是通过zygote进程fork出来的,所以启动的APP进程都包含zygote进程中所有模块;
3.注入的so模块劫持被注入APP进程的控制权,执行注入so模块的代码;
4.注入so模块归还APP进程的控制权,被注入进程正常运行 。
Zygote注入器的实现流程
(注入器主要是基于ptrace注入shellcode方式的进程注入)
通过ptrace进行附加到zygote进程 。
调用mmap申请目标进程空间,用于保存注入的shellcode汇编代码 。
执行注入shellcode代码(shellcode代码是注入目标进程中并执行的汇编代码) 。
调用munmap函数释放申请的内存 。
【手机黑客?android平台注入技术】通过ptrace进行剥离zygote进程 。
下面是关键的zygote代码注入实现

手机黑客?android平台注入技术

文章插图
 

手机黑客?android平台注入技术

文章插图
 

手机黑客?android平台注入技术

文章插图
 
ptrace注入ptrace注入实现上分类:
通过利用ptrace函数将shellcode注入远程进程的内存空间中,然后通过执行shellcode加载远程进程so模块 。
通过直接远程调用dlopen、dlsym、dlclose等函数加载被注入so模块,并执行指定的代码 。
ptrace直接调用函数注入流程:
通过利用ptrace进行附加到要注入的进程;
保存寄存环境;
远程调用mmap函数分配内存空间;
向远程进程内存空间写入加载模块名称和函数名称;
远程调用dlopen函数打开注入模块;
远程调用dlsym函数或需要调用的函数地址;
远程调用被注入模块的函数;
恢复寄存器环境;
利用ptrace从远程进程剥离 。
关键的ptrace直接调用系统函数实现
手机黑客?android平台注入技术

文章插图
 

手机黑客?android平台注入技术

文章插图
 
ptrace的shellcode注入原理
shellcode注入就是通过将dlopen/dlsym库函数的操作放在shellcode代码中,注入函数只是通过对远程APP进程进行内存空间申请,接着修改shellcode 代码中有关dlopen、dlsymdlclose等函数使用到的参数信息,然后将shellcode代码注入到远程APP进程申请的空间中,最后通过修改PC寄存器的方式来执行shellcode 的代码 。
ptrace注入shellcode的详细步骤
1.在shellcode中编写好dlopen、dlsym等函数的调用,来加载so模块和执行函数,但需要将参数地址、函数地址、寄存器地址先随便填充值为我们真实地址保留;
2.附加到远程APP进程、保存APP进程中寄存器的数据,为后面恢复远程进程的继续执行准备;
3.向远程APP进程申请内存空间,选好shellcode存放的具体位置,准备存放shellcode和参数数据;


推荐阅读