白乐天

道阻且长,行则将至。

关于ptrace

介绍

  ptrace 是一个系统调用,允许一个进程(父进程即调试器)观察和控制另一个进程(子进程即被调试的目标进程)。同时,它还能检查和改变目标进程的内存、寄存器和执行状态。这种机制广泛用于调试器和逆向分析工具。

ptrace 函数原型

1
2
#include <sys/ptrace.h>
long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);

request
指定执行的操作,决定了 ptrace 的具体功能,比如追踪进程、读取内存、单步执行等。常见值如下:

  • PTRACE_TRACEME:表示当前进程希望被其父进程调试。
  • PTRACE_ATTACH:将当前进程附加到目标进程上。
  • PTRACE_CONT:继续运行目标进程。
  • PTRACE_PEEKDATA:读取目标进程的内存。
  • PTRACE_POKEDATA:写入目标进程的内存。
  • PTRACE_SINGLESTEP:让目标进程执行单条指令。
  • PTRACE_GETREGSPTRACE_SETREGS:获取或设置目标进程的寄存器。
  • 其他值:具体见系统调用文档。

pid
指定目标进程的 PID(进程 ID)。

addr
表示地址参数:

  • 对于内存相关操作(如 PTRACE_PEEKDATAPTRACE_POKEDATA),这是目标进程的内存地址。
  • 对于寄存器操作,可以忽略此参数。

data
根据操作的不同,此参数可以用作输入或输出:

  • 用于传递写入目标进程的值。
  • 保存读取到的数据(如寄存器内容)。

  当一个调试器(如 gdb 或自定义调试器)使用 ptrace(PTRACE_ATTACH) 附加到目标进程时,内核会更新目标进程的 TracerPid 字段,记录调试器的 PID。

TracerPid

  /proc/<pid>/status 文件中的 TracerPid 字段与 ptrace 密切相关,TracerPid 表示该进程的调试状态。

  • TracerPid: 0 表示当前进程没有被调试。

  • TracerPid: <pid> 表示该进程正在被调试,且调试器的进程 ID 是 <pid>