Android安全-SO动态库注入

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

关于这方面技术,网上已经有大把的实现。在此,我只是记录下自己的学习过程。


0x1 原理

    所谓的SO注入就是将代码拷贝到目标进程中,并结合函数重定向等其他技术,最终达到监控或改变目标进程行为的目的。Android是基于Linux内核的操作系统,而在Linux下SO注入基本是基于调试API函数ptrace实现的,同样Android的SO注入也是基于ptrace函数,要完成注入还需获取root权限。


0x2 流程

    注入过程如下:

        0x01 获取目标进程的pid,关联目标进程;

        0x02 获取并保存目标进程寄存器值;

        0x03 获取目标进程的dlopen,dlsym函数的绝对地址;

        0x04 获取并保存目标进程的堆栈,设置dlopen函数的相关参数,将要注入的SO的绝对路径压栈;

        0x05 调用dlopen函数;

        0x06 调用dlsym函数,获取SO中要执行的函数地址;

        0x07 调用要执行的函数;

        0x08 恢复目标进程的堆栈,恢复目标进程寄存器值,解除关联,完成SO动态库注入;

        (注:实际上,0x06和0x07并不属于SO动态库注入的步骤,然而仅仅注入是完全没有意义的,通常我们需要执行SO中的函数)


0x3 实现

    0x01 获取目标进程的pid,关联目标进程:

        通过遍历查找/proc/pid/cmdline文件中是否含有目标进程名process_name,若有则进程名对应的进程号即为pid。接着,直接调用函数ptrace_attach(pid)即可完成关联。

    0x02 获取并保存目标进程寄存器值:

        直接调用ptrace(PTRACE_GETREGS, pid, NULL, &saved_regs),当然saved_regs要定义为全局变量。

    0x03 获取目标进程的dlopen,dlsym函数的绝对地址:

        大概思路是这样的:首先通过遍历/proc/pid/maps文件分别得到本进程中dlopen函数所在动态库的基地址local_module_base和目标进程dlopen函数所在动态库的基地址remote_module_base,接着获取本进程dlopen函数的绝对地址local_addr = (void*)dlopen。需要明白的是,不同进程中相同的动态库中的同一个函数的偏移地址一定是一样的,所以目标进程dlopen函数的绝对地址为:local_addr - local_module_base + remote_module_base。dlsym同理,不再详述。

    0x04 获取并保存目标进程的堆栈,设置dlopen函数的相关参数,将要注入的SO的绝对路径压栈:

        当我们的要执行的函数的某些参数需要压入堆栈的时候,就需要提前保存堆栈状态,调用ptrace_readdata(pid, (void *)regs.ARM_sp, (void *)sbuf, sizeof(sbuf)),其中sbuf为char数组,用来存放堆栈。调用ptrace_writedata(pid, (void *)regs.ARM_sp, (void *)so_path, strlen(so_path) + 1),其中so_path为SO的绝对路径。函数传参规则:前四个参数分别由寄存器r0、r1、r2、r3存放,超过四个参数则压入堆栈。

    0x05 调用dlopen函数:

        参数设置好后,设置ARM_pc = dlopen_addr, ARM_lr = 0。调用ptrace_setregs(pid, regs)写入修改后的寄存器值,调用ptrace_continue( pid )使目标进程继续运行。(注:dlopen_addr为0x03获取到的目标进程dlopen函数的绝对地址,ARM_lr = 0的目的在于当目标进程执行完dlopen函数,使目标进程发生异常,从而让本进程重新获得控制权)

    0x06 调用dlsym函数,获取SO中要执行的函数地址:

        实现方式与调用dlopen函数类似,不再详述。

    0x07 调用要执行的函数:

        实现方式与调用dlopen函数类似,不再详述。

    0x08 恢复目标进程的堆栈,恢复目标进程寄存器值,解除关联,完成SO动态库注入:

        调用ptrace_writedata(pid, (uint8_t *)saved_regs.ARM_sp, (uint8_t *)sbuf, sizeof(sbuf))恢复堆栈,调用ptrace_setregs(pid, &saved_regs)恢复寄存器值,调用ptrace_detach(pid)解除关联,完成SO动态库注入。


0x4 代码

    贴一下主要逻辑代码:

