Android 逆向Android 进程注入工具开发 ( EIP 寄存器指向 dlopen 函数 | ESP 寄存器指向栈内存 | 调试程序收回目标进程控制权 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 逆向Android 进程注入工具开发 ( EIP 寄存器指向 dlopen 函数 | ESP 寄存器指向栈内存 | 调试程序收回目标进程控制权 )的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 进程注入工具开发 ( 编译注入工具 | 编译结果文件说明 | 注入过程说明 )

Android 逆向Android 进程注入工具开发 ( 远程调用总结 | 远程调用注意事项 )

Android 逆向Android 进程注入工具开发 ( SO 进程注入环境及 root 权限获取 | 进程注入时序分析 )

Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 调试进程 ATTACH 附着目标进程 | 读取目标函数寄存器值并存档 )

Android 逆向Android 进程注入工具开发 ( 远程调用 | x86 架构的返回值获取 | arm 架构远程调用 )

Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )(代