2016-07-04 3 views
0

J'essaie de surveiller/rediriger les appels système dans mon propre processus. LD_PRELOAD ne fonctionne pas lorsque fwrite appelle write à l'intérieur de la libc, et les hooks de/plt semblent avoir le même problème. Je suis à la recherche d'une solution basée sur ptrace, mais je ne peux pas fork() et exécuter l'application principale en tant qu'enfant car l'application communique avec ses parents via des signaux.Processus parent Ptrace

Il y a un fil à partir de 2006 qui suggère le traceur peut être un groupe de threads qui est différent du Tracee, mais il ne semble pas fonctionner dans la pratique: 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);   
    } 
} 

Le problème que je suis facing est que ptrace (PTRACE_SYSCALL) attend que le tracee soit dans l'état ptrace-wait, c'est-à-dire qu'il doit avoir levé SIGSTOP et le traceur doit attendre() pour cela. Puisque la relation est inversée dans ce cas (tracer est l'enfant de la tracee) PTRACE_SYSCALL renvoie ESRCH.

Comment strace échapper à traquer un pid existant?

Répondre

0

Je ne sais pas exactement ce que vous demandez ici. Il semble que la pièce jointe soit résolue (ce qui est le problème le plus difficile à résoudre). Si tel est le cas, l'arrêt du processus n'est pas un problème. Envoyez simplement le processus un signal. Le processus s'arrêtera et vous enverra un TRAP afin que vous puissiez décider quoi faire avec le signal. À ce stade, vous pouvez appeler ptrace(PTRACE_SYSCALL, pid, 0, 0). Cela va à la fois le démarrer en mode de trace SYSCALL, et empêcher votre signal d'arriver chez le débugué (donc ne pas introduire de signaux inattendus dans le processus).