6.3.11.6. ptrace

ptrace函数原型为 long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data); ,其中 enum __ptrace_request request 指示了ptrace要执行的命令,pid_t pid 指示ptrace要跟踪的进程,void *addr 指示要监控的内存地址,void *data 存放读取出的或者要写入的数据。

函数执行成功时返回0,错误时返回-1,同时设置errno。

其中request的选项包括:

  • PTRACE_TRACEME
    • 表示本进程将被其父进程跟踪

  • PTRACE_PEEKTEXT
    • 从内存地址中读取一个WORD,内存地址为addr

  • PTRACE_PEEKDATA
    • 由于Linux不区分文本与数据段的地址空间,PTRACE_PEEKDATA与PTRACE_PEEKTEXT无区别

  • PTRACE_PEEKUSER
    • 从USER区域中读取一个WORD,内存地址为addr,值将作为结果返回,其中偏移地址addr通常是是字对齐的,data将被忽略

  • PTRACE_PEEKTEXT
    • 向内存地址中写入一个WORD,内存地址为addr

  • PTRACE_PEEKDATA

  • PTRACE_PEEKUSER
    • 向USER区域中写入一个WORD,内存地址为addr

  • PTRACE_CONT
    • 继续运行之前停止的子进程

    • 如果data是非空的,它被解释为要发送给 Tracee 的信号

  • PTRACE_KILL
    • 杀掉子进程

  • PTRACE_SINGLESTEP
    • 设置单步执行标志

    • 子进程在每次机器指令后都被暂停

  • PTRACE_GETREGS
    • 读取寄存器

  • PTRACE_GETFPREGS
    • 读取浮点寄存器

  • PTRACE_SETREGS
    • 设置寄存器

  • PTRACE_SETFPREGS
    • 设置浮点寄存器

  • PTRACE_ATTACH
    • attach到一个指定的进程,使其成为当前进程跟踪的子进程

    • 子进程的行为等同于它进行了一次PTRACE_TRACEME操作

  • PTRACE_DETACH

  • PTRACE_SYSCALL
    • 进程在每次系统调用之后暂停

  • PT_DENY_ATTACH
    • 反调试

WORD的长度在64位程序中是64位,32位程序中是32位。 ptrace系统调用在核心对应的处理函数为sys_ptrace。

在trace中Tracer指追踪进程,Tracee指被追踪、被观察的进程。