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文档