pid_t pid = find_pid_of("xxx");
ptrace_attach(pid);
uint32_t *inject_so_of(pid_t pid, const char *so_path) {int status = 0;struct pt_regs regs;memcpy(&regs, &saved_regs, sizeof(regs));ptrace_readdata(pid, (void *)regs.ARM_sp, (void *)sbuf, sizeof(sbuf));ptrace_writedata(pid, (void *)regs.ARM_sp, (void *)so_path, strlen(so_path) + 1);uint32_t parameters[2];parameters[0] = regs.ARM_sp;parameters[1] = RTLD_NOW;if ( ptrace_call(pid, find_dlopen_addr(pid), parameters, 2, &regs ) == -1 )DPRINTF("dlopen error\n");ptrace_getregs(pid, &regs);uint32_t r0 = regs.ARM_r0;DPRINTF("[+2]\t注入动态库成功,返回的句柄为: %x\n", r0);ptrace_setregs(pid, &saved_regs);ptrace_writedata(pid, (uint8_t *)saved_regs.ARM_sp, (uint8_t *)sbuf, sizeof(sbuf));ptrace_detach(pid);return (uint32_t *)r0;
}

0x5 参考

    玩转ptrace:http://blog.csdn.net/sealyao/article/details/6710772

    《转载》linux动态库注入:http://blog.chinaunix.net/uid-7247280-id-2060516.html

    发个Android平台上的注入代码:http://bbs.pediy.com/showthread.php?t=141355

转载于:https://my.oschina.net/u/1777508/blog/664025

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BUG日志-2022.7.12——关于VSCode感叹号无法生成HTML骨架问题

解决办法:放弃使用多年的!,而采用html:5的形式。 原因:好像是因为VScode已经更新了 好多扩展也失效了。

hadoop 入门实例【转】

原文链接:http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html 1、数据去重 "数据去重"主要是为了掌握和利用并行化思想来对数据进行有意义的筛选。统计大数据集上的数据种类个数、从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据…

AWS安装CDH5.3-CentOS6.4中关键操作步骤

1、在AWS masternode 上下载cloudera-manager-installer.bin安装包 [rootip-172-21-42-114 ~]# wget http://archive.cloudera.com/cm5/installer/latest/coludera-manager-installer.bin 此时会提示:-bash: wget: command not find 所以要现安装wget命令 [rootip-1…

You have an error in your SQL syntax; check the manual that corresponds to...

问题缘由: 使用datagrip插入数据时发生报错 使用插入语句为: insert into ev_name (‘username’,‘password’) values (‘admin’,‘123456’); 错误提示: You have an error in your SQL syntax; check the manual that corresponds to …

getaddrinfo ENOTFOUND 127.0.0.1:3306

错误缘由: 在写nodejs项目时,连接数据库发现找不到数据库。 解决: 发现数据库连接池没有设置端口号,需设置端口号3306。 解决效果: 成功解决

一幅长文细学node.js——一幅长文系列

文章目录1 Node.js概述1.1 初识Node.js1.2 Node.js简介1.3 Node.js安装1.4 使用Node.js运行JS代码2 fs文件系统模块2.1 读取文件2.2 写入文件2.3 路径问题3 Path路径模块3.1 Path模块概述3.2 路径拼接3.3 获取路径的文件名4 Http模块4.1 Http概述4.2 服务器相关的概念4.3 创建W…

一幅长文细学GaussDB(一)——数据库介绍

文章目录1 数据库介绍1.1 数据库技术1.2 数据库技术发展史数据库技术产生和发展数据库三个阶段比较数据库系统优势层次模型网状模型关系模型关系数据库产品历史结构化查询语言SQL面向对象数据模型(OO模型)数据管理技术的新挑战NoSQL技术特点和类型主要No…

Unity 通过Unity Admob Plugin插件集成admob教程

原创:officemaster.cn下载Unity Admob Demo,插件里面包含Admob_Unity_Demo.unitypackage 插件文件AdmobPluginRes 是Admob 的ios sdk和插件使用样例代码打开样例代码可以看到代码里面如何使用Unity Admob插件把Admob Unity插件添加进unity工程1. 打开Un…

一幅长文细学华为MRS大数据开发(一)——大数据时代的挑战和机遇

