您的位置:首页 > 运维架构 > Linux

Linux ptrace 用法详解

2015-06-09 16:04 495 查看
#include <sys/ptrace.h>

long ptrace(enum __ptrace_request request, pid_t pid,
void *addr, void *data);
通过ptrace()这个系统调用,可以让一个进程去观察并且改变另外一个进程的行为,同时监测内存和寄存器.主要被用于断点调试以及系统调用的trace.
黑客也常用用它来做一些其他的工作,如hook
首先,tracee需要被tracer attach.附加和命令序列是针对每一个线程来说的,在一个多线程的进程中,每个线程都可以被独立的附加上一个不同的tracer,或者不被附加.这样的情况下,tracee意味着一个线程,不是一个多线程的进程.Ptrace命令是通过下面个调用发送给tracee
ptrace(PTRACE_foo,pid,...)
这里的pid是相关linux线程的ID.也就是在/proc/%d/task/ ,这个文件下的id号
当tracee被跟踪时,每发送一个信号,tracee都会暂停,即使这个信号会被忽略(除非是SIGKILL,这个会是tracee停止).tracer将会在下次waitpid(2)系统调用的时候被通知.该waitpid调用会返回一个status值,该值中包含让tracee停止的信息.当tracee停止的时候,tracer可以通过多种ptrace调用来修改tracee,然后tracer让tracee继续执行,可以有选择的忽略信号,甚至传递一个不同的信号.
后面看过linux内核才知道,对于linux来说,没有什么进程之说(不准确)。在linux内核中,只存在一种最小的执行单位,暂且叫做线程吧,如果多个线程有一个共同的进程组,那么他们就组成了一个进程。
 在其他系统中,如windows,线程就是跟进程的实线机制不一样,是一种比进程轻量的执行单位。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: