ptrace入坑指南

2021-10-24 21:17:46 字數 4662 閱讀 9493

參考通過ptrace(),乙個程序可以觀察和控制另乙個程序的執行,並檢查和更改跟蹤程式的記憶體和暫存器。它主要用於實現斷點除錯和系統呼叫跟蹤。

ptrace函式原型

long

ptrace

(enum __ptrace_request request, pid_t pid,

void

*addr,

void

*data)

;

ptrace_traceme

形式:ptrace(ptrace_traceme,0 ,0 ,0)

描述:本程序被其父程序所跟蹤。其父程序應該希望跟蹤子程序。

ptrace_peektext,ptrace_peekdata

形式:ptrace(ptrace_peektext, pid, addr, data)

描述:從記憶體位址中讀取乙個位元組,pid表示被跟蹤的子程序,記憶體位址由addr給出,data為使用者變數位址用於返回讀到的資料。在linux(i386)中使用者**段與使用者資料段重合所以讀取**段和資料段資料處理是一樣的。

ptrace_poketext,ptrace_pokedata

形式:ptrace(ptrace_poketext, pid, addr, data)

描述:往記憶體位址中寫入乙個位元組。pid表示被跟蹤的子程序,記憶體位址由addr給出,data為所要寫入的資料。

trace_peekusr

形式:ptrace(ptrace_peekusr, pid, addr, data)

描述:從user區域中讀取乙個位元組,pid表示被跟蹤的子程序,user區域位址由addr給出,data為使用者變數位址用於返回讀到的資料。user結構為core檔案的前面一部分,它描述了程序中止時的一些狀態,如:暫存器值,**、資料段大小,**、資料段開始位址等。在linux(i386)中通過ptrace_peekuser和ptrace_pokeusr可以訪問user結構的資料有暫存器和除錯暫存器。

ptrace_pokeusr

形式:ptrace(ptrace_pokeusr, pid, addr, data)

描述:往user區域中寫入乙個位元組,pid表示被跟蹤的子程序,user區域位址由addr給出,data為需寫入的資料。

ptrace_cont

形式:ptrace(ptrace_cont, pid, 0, signal)

描述:繼續執行。pid表示被跟蹤的子程序,signal為0則忽略引起除錯程序中止的訊號,若不為0則繼續處理訊號signal。

ptrace_syscall

形式:ptrace(ptrace_sys, pid, 0, signal)

描述:繼續執行。pid表示被跟蹤的子程序,signal為0則忽略引起除錯程序中止的訊號,若不為0則繼續處理訊號signal。與ptrace_cont不同的是進行系統呼叫跟蹤。在被跟蹤程序繼續執行直到呼叫系統呼叫開始或結束時,被跟蹤程序被中止,並通知父程序。

ptrace_kill

形式:ptrace(ptrace_kill,pid)

描述:殺掉子程序,使它退出。pid表示被跟蹤的子程序。

ptrace_singlestep

形式:ptrace(ptrace_kill, pid, 0, signle)

描述:設定單步執行標誌,單步執行一條指令。pid表示被跟蹤的子程序。signal為0則忽略引起除錯程序中止的訊號,若不為0則繼續處理訊號signal。當被跟蹤程序單步執行完乙個指令後,被跟蹤程序被中止,並通知父程序。

ptrace_attach

形式:ptrace(ptrace_attach,pid)

描述:跟蹤指定pid 程序。pid表示被跟蹤程序。被跟蹤程序將成為當前程序的子程序,並進入中止狀態。

ptrace_detach

形式:ptrace(ptrace_detach,pid)

描述:結束跟蹤。 pid表示被跟蹤的子程序。結束跟蹤後被跟蹤程序將繼續執行。

ptrace_getregs

形式:ptrace(ptrace_getregs, pid, 0, data)

描述:讀取暫存器值,pid表示被跟蹤的子程序,data為使用者變數位址用於返回讀到的資料。此功能將讀取所有17個基本暫存器的值。

ptrace_setregs

形式:ptrace(ptrace_setregs, pid, 0, data)

描述:設定暫存器值,pid表示被跟蹤的子程序,data為使用者資料位址。此功能將設定所有17個基本暫存器的值。

ptrace_getfpregs 形式:ptrace(ptrace_getfpregs, pid, 0, data)

描述:讀取浮點暫存器值,pid表示被跟蹤的子程序,data為使用者變數位址用於返回讀到的資料。此功能將讀取所有浮點協處理器387的所有暫存器的值。

ptrace_setfpregs

形式:ptrace(ptrace_setregs, pid, 0, data)

描述:設定浮點暫存器值,pid表示被跟蹤的子程序,data為使用者資料位址。此功能將設定所有浮點協處理器387的所有暫存器的值。

形式:ptrace(ptrace_traceme,0 ,0 ,0)

描述:本程序被其父程序所跟蹤。其父程序應該希望跟蹤子程序。

pid =

fork()

;if(pid <0)

else

if(pid ==0)

//child process

else

// parent process

