linux 分析 ptrace
linux?分析?ptrace()
形式
#include <sys/ptrace.h>
int ptrace(int request, int pid, int addr, int data);
?
描述
Ptrace 提供了一種父進程可以控制子進程運行,并可以檢查和改變它的核心p_w_picpath。它主要用于實現斷點調試。一個被跟蹤的進程運行中,直到發生一個信號。則進程被中止,并且通知其父進程。在進程中止的狀態下,進程的內存空間可以被讀寫。父進程還可以使子進程繼續執行,并選擇是否是否忽略引起中止的信號。
Request參數決定了系統調用的功能:
PTRACE_TRACEME
本進程被其父進程所跟蹤。其父進程應該希望跟蹤子進程。
PTRACE_PEEKTEXT, PTRACE_PEEKDATA
從內存地址中讀取一個字節,內存地址由addr給出。
PTRACE_PEEKUSR
從USER區域中讀取一個字節,偏移量為addr。
PTRACE_POKETEXT, PTRACE_POKEDATA
往內存地址中寫入一個字節。內存地址由addr給出。
PTRACE_POKEUSR
往USER區域中寫入一個字節。偏移量為addr。
PTRACE_SYSCALL, PTRACE_CONT
重新運行。
PTRACE_KILL
殺掉子進程,使它退出。
PTRACE_SINGLESTEP
設置單步執行標志
PTRACE_ATTACH
跟蹤指定pid 進程。
PTRACE_DETACH
結束跟蹤
Intel386特有:
PTRACE_GETREGS
讀取寄存器
PTRACE_SETREGS
設置寄存器
PTRACE_GETFPREGS
讀取浮點寄存器
PTRACE_SETFPREGS
設置浮點寄存器
init進程不可以使用此函數
?
返回值
成功返回0。錯誤返回-1。errno被設置。
?
錯誤
EPERM
特殊進程不可以被跟蹤或進程已經被跟蹤。
ESRCH
指定的進程不存在
EIO
請求非法
ptrace系統函數。 ptrace提供了一種使父進程得以監視和控制其它進程的方式,它還能夠改變子進程中的寄存器和內核映像,因而可以實現斷點調試和系統調用的跟蹤。使用ptrace,你可以在用戶層攔截和修改系統調用(sys call).功能詳細描述
1)???PTRACE_TRACEME
形式:ptrace(PTRACE_TRACEME,0 ,0 ,0)
描述:本進程被其父進程所跟蹤。其父進程應該希望跟蹤子進程。
?
2)??PTRACE_PEEKTEXT, PTRACE_PEEKDATA
形式:ptrace(PTRACE_PEEKTEXT, pid, addr, data)
?????? ? ptrace(PTRACE_PEEKDATA, pid, addr, data)
描述:從內存地址中讀取一個字節,pid表示被跟蹤的子進程,內存地址由addr給出,data為用戶變量地址用于返回讀到的數據。在Linux(i386)中用戶代碼段與用戶數據段重合所以讀取代碼段和數據段數據處理是一樣的。
?
3)??PTRACE_POKETEXT, PTRACE_POKEDATA
形式:ptrace(PTRACE_POKETEXT, pid, addr, data)
?????? ? ptrace(PTRACE_POKEDATA, pid, addr, data)
描述:往內存地址中寫入一個字節。pid表示被跟蹤的子進程,內存地址由addr給出,data為所要寫入的數據。
?
4)??TRACE_PEEKUSR
形式:ptrace(PTRACE_PEEKUSR, pid, addr, data)
描述:從USER區域中讀取一個字節,pid表示被跟蹤的子進程,USER區域地址由addr給出,data為用戶變量地址用于返回讀到的數據。USER結構為core文件的前面一部分,它描述了進程中止時的一些狀態,如:寄存器值,代碼、數據段大小,代碼、數據段開始地址等。在Linux(i386)中通過PTRACE_PEEKUSER和PTRACE_POKEUSR可以訪問USER結構的數據有寄存器和調試寄存器。
?
5)??PTRACE_POKEUSR
形式:ptrace(PTRACE_POKEUSR, pid, addr, data)
描述:往USER區域中寫入一個字節,pid表示被跟蹤的子進程,USER區域地址由addr給出,data為需寫入的數據。
?
6)???PTRACE_CONT
形式:ptrace(PTRACE_CONT, pid, 0, signal)
描述:繼續執行。pid表示被跟蹤的子進程,signal為0則忽略引起調試進程中止的信號,若不為0則繼續處理信號signal。
?
7)??PTRACE_SYSCALL
形式:ptrace(PTRACE_SYS, pid, 0, signal)
描述:繼續執行。pid表示被跟蹤的子進程,signal為0則忽略引起調試進程中止的信號,若不為0則繼續處理信號signal。與PTRACE_CONT不同的是進行系統調用跟蹤。在被跟蹤進程繼續運行直到調用系統調用開始或結束時,被跟蹤進程被中止,并通知父進程。
?
8)???PTRACE_KILL
形式:ptrace(PTRACE_KILL,pid)
描述:殺掉子進程,使它退出。pid表示被跟蹤的子進程。
?
9)???PTRACE_SINGLESTEP
形式:ptrace(PTRACE_KILL, pid, 0, signle)
描述:設置單步執行標志,單步執行一條指令。pid表示被跟蹤的子進程。signal為0則忽略引起調試進程中止的信號,若不為0則繼續處理信號signal。當被跟蹤進程單步執行完一個指令后,被跟蹤進程被中止,并通知父進程。
?
10)??PTRACE_ATTACH
形式:ptrace(PTRACE_ATTACH,pid)
描述:跟蹤指定pid 進程。pid表示被跟蹤進程。被跟蹤進程將成為當前進程的子進程,并進入中止狀態。
?
11)??PTRACE_DETACH
形式:ptrace(PTRACE_DETACH,pid)
描述:結束跟蹤。 pid表示被跟蹤的子進程。結束跟蹤后被跟蹤進程將繼續執行。
?
12)??PTRACE_GETREGS
形式:ptrace(PTRACE_GETREGS, pid, 0, data)
描述:讀取寄存器值,pid表示被跟蹤的子進程,data為用戶變量地址用于返回讀到的數據。此功能將讀取所有17個基本寄存器的值。
?
13)??PTRACE_SETREGS
形式:ptrace(PTRACE_SETREGS, pid, 0, data)
描述:設置寄存器值,pid表示被跟蹤的子進程,data為用戶數據地址。此功能將設置所有17個基本寄存器的值。
?
14)??PTRACE_GETFPREGS
形式:ptrace(PTRACE_GETFPREGS, pid, 0, data)
描述:讀取浮點寄存器值,pid表示被跟蹤的子進程,data為用戶變量地址用于返回讀到的數據。此功能將讀取所有浮點協處理器387的所有寄存器的值。
?
15)??PTRACE_SETFPREGS
形式:ptrace(PTRACE_SETREGS, pid, 0, data)
描述:設置浮點寄存器值,pid表示被跟蹤的子進程,data為用戶數據地址。此功能將設置所有浮點協處理器387的所有寄存器的值。
?
?
?
轉載于:https://blog.51cto.com/laokaddk/486223
總結
以上是生活随笔為你收集整理的linux 分析 ptrace的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF快速指导5:验证
- 下一篇: linux软件包管理详解