【Android 逆向】Android 进程注入工具开发 ( EIP 寄存器指向 dlopen 函数 | ESP 寄存器指向栈内存 | 调试程序收回目标进程控制权 )
一、EIP 寄存器指向 dlopen 函数
代码段中 , 一般都有 dlopen 函数 , 该函数属于 system/lib/linker 模块 , 这是一个 so 库 ;
dlopen 函数的作用是加载一个动态库 , 并返回动态链接库的句柄
包含头文件 :
#include <dlfcn.h>
函数原型 :
void * dlopen( const char * pathname, int mode);
将 EIP 寄存器指向 dlopen 函数 , 也就是将 dlopen 函数的地址设置到 EIP 寄存器中 ;
目标进程 恢复运行后 , 就会执行 dlopen 函数 ;
二、ESP 寄存器指向栈内存
除了函数外 , 还要传递参数 , 在 x86 架构中 , 函数参数是通过 栈 进行传递的 ;
使用 libc.so 中的 mmap 函数 在 堆 中申请一块内存 S , 在该内存中存储 dlopen 的参数 , 这个参数就是 动态库的 路径 ;
ESP 寄存器指向的位置就是栈内存的地址 , 用于存放函数的参数 ;
将 S 内存作为 栈 : 将 S 内存的首地址赋值给 ESP 寄存器 ;
三、调试程序收回目标进程控制权
在 dlopen 函数执行完毕后 , 调试程序 需要将 进程控制权收回 , 不能再接着 dlopen 函数之后继续执行下去 ;
在 x86 的栈中 , 有一个返回地址 , 返回地址上面是 参数列表 , 参数出栈后 , 会指向返回地址 ;
当 ptrace 函数 attach 获取到 目标进程控制权后 , 如果进程崩溃 , 调试程序会回收控制权 ;
因此这里需要让程序崩溃 , 在返回地址中 , 设置 0x00 00 00 00 地址值 , 该地址是内存的最前端 , 这个地址是保留给系统的 , 应用程序不允许访问 , 如果用户进程读取该内存地址数据 , 直接崩溃 , 返回不可读错误 ;
此时 目标进程 的控制权又回到了 调试程序 手中 ;
后续可以再执行 读写内存 , 读写寄存器 , 或者 detach 目标进程 ;
相关文章
- Android开发环境的搭建
- 【IOS-COCOS2D-X 游戏开发之十五】COCOS2DX中响应ANDROID的BACK(返回)与MENU(小房子)事件&&COCOS2DX自动释放粒子内存函数!
- Android 图片显示
- android内存分析
- android内存管理
- 【Android笔记45】Android中几个常用对话框的使用
- Android图形显示系统——下层显示2:图形内存的申请与显示
- Android Canvas save()和restore()作用简析
- Android WorkManager 实战讲解
- 【Android 逆向】Android 进程代码注入原理 ( 进程注入原理 | 远程调用流程 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 )
- 【Android 异步操作】线程池 ( 线程池 execute 方法源码解析 )
- 【Android 内存优化】Android 原生 API 图片压缩原理 ( Bitmap_compress 方法解析 | Skia 二维图形库 | libjpeg 函数库 | libpng 函数库 )
- 【Android 内存优化】Java 内存模型 ( Java 虚拟机内存模型 | 线程私有区 | 共享数据区 | 内存回收算法 | 引用计数 | 可达性分析 )
- android c++标准命名空间demo(五十八)
- android audio混音
- Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8 (转)