介绍
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>。