2016-07-04 31 views
0

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

回答

0

我有点不清楚你到底在问什么。这听起来像你有解决附件(这是最难解决的问题)。如果是这种情况,那么让流程停止并不是问题。只需发送过程一个信号。该过程将停止并向您发送TRAP,以便您可以决定如何处理信号。此时您可以拨打ptrace(PTRACE_SYSCALL, pid, 0, 0)。这将在SYSCALL跟踪模式下启动它,并且阻止你的信号到达恶人(因此不会在过程中引入意外的信号)。