【Android 逆向】Android 进程代码注入原理 ( 进程注入原理 | 远程调用流程 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 )
文章目錄
- 一、進程注入原理
- 二、遠程調用流程 ( 獲取 so 動態庫地址 | 獲取函數地址 | 設置 IP 寄存器 | mmap 申請內存 | 設置 SP 寄存器 )
一、進程注入原理
調試進程 Attach 被調試進程 :
工具程序 ( 調試進程 ) 獲取調試 目標進程 ( 被調試進程 ) 的權限 , 調用 ptrace 函數 , 傳入 PTRACE_ATTACH 參數 ;
如果 目標進程 Attach 成功 , 該進程會自動掛起 , 暫停執行指令 ; 并返回 WUNTRACED 狀態給 工具程序 , 表示 目標進程 已經進入 被調試狀態 ;
調試進程 讀取 被調試進程 寄存器值 :
工具程序 ( 調試進程 ) 調用 ptrace 函數 , 傳入 PTRACE_GETREGS 參數 , 獲取調試 目標進程 ( 被調試進程 ) 的寄存器值 , 獲取成功后 , 返回給 工具程序 ( 調試進程 ) ;
工具程序 ( 調試進程 ) 中拿到寄存器值后 , 保存一份寄存器值 , 之后再進行遠程調用等操作 , 最后 Detach 解除調試時 , 必須根據保存的寄存器值 , 恢復 目標進程 ( 被調試進程 ) 的寄存器值 ;
工具程序 ( 調試進程 ) 遠程調用 目標進程 ( 被調試進程 ) :
遠程調用 指的是 在 目標進程 ( 被調試進程 ) 中 , 執行 我們想要執行的程序 , 一般是加載 SO 動態庫 或遠程代碼 , 使用 malloc 分配內存 , 然后將代碼復制到該段內存中 , 給這塊內存分配可執行權限 ;
一般情況是注入一個 SO 動態庫 , 每個 SO 動態庫 都是獨立模塊 , 這樣不會破壞原有的代碼體系 ,
然后 通過 遠程調用 , 獲取該內存的地址 , 之后就可以使用遠程調用執行注入的代碼 ;
注入代碼 , 一般是用于修改 進程邏輯用的 , 修改 目標進程 ( 被調試進程 ) 內存中的數據 ;
進程注入原理圖 :
二、遠程調用流程 ( 獲取 so 動態庫地址 | 獲取函數地址 | 設置 IP 寄存器 | mmap 申請內存 | 設置 SP 寄存器 )
遠程調用 的 核心就是 要 準確的計算 要遠程調用的 SO 動態庫的庫函數 在內存中的地址 ;
內存空間是一塊線性的空間 , 內存地址從低到高依次線性排列 , 如 0x00 00 00 00 ~ 0x FF FF FF FF , 32 位地址對應的指針地址長度都是 4 字節 , 最多訪問 4 GB 的內存空間 ;
工具程序 ( 調試進程 ) 又稱為 " 控制進程 " , 對應下圖的 控制進程 , 控制進程 在 內存中 , 占據一定的控件 ;
目標進程 ( 被調試進程 ) 又稱為 " 被控制進程 " , 對應下圖的 控制進程 , 被控制進程 在 內存中 , 也占據一定的控件 ;
控制進程 與 被控制進程 在內存中 , 先后順序不確定 ;
下圖的內存是 Android 設備的整體內存 ;
在 /proc/pid 對應 進程的 目錄下 , 有 mmaps 文件 , 在該文件中 , 會記錄所有的 so 動態庫的 起止 內存地址 ;
根據 /proc/pid/mmaps 文件 , 可以獲取 工具程序 ( 調試進程 ) 的 libc.so 的起止地址 , 也可以獲取 目標進程 ( 被調試進程 ) 的 libc.so 的起止地址 ;
在 libc.so 中存在 dlopen 函數 , dlopen 函數有一個函數指針 ( 函數地址 ) , 該函數指針可以直接獲取到 , dlopen 的名稱就代表該函數的地址 , libc.so 的起始地址可以通過 /proc/pid/mmaps 文件確定 , dlopen 函數在 libc.so 的相對偏移量 ( 如 : 8 字節 ) 也是確定的 , 這樣就可以知道 dlopen 函數在內存中的地址 ;
獲取到 dlopen 函數地址后 , 將 IP 寄存器設置成 r_dlopen 函數地址 ; IP 寄存器存儲將要執行的下一條指令的偏移量 ;
通過 mmap 函數 , 分配一塊新內存 , SP 寄存器指向這塊新內存 , 之后 調用 ptrace 函數傳入 PTRACE_CONT 參數 , 繼續執行將控制權交還給 目標進程 ( 被調試進程 ) , 繼續執行 , 直到下一個中斷發生 ; SP 寄存器是堆棧指針寄存器 ;
總結
以上是生活随笔為你收集整理的【Android 逆向】Android 进程代码注入原理 ( 进程注入原理 | 远程调用流程 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 逆向】修改运行中的 A
- 下一篇: 【Android 逆向】Android