我正在尝试在自己的进程中监视/重定向系统调用。当fwrite
在libc中调用write
时,LD_PRELOAD不起作用,并且/ plt挂钩似乎有同样的问题。我正在寻找一个基于ptrace的解决方案,但我不能fork()并且作为一个孩子运行主应用程序,因为应用程序通过信号与其父进行通信。
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并且跟踪器需要wait()。由于在这种情况下关系是反转的(跟踪器是tracee的子代),PTRACE_SYSCALL返回ESRCH。
strace如何通过追踪现有的pid来逃脱?
答案 0 :(得分:0)
我有点不清楚你究竟在这里问什么。听起来你已经解决了附加部分(这是最难解决的问题)。如果是这种情况,那么让流程停止不是问题。只需向进程发送信号即可。该过程将停止并向您发送TRAP,以便您可以决定如何处理信号。此时,您可以拨打ptrace(PTRACE_SYSCALL, pid, 0, 0)
。这将在SYSCALL跟踪模式下启动,并防止您的信号到达debugee(因此不会在进程中引入意外信号)。