介绍
ptrace
是一个系统调用,允许一个进程(父进程即调试器)观察和控制另一个进程(子进程即被调试的目标进程)。同时,它还能检查和改变目标进程的内存、寄存器和执行状态。这种机制广泛用于调试器和逆向分析工具。
ptrace 函数原型
1 |
|
request
指定执行的操作,决定了 ptrace
的具体功能,比如追踪进程、读取内存、单步执行等。常见值如下:
PTRACE_TRACEME
:表示当前进程希望被其父进程调试。PTRACE_ATTACH
:将当前进程附加到目标进程上。PTRACE_CONT
:继续运行目标进程。PTRACE_PEEKDATA
:读取目标进程的内存。PTRACE_POKEDATA
:写入目标进程的内存。PTRACE_SINGLESTEP
:让目标进程执行单条指令。PTRACE_GETREGS
和PTRACE_SETREGS
:获取或设置目标进程的寄存器。- 其他值:具体见系统调用文档。
pid
指定目标进程的 PID(进程 ID)。
addr
表示地址参数:
- 对于内存相关操作(如
PTRACE_PEEKDATA
和PTRACE_POKEDATA
),这是目标进程的内存地址。 - 对于寄存器操作,可以忽略此参数。
data
根据操作的不同,此参数可以用作输入或输出:
- 用于传递写入目标进程的值。
- 保存读取到的数据(如寄存器内容)。
当一个调试器(如 gdb
或自定义调试器)使用 ptrace(PTRACE_ATTACH)
附加到目标进程时,内核会更新目标进程的 TracerPid
字段,记录调试器的 PID。
TracerPid
/proc/<pid>/status
文件中的 TracerPid
字段与 ptrace
密切相关,TracerPid
表示该进程的调试状态。
TracerPid: 0
表示当前进程没有被调试。TracerPid: <pid>
表示该进程正在被调试,且调试器的进程 ID 是<pid>
。