Android进程注入

1.基本知识

由于Android系统使用的是Linux内核,在Linux上使用的很多攻防技术都能被应用到Android上,进程注入技术就是其中一种。以下有关进程注入的描述大多针对Linux/Android环境。

进程注入技术也可以称为动态注入技术,是代码注入技术的一种。代码注入技术可分为静态注入和动态注入两种。静态注入针对可执行文件(如ELF或者PE格式的文件),通过修改文件内容实现代码注入。动态注入针对进程,通过修改寄存器、内存值等实现代码注入。

相对于静态注入,进程注入不需要不需要改动源文件,但是需要高权限才能够执行,例如在Android系统上,需要system或者root权限才能够进行进程注入操作。


进程注入一般情况下有以下几方面的目的:

1)增强目标进程的功能;

2)修复目标进程缺陷;

3)劫持目标进程函数;

4)窃取目标进程数据;

5)篡改目标进程数据。

而在调试程序时,可以有以下几方面的能力:

1)查看和修改内存;

2)查看和修改寄存器;

3)跟踪和改变指令执行和跳转;

4)查看线程调用堆栈;

……

通过对比可以看出,使用调试程序的方式,可以达到进程注入的所有目的。进程注入技术可以说是一种调试技术。

在Linux系统上,通过系统提供的ptrace()函数可以完成上面所述的调试功能。

Linux的man文档中有如下解释:

The ptrace() system call provides a means by which one process (the"tracer") may observe and control the execution of another process(the "tracee"), and examine and change the tracee's memory and registers.

ptrace()函数定义如下:

long ptrace(enum __ptrace_request request, pid_t pid, void *addr,void *data);

其中,request参数决定了要调用的功能,pid指定要操作的目标进程,addr指向目标进程的一个内存地址,data指向自身进程的一个内存地址。

常用的request参数如下:

PTRACE_ATTACH 附加到指定进程

PTRACE_DETACH 脱离指定进程

PTRACE_GETREGS 读取寄存器

PTRACE_SETREGS 设置寄存器

PTRACE_PEEKTEXT 从内存地址读取一个word

PTRACE_POKETEXT 往内存地址写入一个word

……

使用PTRACE_PEEKTEXT或者PTRACE_POKETEXT参数时,每次只能读或者写一个word,而针对Android系统,由于大多数Android系统使用的32位arm处理器,在32位ARM架构的有关资料中可以看到:

  • When used in relation to the ARM:
    • Byte means 8 bits
    • Halfword means 16 bits (two bytes)
    • Word means 32 bits (four bytes)

即在32位ARM架构下,使用PTRACE_PEEKTEXT或者PTRACE_POKETEXT参数时一次只能读或写4字节。

2.一般过程

下面,以Android系统上,在目标进程中执行一段自定义代码为例进行讲解。

由于在目标进程中执行自定义代码时,基本上需要对代码进行一定的修改才能正常执行,故自定义代码一般比较短,大多只完成加载动态库,执行动态库中的函数,恢复原始环境等少数几个功能,在动态库的函数中实现复杂的功能。一个示意性代码如下:

void * handle = dlopen("libXXX.so", RTLD_NOW);

void * func_addr = dlsym(handle_legacy, "xxx");

func_addr(arg);

// 恢复目标进程上下文

Restore Regs

进程注入的一般过程如下:

Android进程注入_第1张图片

大多数过程都是使用ptrace()函数实现,只是使用的request参数不同,对应关系如下:

Android进程注入_第2张图片

使用mmap()函数申请一块内存也是通过ptrace()函数在目标进程调用mmap()函数来实现的。

示意性效果,在一个不断打印“I’mA.”的程序中插入”I’m CCCCCCCC.”

Android进程注入_第3张图片

3.参考资料

[1] ptrace:http://man7.org/linux/man-pages/man2/ptrace.2.html

[2] ARM Teaching Material :http://www.arm.com/zh/files/ppt/ARM_Teaching_Material.ppt

[3] 进击的Android注入术:http://blog.csdn.net/l173864930/article/details/38456313

[4] LibInject:http://bbs.pediy.com/showthread.php?t=141355

更多相关文章

  1. 创建Android守护进程(底层服务)
  2. 还在杀进程?Android你不知道的那些事儿
  3. 掌握Android中的进程和线程
  4. Android之AIDL实现两个app的调用以及双进程app的进程通信
  5. android init进程说明
  6. Android之应用进程托管
  7. 关于Android进程知识,你需要知道这些(一)

随机推荐

  1. 使用android模拟事件,python完成自动化测
  2. 【Android(安卓)开发教程】ImageSwitcher
  3. Android刮刮卡效果实现代码
  4. android图片特效,图片过滤
  5. 不支持gif动态图片
  6. Android十八章:从Android看Binder
  7. Android中文API(122) —— AudioRecord
  8. Android访问本机ip
  9. Android(安卓)性能优化之:避免在Android上
  10. android 很多应用中用到的 listView + vi