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,一经查实,立即删除!

相关文章

添加远程链接MySQL的权限

mysql> grant 权限1,权限2,…权限n on 数据库名称.表名称 to 用户名用户地址 identified by ‘连接口令’;权限1,权限2,…权限n代表select,insert,update,delete,create,drop,index,alter,grant,references,reload,shutdown,process,file等14个权限。当权限1,权限2,…权限n被…

C# Java间进行RSA加密解密交互(二)

接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题。 在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与项目中要求的有所出入。在项目中,客户端(Java)的加密是通过这么一个方法…

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 …

Linux命令之文件相关

cd 绝对路径相对路径 --转到对应目录 touch-a --更新访问时间 touch -m --更新修改时间(ls -l只能显示修改时间) touch -t 【【cc】yy】mmddhhmm【ss】 --修改文件时间为任意时间0-68为20**,69-99为19**, touch 不存在的文件 --新…

省赛第一次选拔赛

就是第11届浙江省省赛的套题,总共11题,A了3题,排第25,中途就走了,其实那道同模取余题我是可以做出的,找规律我也想到了,但tmd我只打了30个的表,规律是第48个后出现,点背啊…

getaddrinfo ENOTFOUND 127.0.0.1:3306

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

357. Count Numbers with Unique Digits

357. Count Numbers with Unique Digits Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Example:Given n 2, return 91. (The answer should be the total numbers in the range of 0 ≤ x < 100, excluding [11,22,3…

Foundation框架: 5.常用结构体知识补充

前面我们已经把常用的四个结构体学完了, 知道怎么去创建怎么去使用了, 但还有一些小细节没有补充完, 下面让我们一起来看看吧: 例子: #import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {// 用来比较两个点是否相同(x, y)BOOL p CGPointEqualT…

一幅长文细学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…

怎么在图片上面加个div层,让它浮于图片上方

怎么在图片上面加个div层,让它浮于图片上方 1、首先当然是要插入一张图片啦&#xff0c;代码如下&#xff1a;<a href"#" target"_blank"><img src"images/13.png" width"240" heigth"240"></a>图片路径自…

java 级联删除文件夹下的所有文件

public void deletefile(String delpath) throws Exception {try {File file new File(delpath);// 当且仅当此抽象路径名表示的文件存在且 是一个目录时&#xff0c;返回 trueif (!file.isDirectory()) {file.delete();} else if (file.isDirectory()) {String[] filelist f…

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

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

spring中注解的通俗解释

我们在没有用注解写spring配置文件的时候,会在spring配置文件中定义Dao层的bean,这样我们在service层中,写setDao方法,就可以直接通过接口调用Dao层,用了注解写法后,在配置文件中不用再写Dao层的bean,只需要在Dao实现类中加入Repositorypublic Class TestDaoImpl(){}在service层…

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

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

WKWebview与js交互

应用场景&#xff1a; 项目中在原有h5界面中嵌入js代码&#xff0c;在指定位置加入第三方分享 此部分为js点击分享绑定部分代码&#xff0c;这里的事件名需要h5和前端协商好一致。 window.webkit.messageHandlers.<事件名>.postMessage(需要传递的数据) iOS端 首先需要遵…

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

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