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指被追踪、被观察的进程。