【Android 逆向】Android 进程注入工具开发 ( EIP 寄存器指向 dlopen 函数 | ESP 寄存器指向栈内存 | 调试程序收回目标进程控制权 )
文章目錄
- 一、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