Ptrace父进程

时间:2016-07-04 12:59:04

标签: linux fork posix strace ptrace

我正在尝试在自己的进程中监视/重定向系统调用。当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来逃脱?

1 个答案:

答案 0 :(得分:0)

我有点不清楚你究竟在这里问什么。听起来你已经解决了附加部分(这是最难解决的问题)。如果是这种情况,那么让流程停止不是问题。只需向进程发送信号即可。该过程将停止并向您发送TRAP,以便您可以决定如何处理信号。此时,您可以拨打ptrace(PTRACE_SYSCALL, pid, 0, 0)。这将在SYSCALL跟踪模式下启动,并防止您的信号到达debugee(因此不会在进程中引入意外信号)。