【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 )
文章目錄
- 一、ptrace 函數族
- 1、進程附著
- 2、進程脫離
- 3、進程數據讀寫權限
- 4、進程對應的主線程寄存器讀寫
- 5、單步調試
- 6、繼續向后執行
- 二、ptrace 函數族狀態轉換
一、ptrace 函數族
ptrace 函數原型 : ptrace 函數實際上是由一系列的函數組成 , 具體調用哪個函數 , 要根據第一個參數確定 ;
#include <sys/ptrace.h>long ptrace(enum __ptrace_request request, pid_t pid,void *addr, void *data);ptrace 函數參考文檔 : https://man7.org/linux/man-pages/man2/ptrace.2.html
下面是 enum __ptrace_request request 參數的可能的取值 : 在上述文檔中有詳細的說明 ;
1、進程附著
PTRACE_ATTACH : 指明要附著的進程 ;
進程 A 要 調試進程 B , 在進程 A 中 先通過 ptrace 函數 附著進程 B , 傳入 PTRACE_ATTACH 作為第一參數 ;
( 注意 : 進程 A 必須有 root 權限 )
調用 ptrace 函數時 , 會調用系統內核層 , 給進程 A 一個權限 , 將被調試進程 B 的控制權限交給 進程 A ;
進程 A 調試 進程 B 時 , 進程 B 被掛起 , 進程 B 的 CPU 和 內存信息 , 都會被保存到內存中 , 進程 B 處于休眠狀態 , CPU 不會運行 進程 B 的任何指令 ;
2、進程脫離
PTRACE_DETACH : 要脫離的進程 ;
進程 A 如果調用 ptrace 函數 , 傳入 PTRACE_DETACH , 就會釋放權限 , 發出信號 , 進程 B 恢復運行 ;
3、進程數據讀寫權限
讀取進程數據權限 : PTRACE_PEEKTEXT、PTRACE_PEEKDATA、PTRACE_PEEKUSER
寫入進程數據權限 : PTRACE_POKETEXT、PTRACE_POKEDATA、PTRACE_POKEUSER
注意 : 讀寫內存時 , 盡量在進程掛起后讀寫 , 否則內存數據不可靠 ;
4、進程對應的主線程寄存器讀寫
讀取寄存器 : PTRACE_GETREGS
寫出寄存器 : PTRACE_SETREGS
同一個進程 , 可能有多個線程 , 不同線程可能會被分配到不同的 CPU , 進程讀寫的寄存器可能有多套 ;
上面的 PTRACE_GETREGS , PTRACE_SETREGS , 讀寫的寄存器 是 執行 主線程 的 CPU 的 寄存器 ;
5、單步調試
PTRACE_SYSCALL : 每當發生系統調用時, 被調試進程暫停 , 將控制權交還給調試進程 ;
PTRACE_SINGLESTEP : 每當執行一條指令時 , 被調試進程暫停 , 將控制權交還給調試進程 ; 單步調試 ;
6、繼續向后執行
PTRACE_CONT : ptrace 調試進程 , 完畢之后 , 退出調試 , 程序繼續向后執行 , 使用該 PTRACE_CONT 作為 ptrace 函數的 第一參數即可 ;
CONTINUE 繼續執行 ;
二、ptrace 函數族狀態轉換
進程 A 調試 進程 B , 進程 A 先 調用 ptrace 函數 Attach 進程 B , 可以進行 數據讀寫 , 單步執行 , 等待系統調用 , 讀寫寄存器 等操作 , 執行完畢后 可以繼續執行 ;
調試完畢后 , 進程 B 脫離 Detach 進程 A 的調試 ;
總結
以上是生活随笔為你收集整理的【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 逆向】ptrace 函
- 下一篇: 【Android 逆向】代码调试器开发