形式:ptrace(ptrace_peektext, pid, addr, data)

描述:從記憶體位址中讀取乙個位元組,pid表示被跟蹤的子程序,記憶體位址由addr給出,data為使用者變數位址用於返回讀到的資料。在linux(i386)中使用者**段與使用者資料段重合所以讀取**段和資料段資料處理是一樣的。

形式:ptrace(ptrace_poketext, pid, addr, data)

描述:往記憶體位址中寫入乙個位元組。pid表示被跟蹤的子程序,記憶體位址由addr給出,data為所要寫入的資料。

形式:ptrace(ptrace_peekusr, pid, addr, data)

描述:從user區域中讀取乙個位元組,pid表示被跟蹤的子程序,user區域位址由addr給出,data為使用者變數位址用於返回讀到的資料。user結構為core檔案的前面一部分,它描述了程序中止時的一些狀態,如:暫存器值,**、資料段大小,**、資料段開始位址等。在linux(i386)中通過ptrace_peekuser和ptrace_pokeusr可以訪問user結構的資料有暫存器和除錯暫存器。

形式:ptrace(ptrace_pokeusr, pid, addr, data)

描述:往user區域中寫入乙個位元組,pid表示被跟蹤的子程序,user區域位址由addr給出,data為需寫入的資料。

形式:ptrace(ptrace_cont, pid, 0, signal)

描述:繼續執行。pid表示被跟蹤的子程序,signal為0則忽略引起除錯程序中止的訊號,若不為0則繼續處理訊號signal。

形式:ptrace(ptrace_sys, pid, 0, signal)

描述:繼續執行。pid表示被跟蹤的子程序,signal為0則忽略引起除錯程序中止的訊號,若不為0則繼續處理訊號signal。與ptrace_cont不同的是進行系統呼叫跟蹤。在被跟蹤程序繼續執行直到呼叫系統呼叫開始或結束時,被跟蹤程序被中止,並通知父程序。

形式:ptrace(ptrace_kill,pid)

描述:殺掉子程序,使它退出。pid表示被跟蹤的子程序。

形式:ptrace(ptrace_kill, pid, 0, signle)

描述:設定單步執行標誌,單步執行一條指令。pid表示被跟蹤的子程序。signal為0則忽略引起除錯程序中止的訊號,若不為0則繼續處理訊號signal。當被跟蹤程序單步執行完乙個指令後,被跟蹤程序被中止,並通知父程序。

形式:ptrace(ptrace_attach,pid)

描述:跟蹤指定pid 程序。pid表示被跟蹤程序。被跟蹤程序將成為當前程序的子程序,並進入中止狀態。

形式:ptrace(ptrace_detach,pid)

描述:結束跟蹤。 pid表示被跟蹤的子程序。結束跟蹤後被跟蹤程序將繼續執行。

形式:ptrace(ptrace_getregs, pid, 0, data)

描述:讀取暫存器值,pid表示被跟蹤的子程序,data為使用者變數位址用於返回讀到的資料。此功能將讀取所有17個基本暫存器的值。

形式:ptrace(ptrace_setregs, pid, 0, data)

描述:設定暫存器值,pid表示被跟蹤的子程序,data為使用者資料位址。此功能將設定所有17個基本暫存器的值。

形式:ptrace(ptrace_getfpregs, pid, 0, data)

描述:讀取浮點暫存器值,pid表示被跟蹤的子程序,data為使用者變數位址用於返回讀到的資料。此功能將讀取所有浮點協處理器387的所有暫存器的值。

形式:ptrace(ptrace_setregs, pid, 0, data)

描述:設定浮點暫存器值,pid表示被跟蹤的子程序,data為使用者資料位址。此功能將設定所有浮點協處理器387的所有暫存器的值。

ptrace(2) — linux manual page

ptrace學習筆記i

ptrace實現**注入

Kafka入坑指南

kafka是為大資料而生的訊息中介軟體,以其百萬級tps的吞吐量名聲大噪,迅速成為大資料領域的寵兒,在資料採集 傳輸 儲存的過程中發揮著舉足輕重的作用,而storm,spark,flink等大資料流處理或批處理平台都有kafka的相關外掛程式支援。本著為開源做貢獻的原則,在學習kafka的同時也參與...

docker docker 入坑指南

用docker是因為在專案中需要在無網的情況下部署系統,因此環境依賴需要大量手動安裝,並且依賴中可能還有需要的依賴,簡直是無底洞。因為手動的原因,安裝堪稱是無底洞,並且乙個依賴安裝不成功會導致整個環境安裝失敗。基於此,開始探索通過docker的部署的方式解決 部署的問題,兩天的研究,可以說docke...

WKWebView 入坑指南

因專案js互動需要,同時因為支援的系統開始從ios 8 之後,所以就打算使用wkwebview替換掉專案中的uiwebview。本篇文章會持續更新在使用過程總碰到的問題。坑二 在控制器直接呼叫 self.webview.configuration.usercontentcontroller adds...