文章目錄
- 1.ptrace函式詳解
- 1.1在系統中呼叫需要包含頭檔案及函式宣告
- 1.2詳細分析函式
- 1.3函式回傳值
- 2.功能詳細描述
- 2.1 PTRACE_TRACEME
- 2.2PTRACE_PEEKTEXT, PTRACE_PEEKDATA
- 2.3PTRACE_POKETEXT, PTRACE_POKEDATA
- 2.4PTRACE_PEEKUSR
- 2.5PTRACE_POKEUSR
- 2.6 PTRACE_CONT
- 2.7PTRACE_SYSCALL
- 2.8PTRACE_KILL
- 2.9PTRACE_SINGLESTEP
- 2.10PTRACE_ATTACH
- 2.11 PTRACE_DETACH
- 2.12PTRACE_GETREGS
- 2.13 PTRACE_SETREGS
- 2.14 PTRACE_GETFPREGS
- 2.15 PTRACE_SETFPREGS
1.ptrace函式詳解
1.1在系統中呼叫需要包含頭檔案及函式宣告
#include <sys/ptrace.h>
int ptrace(int request, int pid, int addr, int data);
1.2詳細分析函式
Ptrace 提供了一種父行程可以控制子行程運行,并可以檢查和改變它的核心image,它主要用于實作斷點除錯,一個被跟蹤的行程運行中,直到發生一個信號,則行程被中止,并且通知其父行程,在行程中止的狀態下,行程的記憶體空間可以被讀寫,父行程還可以使子行程繼續執行,并選擇是否是否忽略引起中止的信號,
Request引數含義:
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 設定浮點暫存器
1.3函式回傳值
成功回傳0,錯誤回傳-1,errno被設定,
錯誤
EPERM
特殊行程不可以被跟蹤或行程已經被跟蹤,
ESRCH
指定的行程不存在
EIO
請求非法
2.功能詳細描述
2.1 PTRACE_TRACEME
形式:ptrace(PTRACE_TRACEME,0 ,0 ,0)
解釋:本行程被其父行程所跟蹤,其父行程應該希望跟蹤子行程,
2.2PTRACE_PEEKTEXT, PTRACE_PEEKDATA
形式:ptrace(PTRACE_PEEKTEXT, pid, addr, data)
ptrace(PTRACE_PEEKDATA, pid, addr, data)
解釋:從記憶體地址中讀取一個位元組,pid表示被跟蹤的子行程,記憶體地址由addr給出,data為用戶變數地址用于回傳讀到的資料,在Linux(i386)中用戶代碼段與用戶資料段重合所以讀取代碼段和資料段資料處理是一樣的,
2.3PTRACE_POKETEXT, PTRACE_POKEDATA
形式:ptrace(PTRACE_POKETEXT, pid, addr, data)
ptrace(PTRACE_POKEDATA, pid, addr, data)
解釋:往記憶體地址中寫入一個位元組,pid表示被跟蹤的子行程,記憶體地址由addr給出,data為所要寫入的資料,
2.4PTRACE_PEEKUSR
形式:ptrace(PTRACE_PEEKUSR, pid, addr, data)
解釋:從USER區域中讀取一個位元組,pid表示被跟蹤的子行程,USER區域地址由addr給出,data為用戶變數地址用于回傳讀到的資料,USER結構為core檔案的前面一部分,它描述了行程中止時的一些狀態,如:暫存器值,代碼、資料段大小,代碼、資料段開始地址等,在Linux(i386)中通過PTRACE_PEEKUSER和PTRACE_POKEUSR可以訪問USER結構的資料有暫存器和除錯暫存器,
2.5PTRACE_POKEUSR
形式:ptrace(PTRACE_POKEUSR, pid, addr, data)
解釋:往USER區域中寫入一個位元組,pid表示被跟蹤的子行程,USER區域地址由addr給出,data為需寫入的資料,
2.6 PTRACE_CONT
形式:ptrace(PTRACE_CONT, pid, 0, signal)
解釋:繼續執行,pid表示被跟蹤的子行程,signal為0則忽略引起除錯行程中止的信號,若不為0則繼續處理信號signal,
2.7PTRACE_SYSCALL
形式:ptrace(PTRACE_SYS, pid, 0, signal)
解釋:繼續執行,pid表示被跟蹤的子行程,signal為0則忽略引起除錯行程中止的信號,若不為0則繼續處理信號signal,與PTRACE_CONT不同的是進行系統呼叫跟蹤,在被跟蹤行程繼續運行直到呼叫系統呼叫開始或結束時,被跟蹤行程被中止,并通知父行程,
2.8PTRACE_KILL
形式:ptrace(PTRACE_KILL,pid)
解釋:殺掉子行程,使它退出,pid表示被跟蹤的子行程,
2.9PTRACE_SINGLESTEP
形式:ptrace(PTRACE_KILL, pid, 0, signle)
解釋:設定單步執行標志,單步執行一條指令,pid表示被跟蹤的子行程,signal為0則忽略引起除錯行程中止的信號,若不為0則繼續處理信號signal,當被跟蹤行程單步執行完一個指令后,被跟蹤行程被中止,并通知父行程,
2.10PTRACE_ATTACH
形式:ptrace(PTRACE_ATTACH,pid)
解釋:跟蹤指定pid 行程,pid表示被跟蹤行程,被跟蹤行程將成為當前行程的子行程,并進入中止狀態,
2.11 PTRACE_DETACH
形式:ptrace(PTRACE_DETACH,pid)
解釋:結束跟蹤, pid表示被跟蹤的子行程,結束跟蹤后被跟蹤行程將繼續執行,
2.12PTRACE_GETREGS
形式:ptrace(PTRACE_GETREGS, pid, 0, data)
解釋:讀取暫存器值,pid表示被跟蹤的子行程,data為用戶變數地址用于回傳讀到的資料,此功能將讀取所有17個基本暫存器的值,
2.13 PTRACE_SETREGS
形式:ptrace(PTRACE_SETREGS, pid, 0, data)
解釋:設定暫存器值,pid表示被跟蹤的子行程,data為用戶資料地址,此功能將設定所有17個基本暫存器的值,
2.14 PTRACE_GETFPREGS
形式:ptrace(PTRACE_GETFPREGS, pid, 0, data)
解釋:讀取浮點暫存器值,pid表示被跟蹤的子行程,data為用戶變數地址用于回傳讀到的資料,
2.15 PTRACE_SETFPREGS
形式:ptrace(PTRACE_SETREGS, pid, 0, data)
解釋:設定浮點暫存器值,pid表示被跟蹤的子行程,data為用戶資料地址,
在安卓的逆向程序中注入很多也都是通過ptrace函式行程注入,所以這個函式在安全及逆向程序中是很重要的,
更多安全技術文章,請關注 “游戲安全攻防” 公眾號,一起學習,一起進步,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/253509.html
標籤:其他
上一篇:AAPT2 aapt2-3.5.2-5435860-windows Daemon #0: Daemon startup failed
