天天看點

linux ptrace 讀記憶體,Linux進階調試與優化——ptrace

ptrace (process trace)

#include

long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);

ptrace系統調用運作tracer程序監視和控制tracee程序的執行過程,檢查和修改tracee程序的記憶體和寄存器值。ptrace主要用來實作端點調試和跟蹤系統調用。

tracee程序首先需要attach在tracer程序上,attach和接下來的指令是以線程為機關的,每一個tracee的線程都需要單獨attach到一個不同的tracer程序上,如果沒有attach到tracer上,則無法進行調試。

ptrace系統調用根據request分為不同的應用場景:

1) PTRACE_TRACEME

子線程中通過PTRACE_TRACEME請求父線程跟蹤自己,隻有PTRACE_TRACEME請求ID是tracee調用的,其他請求ID都是tracer調用的。

ptrace(PTRACE_TRACEME, NULL, NULL, NULL);

2) PTRACE_PEEKTEXT,PTRACE_PEEKDATA

從tracee的記憶體addr處讀取一個雙位元組資料。

Linux不區分代碼位址空間和資料位址空間,是以這兩個請求ID是一樣的。

3) PTRACE_PEEKUSER

從tracee的使用者區addr處讀取一個雙位元組資料,通常包含寄存器值和程序相關的資訊。(sys/user.h)

4) PTRACE_PORKTEXT,PTRACE_POKEDATA

将data雙位元組資料寫入tracee記憶體的addr處

5) PTRACE_POKEUSER

拷貝一個雙位元組資料data到tracee的使用者區addr處

6) PTRACE_GETREGS,PTRACE_GETFPREGS

拷貝tracee的通用寄存器值或者浮點寄存器值到tracer的data處。不是所有的CPU架構都支援該請求

7) PTRACE_GETREGSET

讀取tracee的寄存器

8) PTRACE_SETREGS,PTRACE_SETFPREGS

修改tracee的通用寄存器或者浮點寄存器

9) PTRACE_SETREGSET

修改tracee的寄存器

10) PTRACE_GETSIGINFO

擷取導緻tracee停止執行的信号量。通過data傳回siginfo_t結構體

11) PTRACE_SETSIGINFO

設定信号量,這樣正常發給tracee的信号量會首先被tracer捕獲

12) PTRACE_PEEKSIGINFO

隻讀tracee的siginfo_t結構體

13) PTRACE_GETSIGMASK

擷取tracee屏蔽的信号量

14) PTRACE_SETSIGMASK

設定tracee信号量屏蔽屬性

15) PTRACE_SETOPTIONS

16) PTRACE_GETEVENTMSG

擷取ptrace消息事件

17) PTRACE_CONT

重新運作停止運作的tracee線程

18) PTRACE_SYSCALL,PTRACE_SIGLESTEP

單步調試tracee

19) PTRACE_SYSEMU,PTRACE_SYSEMU_SIGLESTEP

20) PTRACE_LISTEN

重新開機停止的tracee,但是不執行它

21) PTRACE_KILL

給tracee發送SIGKILL終止它運作

22) PTRACE_INTERRUPT

停止tracee運作

23) PTRACE_ATTACH

附着在pid程序上,讓他成為調用者的tracee

24) PTRACE_SZIZE

與PTRACE_ATTACH不同的是,該請求不會停止tracee的執行

25) PTRACE_DETACH

取消附着,恢複tracee執行