文章目录1 大数据时代的挑战和机遇1.1 大数据基础概念大数据时代的发展大数据定义大数据的4V大数据处理和传统数据处理的差异并行计算相关知识1.2 大数据应用领域大数据金融应用大数据教育应用大数据公共安全应用大数据交通规划应用1.3 大数据计算计算任务的分类大数据应用的主…

一幅长文细学华为MRS大数据开发(二)——HDFS分布式文件系统和ZooKeeper

文章目录2 HDFS分布式文件系统和ZooKeeper2.1 HDFS概述以及应用场景HDFS概述HDFS应用场景HDFS不适合的场景2.2 HDFS相关概念计算机集群结构基本系统架构块NameNode和DataNodes2.3 HDFS体系架构HDFS体系架构概述HDFS命名空间管理通信协议客户端HDFS单名称节点体系结构的局限性心…

BOS12——多对多添加方法,多对多页面需要字段问题(不多的话直接提供get方法),修改Realm中授权方法(查询数据库),缓存Java对象的方法,加载左侧菜单(ztree提供pId)...

1、多对多添加方法 Override public void add(Role model, String functionIds) {// 1.先将角色保存到数据库roleDao.save(model);// 2.为角色添加权限(一定要坚持映射文件中是否inverse)if (StringUtils.isNotBlank(functionIds)){String[] functionIdL…

一幅长文细学JavaScript(七)——Ajax

文章目录7 Ajax7.1 概述7.1.1 基本概念7.1.2 网络通信开发者工具7.1.3 网页请求数据的方式7.1.4 资源的请求方式7.2 JQuery中的Ajax7.2.1 基本知识7.2.2 了解jQuery的Ajax7.2.3 $.get()7.2.4 $.post()7.2.5 $.ajax()7.3 接口7.3.1 接口概念7.3.2 接口测试工具7.4 form表单7.4.1…

Linux系统检查查看桌面环境

Linux的桌面系统系统多达十几种,像gnome、kde、mate、cinnamon、lxde、xfce、jwm等。比较常用的一般是gnome、kde、xfce等。那么如何判断Linux系统安装了哪种桌面环境组件呢?下面总结了一些检查桌面环境的方法: 方法1:env | grep…

一幅长文细学JavaScript(二)——ECMAScript

2 基本程序设计结构 摘要 ​ 对于学习JS的程序员来说,一定是具备了一定的编程功底的,故在下面的概述中,我们不再提及一些简单的概念。 声明:在使用本文的代码时,为了避免文章冗长,我只附上了script标签内的…

HashMap源码剖析

无论是在平时的练习还是项目当中,HashMap用的是非常的广,真可谓无处不在。平时用的时候只知道HashMap是用来存储键值对的,却不知道它的底层是如何实现的。 一、HashMap概述 HashMap基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作…

Android成长日记-Android监听事件的方法

1. Button鼠标点击的监听事件 --setOnClickListener 2. CheckBox, ToggleButton , RadioGroup的改变事件 --setOnCheckedChangeListener Eg: 3. onPageChangeListener() ----用来监控ViewPager滑到第几页转载于:https://www.cnblogs.com/boy1025/p/4301956.html

XSS攻击(出现的原因、预防措施......)

验证XSS攻击重点不是去查找可输入哪些内容会出现什么样的bug就是测试XSS攻击,重点是了解它出现的原理,为什么会出现XSS攻击,导致一些问题出现?如何防御与解决XSS攻击?以下我将简单介绍以上提出的问题。 如何判定没有被…

一幅长文细学JavaScript(三)——DOM

文章目录3 JavaScript DOM3.1 DOM基本术语DOM模型及其作用文档对象模型节点节点的属性文档对象3.2 DOM文档操作3.2.1 查找网页元素3.2.2 获取元素内容新的策略——修改样式更好的策略——修改样式3.2.3 改变元素内容3.2.4 操作网页元素3.2.5 获取元素偏移offset和style的区别3.…

2016国内移动广告平台排行榜

为什么80%的码农都做不了架构师?>>> 移动营销的发展可追溯至第一台便携式手机的诞生,并随着移动终端的更新迭代和广告技术的发展创新;随着移动互联网的技术与商业模式的迅速发展,移动营销领域面临着种种创新与改革&am…