linux下的ptrace函数

Linux下的ptrace函数

ptrace系统调用的用途

ptrace系统调从名字上看是用于进程跟踪的,它提供了父进程可以观察和控制其子进程执行的能力,并允许父进程检查和替换子进程的内核镜像的值。如获取和写入寄存器的值,修改内存(Peek and poke)等。典型的使用 ptrace 的应用:gdb,strace(用来查看某进程运行过程中的系统调用),其基本原理是: 当使用了ptrace跟踪后,所有发送给被跟踪的子进程的信号(除了SIGKILL),都会被转发给父进程,而子进程则会被阻塞,这时子进程的状态就会被系统标注为TASK_TRACED。而父进程收到信号后,就可以对停止下来的子进程进行检查和修改,然后让子进程继续运行。

ptrace的使用

0x01 函数的原型

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

各个参数的意思

request 表示要操作的类型
pid 目标进程的pid
addr 要监控的目标内存地址
data 存放读出或者写入的数据

request操作的类型及其意义

PTRACE_TRACEME:中文意思是跟踪我,这个是子进程唯一能够使用的request参数,其他的都是由跟踪者来使用。跟踪者向被跟踪者使用ptrace函数时,request除了PTRACE_SEIZE, PTRACE_INTERRUPT, PTRACE_KILL之外他的参数会导致被跟踪的进程停止。

PTRACE_ATTACH:调用者成为tracer,pid指定的进程成为tracee。然后tracee会被发送一个SIGSTOP信号,但是tracee并不一定会在这个调用完成时停止,使用waitpid来等待tracee停下来。

PTRACE_SEIZE:像PTRACE_ATTACH附着进程,但它不会让tracee暂停,addr参数须为0,data参数指定一位ptrace选项。

PTRACE_PEEKTEXT, PTRACE_PEEKDATA:从addr指定的地址中读取一个字,读取的结果作为这个函数的返回值。

PTRACE_POKETEXT, PTRACE_POKEDATA:往addr指定的地址中写入一个字。trcaee的内存值被修改。

PTRACE_GETREGS, PTRACE_GETFPREGS:将tracee的通用寄存器或浮点寄存器分别复制到tracer的内存地址中。

PTRACE_SETREGS, PTRACE_SETFPREGS:将tracer中指定的数据复制到tracee里的寄存器

PTRACE_CONT:重新启动已停止的 tracee 进程。 如果数据不为零,则它被解释为要传递给被跟踪者的信号数; 否则,不传递任何信号。

寄存器结构体定义

struct user_regs_struct
{
  unsigned long r15;
  unsigned long r14;
  unsigned long r13;
  unsigned long r12;
  unsigned long rbp;
  unsigned long rbx;
  unsigned long r11;
  unsigned long r10;
  unsigned long r9;
  unsigned long r8;
  unsigned long rax;
  unsigned long rcx;
  unsigned long rdx;
  unsigned long rsi;
  unsigned long rdi;
  unsigned long orig_rax;
  unsigned long rip;
  unsigned long cs;
  unsigned long eflags;
  unsigned long rsp;
  unsigned long ss;
  unsigned long fs_base;
  unsigned long gs_base;
  unsigned long ds;
  unsigned long es;
  unsigned long fs;
  unsigned long gs;
};

其他的更多的参数j及其说明查看ptrace文档

posted @ 2023-03-12 16:11  比翼飞  阅读(362)  评论(0编辑  收藏  举报