ptrace系统调用的基本原理是通过操作系统提供的接口,以PTRACE_ATTACH参数追踪目标进程,并以PTRACE_GETREGS、PTRACE_SETREGS、PTRACE_PEEKDATA、PTRACE_POKEDATA、PTRACE_SINGLESTEP、PTRACE_CONT等参数读取和修改目标进程的状态、内存和执行。具体步骤如下:ptrace启动跟踪子进程:ptrace系统调用以PTRACE_TRACEME参数启动一个子...
PTRACE_GETREGS PTRACE_SETREGS 取得寄存器的值 struct user_regs_struct regs; ptrace(PTRACE_GETREGS , int pid , NULL , & regs); 设置寄存器的值 struct user_regs_struct regs; ptrace(PTRACE_SETREGS , int pid , NULL , & regs); struct user_regs_struct { unsigned long bx; unsigned long cx; ...
PTRACE_GETFPREGS, PTRACE_SETREGS, PTRACE_SETFPREGS, PTRACE_CONT, PTRACE_SYSCALL, PTRACE_SINGLESTEP, PTRACE_DETACH 本文接下来会解释这些参数有什么不同的地方。 读取系统调用的参数 通过调用ptrace并传入PTRACE_PEEKUSER作为第一个参数,我们可以检查子进程中,保存了该进程的寄存器的内容(及其它一些内容)的用户态...
如下所示,为读取和写入寄存器值的 ptrace 调用,request 参数分别为PTRACE_GETREGS和PTRACE_SETREGS,pid为对应进程的 ID ptrace(PTRACE_GETREGS,pid,NULL,regs);ptrace(PTRACE_SETREGS,pid,NULL,regs); regs 结构体 在ARM 处理器下,ptrace 的 data 参数的 regs 为pt_regs结构的指针,从远程进程获取的寄存器值将存...
ptrace(PTRACE_SETOPTIONS,pid,0,PTRACE_O_EXITKILL); 1. 剩余部分就是一个简单的、无休止的循环了,每循环一次捕获一个系统调用。循环体总共有四步: 等待进程进入下一个系统调用。 输出系统调用的一个描述。 允许系统调用去运行并等待返回。 输出系统调用返回值。
(PTRACE_SYSCALL, tracee_pid, NULL, NULL) waitpid(tracee_pid, 0, 0) ptrace(PTRACE_GETREGS, tracee_pid, 0, ®s) if (regs.orig_rax == 39) { // 已执行getpid系统调用,恢复tracee状态 ptrace(PTRACE_SETREGS, tracee_pid, NULL, &old_regs) break }}// 恢复tracee运行ptrace(PTRACE_DETACH, ...
上面的 PTRACE_GETREGS , PTRACE_SETREGS , 读写的寄存器 是 执行 主线程 的 CPU 的 寄存器 ; 5、单步调试 PTRACE_SYSCALL :每当发生系统调用时, 被调试进程暂停 , 将控制权交还给调试进程 ; PTRACE_SINGLESTEP :每当执行一条指令时 , 被调试进程暂停 , 将控制权交还给调试进程 ; 单步调试 ; ...
如下所示,为读取和写入寄存器值的ptrace调用,request参数分别为PTRACE_GETREGS和PTRACE_SETREGS,pid为对应进程的ID。 ptrace(PTRACE_GETREGS, pid, NULL, regs); ptrace(PTRACE_SETREGS, pid, NULL, regs); 在ARM处理器下,data参数的regs为pt_regs结构的指针,从远程进程获取的寄存器值将存储到该结构中,pt_regs结...
*/ int blocked = 0; if (is_syscall_blocked(regs.orig_rax)) { blocked = 1; regs.orig_rax = -1; // set to invalid syscall ptrace(PTRACE_SETREGS, pid, 0, ®s); } /* Run system call and stop on exit */ ptrace(PTRACE_SYSCALL, pid, 0, 0); waitpid(pid, 0, 0); if (...
#define PTRACE_SETFPXREGS 19 #define PTRACE_SETOPTIONS 21 由于ptrace() 提供的操作比较多,所以本文只会挑选一些比较有代表性的操作进行解说,比如 PTRACE_TRACEME、PTRACE_SINGLESTEP、PTRACE_PEEKTEXT、PTRACE_PEEKDATA 和 PTRACE_CONT 等,而其他的操作,有兴趣的朋友可以自己去分析其实现原理。