參考通過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...