我试图在我自己的进程中监视/重定向系统调用。当fwrite
在libc中调用write
时,LD_PRELOAD不起作用,而got/plt钩子似乎也有同样的问题。我正在寻找一个基于ptrace的解决方案,但是我不能fork()并且作为一个孩子运行主应用程序,因为应用程序通过信号与其父进行通信。Ptrace父进程
有从2006年的线程表明示踪剂可以在这从tracee不同的线程组,但它似乎并没有在实践中的工作:http://yarchive.net/comp/linux/ptrace_self_attach.html
pid = fork();
if (pid == 0) {
prctl(PR_SET_PTRACER, getppid());
raise(SIGSTOP);
} else {
sleep(1);
ptrace(PTRACE_SEIZE, pid, NULL, NULL);
for (;;) {
int status;
int ret = waitpid(pid, &status, 0);
warn("wait=%d:", ret);
ret = ptrace(PTRACE_SYSCALL, pid, NULL, NULL);
warn("ptrace=%d:", ret);
}
}
我的问题面对的是ptrace(PTRACE_SYSCALL)期望tracee处于ptrace-wait状态,即它必须引发SIGSTOP并且跟踪器需要等待()。由于在这种情况下关系是相反的(追踪者是追踪者的孩子)PTRACE_SYSCALL返回ESRCH。
strace如何逃脱跟踪现有的pid?