*注入分类
我们平时所说的代码注入,主要静态和动态两种方式
·静态注入,针对是可执行文件,比如平时我们修改ELF,DEX文件等等,相关的辅助工具也很多,比如IDA、JEB、ApkTool等等;
· 动态注入,针对是进程,比如修改进程的寄存器、内存值等等;
动态跟静态最大的区别是,动态不需要改动源文件,但需要高权限(通常是root权限),而且所需的技术含量更高。
· 本质
动态注入技术,本质上就是一种调度技术。想想平时我们调试一个进程时,可以做哪些功能?一般有下列几项:
· 查看变量值
· 修改变量值
· 跟踪进程跳转
· 查看进程调用堆栈
· 等等
所谓的SO注入就是将代码拷贝到目标进程中,并结合函数重定向等其他技术,最终达到监控或改变目标进程行为的目的。Android是基于Linux内核的操作系统,而在Linux下SO注入基本是基于调试API函数ptrace实现的,同样Android的SO注入也是基于ptrace函数,要完成注入还需获取root权限。
注入过程如下:
0x01 获取目标进程的pid,关联目标进程;
0x02 获取并保存目标进程寄存器值;
0x03 获取目标进程的dlopen,dlsym函数的绝对地址;
0x04 获取并保存目标进程的堆栈,设置dlopen函数的相关参数,将要注入的SO的绝对路径压栈;
0x05 调用dlopen函数;
0x06 调用dlsym函数,获取SO中要执行的函数地址;
0x07 调用要执行的函数;
0x08 恢复目标进程的堆栈,恢复目标进程寄存器值,解除关联,完成SO动态库注入;
以下为so动态注入步骤:
连接root过的Android设备或者打开模拟器。将inject和libhello.so拷入设备,设执行权限,执行:
将inject权限提升到777
然后另运行CMD
先看看被注入进程(surfaceflinger)的mmap,可以看到我们的so已经被加载了,紧接着的那一块就是我们mmap出来的:
从logcat中也可以看到so注入成功,并且以被注入进程的身份执行了so中的代码:
简单的注入成功
一如既往的学习,一如既往的整理,一如即往的分享。感谢支持
扫描关注LemonSec
本文始发于微信公众号(LemonSec):Android安全(三)—so注入(inject)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论