天天看點

linux之ptrace

經典部落格:

Linux記憶體替換系列(包括實驗 實驗可行)  就是要注意下是64位還是32位的。。。。

https://blog.csdn.net/Dearggae/article/details/47379245

玩轉ptrace:

http://www.cnblogs.com/wangkangluo1/archive/2012/06/05/2535484.html

ptrace系統調用

ptrace系統調從名字上看是用于程序跟蹤的,它提供了父程序可以觀察和控制其子程序執行的能力,并允許父程序檢查和替換子程序的核心鏡像(包括寄存器)的值。其基本原理是: 當使用了ptrace跟蹤後,所有發送給被跟蹤的子程序的信号(除了SIGKILL),都會被轉發給父程序,而子程序則會被阻塞,這時子程序的狀态就會被系統标注為TASK_TRACED。而父程序收到信号後,就可以對停止下來的子程序進行檢查和修改,然後讓子程序繼續運作。

其原型為:

#include sys/ptrace.h

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

ptrace有四個參數:

1). enum __ptrace_request request:訓示了ptrace要執行的指令。

2). pid_t pid: 訓示ptrace要跟蹤的程序。

3). void *addr: 訓示要監控的記憶體位址。

4). void *data: 存放讀取出的或者要寫入的資料。

ptrace是如此的強大,以至于有很多大家所常用的工具都基于ptrace來實作,如strace和gdb。

來自 https://www.cnblogs.com/tangr206/articles/3094358.html

【描述】

提供父程序觀察和控制另一個程序執行的機制,同時提供查詢和修改另一程序的核心映像與寄存器的能力,主要用于執行斷點調試和系統調用跟蹤。

【功能】

Request參數決定了系統調用的功能:(第一個參數決定ptrace的行為也決定了接下來其它3個參數是怎樣被使用的)

• 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程序不可以使用此函數

來自 https://blog.csdn.net/Dearggae/article/details/47144393

将代碼插入到自由空間

在前面的例子中我們将代碼直接插入到了正在執行的指令流中,然而,調試器可能會被這種行為弄糊塗,是以我們決定把指令插入到程序中的自由空間中去。通過察看/proc/pid/maps可以知道這個程序中自由空間的分布。

小結:

ptrace函數可能會讓人們覺得很奇特,因為它居然可以檢測和修改一個運作中的程式。這種技術主要是在調試器和系統調用跟蹤程式中使用。它使程式員可以在使用者級别做更多有意思的事情。已經有過很多在使用者級别下擴充作業系統得嘗試,比如UFO,一個使用者級别的檔案系統擴充,它使用ptrace來實作一些安全機制。

來自 http://www.cnblogs.com/wangkangluo1/archive/2012/06/05/2535484.html

斷點的實作原理,就是在指定的位置插入斷點指令,當被調試的程式運作到斷點的時候,産生SIGTRAP信号。

來自 https://www.cnblogs.com/tangr206/articles/3094358.html

繼續閱讀