Android进程注入

1. 基本知识

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

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

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

Android进程注入

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

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进程注入

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

Android进程注入

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

其示意性动态展示如下,其中左半边是执行注入的进程,右半边是目标进程。

 

进入注入的动态过程演示如下:Android进程注入过程动态演示

 

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

Android进程注入

 

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

焦龙龙

2015.01.05

原创文章,作者:admin,如若转载,请注明出处:https://www.isclab.org.cn/2015/01/05/android%e8%bf%9b%e7%a8%8b%e6%b3%a8%e5%85%a5/

(1)
adminadmin
上一篇 2014年12月19日 下午1:42
下一篇 2015年1月18日

相关推荐

  • 代码变更表示学习技术

    代码变更表示学习技术通常将代码变更进行结构化或序列化的中间表示,并将中间表示输入到表示学习模型以获取代码变更中更细粒度的特征,是众多软件工程任务的重要环节之一。本次报告介绍了2类任…

    2023年10月23日
    476
  • 人工智能模型的谈忘学习方法

    遗忘学习被称为机器遗忘或取消学习,是指机器学习或深度学习系统中先前获取的知识随着时间推移而退化的现象。本次学习报告的主要讲解了两种人工智能模型的遗忘学习方法,遗忘训练数据中的特定样…

    2024年11月5日
    563
  • 敏感文本数据脱敏方法

    本次报告对文本数据的脱敏方法展开介绍,介绍了目前常用的文本数据脱敏方法,重点讲解了文本数据泛化脱敏的基本概念,详细阐述了文本泛化脱敏方法和文本差分隐私噪声扰动脱敏方法,最后对比了文…

    2022年5月30日
    1.8K
  • 小样本实体关系抽取方法

    信息抽取是自然语言处理中的重要组成部分,特别是在当今信息化社会中,从海量数据中抽取出有用的信息显得格外有意义。实体关系抽取是信息抽取的基础任务。现实生活中存在着长尾分布的问题,这导…

    2021年10月21日
    1.4K
  • 二进制函数相似性分析

    本次报告介绍了二进制函数相似性分析的发展历史和主要变革,讲解了二进制相似性分析的主要方法,重点介绍了结构特征、语义特征的概念及应用原理。

    2022年11月28日
    646
  • 基于网络一致性的对抗样本检测

    人工智能系统面临着多种安全威胁,其中对抗样本攻击被广泛应用于诸如计算机视觉、自然语言处理、音频处理以及恶意软件检测等多个领域。本文介绍了常见的对抗样本检测方法和原理。特别的,简单分…

    2020年12月20日
    924
  • 时空数据挖掘

    物联网技术和人工智能的快速发展,含时间、空间特性的数据指数增长。如何进行多源异构时空数据本身特性出发,和机器学习深度学习技术深入融合,实现数据实现知识发现和信息挖掘,服务于城市发展…

    2021年5月18日
    833
  • Android自定义权限及其设计缺陷

    本次报告主要讲述了Android权限机制和自定义权限的相关内容。介绍了权限机制和自定义权限的基本概念,解释了权限升级漏洞的基本概念,并详细讲解了发现此类漏洞的模式测试方法,最后思考…

    2022年4月17日
    531
  • 匮乏资源命名实体识别

    NER作为自然语言处理中的一项基础任务,应用范围非常广泛。命名实体识别是许多任务的基本组成部分,并已被深度神经网络大大推进。目前NER只是在有限的领域和实体类型中取得了较好的成绩,…

    2021年11月2日
    748
  • 面向深度学习软件库的动态漏洞挖掘方法

    针对开源软件库输入构建需要符合特定编程语言语法规范的问题,现有研究方法分别从构建模型输入和构建API输入两条路线出发,。LEMON方法针对缺陷引起的极小输出差异难以被察觉的问题,采…

    2022年7月3日
    755