2016-07-04 3 views
0

내 자신의 프로세스에서 syscall을 모니터/리디렉션하려고합니다. fwrite이 libc 안에 write을 호출 할 때 LD_PRELOAD가 작동하지 않으며/plt 후크에 같은 문제가있는 것 같습니다. ptrace 기반의 솔루션을 찾고 있지만 응용 프로그램이 신호를 통해 부모와 통신하기 때문에 fork() 및 기본 응용 프로그램을 자식으로 실행할 수 없습니다.Ptrace 상위 프로세스

거기 tracee는 다릅니다 스레드 그룹에있을 수있는 추적을 제안 2006 스레드이지만 실제로는 작동하지 않습니다 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)는 트레이스가 ptrace-wait 상태에있을 것으로 예상합니다. 즉, 트레이스가 SIGSTOP을 발생시켜 트레이서가 기다려야합니다. PTRACE_SYSCALL은 ESRCH를 반환합니다.이 경우 travers는 트레이스의 자식입니다.

strace는 기존 PID 추적 기능을 어떻게 사용합니까?

답변

0

나는 정확히 여기서 무엇을 묻고 있는지 약간 불분명하다. 연결 부분이 해결 된 것 같습니다 (해결하기가 가장 어려운 문제 임). 그렇다면 프로세스를 중지시키는 것이 문제가되지 않습니다. 프로세스에 신호를 보냅니다. 프로세스가 중지되고 트랩을 보내면 신호로 수행 할 작업을 결정할 수 있습니다. 이 시점에서 ptrace(PTRACE_SYSCALL, pid, 0, 0)으로 전화 할 수 있습니다. 이것은 SYSCALL 추적 모드에서 시작하여 신호가 debugee에 도착하는 것을 방지합니다 (따라서 예상치 못한 신호가 프로세스로 유입되지 않도록합니다).