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