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