进程跟踪
long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
Linux用ptrace来进行进程跟踪,就跟我们平时用GDB debug一样,它允许一个进程去跟踪和控制另外一个进程。当被跟踪进程有信号发生时,被跟踪进程会被暂停下来,
其内存空间变得可读写,跟踪它的进程可以选择是否忽略该信号和让程序继续进行。被跟踪进程无论是进行系统调用还是从系统调用返回时,跟踪它的进程都可以来处理该
系统调用,比如检查或修改调用参数,修改寄存器和向代码段插入新的代码等。
requset参数:用于表示该次ptrace的类型,有很多种:
PTRACE_TRACEME
本进程被其父进程所跟踪。其父进程应该希望跟踪子进程。
PTRACE_PEEKTEXT, PTRACE_PEEKDATA
从内存地址中读取一个字节,内存地址由addr给出。
PTRACE_PEEKUSR
从USER区域中读取一个字节,偏移量为addr。
PTRACE_POKETEXT, PTRACE_POKEDATA
往内存地址中写入一个字节。内存地址由addr给出。
PTRACE_POKEUSR
往USER区域中写入一个字节。偏移量为addr。
PTRACE_SYSCALL, PTRACE_CONT
重新运行。
PTRACE_KILL
杀掉子进程,使它退出。
PTRACE_SINGLESTEP
设置单步执行标志
PTRACE_ATTACH
跟踪指定pid 进程。
PTRACE_DETACH
结束跟踪
Intel386特有:
PTRACE_GETREGS
读取寄存器
PTRACE_SETREGS
设置寄存器
PTRACE_GETFPREGS
读取浮点寄存器
PTRACE_SETFPREGS
设置浮点寄存器
pid参数:表示被跟踪的进程的pid
addr参数和data参数:因requset参数的不同而有不同的作用,比如request为PTRACE_POKETEXT,其表示向内存写入一个字节的数据,那么addr表示要写入的内存地址,
data则表示要写入的那一个字节。
ptrace是一个很复杂的topic,更多的可以参考这篇文章:Playing with ptrace: Part I, Part II