2016-07-04 4 views
0

Я пытаюсь контролировать/перенаправлять системные вызовы в моем собственном процессе. LD_PRELOAD не работает, когда fwrite вызывает write внутри libc, и у получателей/plt-крючков, похоже, такая же проблема. Я ищу решение на основе ptrace, но я не могу fork() и запустить основное приложение в качестве дочернего, потому что приложение связывается со своим родителем с помощью сигналов.Ptrace parent process

Существует поток с 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) ожидает, что трассировка будет находиться в состоянии ptrace-wait, т. е. должно быть поднято SIGSTOP, и трассирующему нужно ждать() для него. Так как отношение обращено в этом случае (трассировка является дочерним элементом трассировки) PTRACE_SYSCALL возвращает ESRCH.

Как спрятаться от трассировки существующего pid?

ответ

0

Я немного не понимаю, что именно вы здесь задаете. Похоже, что у вас есть часть крепления (которая является самой сложной проблемой для решения). Если это так, то процесс остановки не является проблемой. Просто отправьте процессу сигнал. Процесс остановится и отправит вам TRAP, чтобы вы могли решить, что делать с сигналом. На этом этапе вы можете позвонить ptrace(PTRACE_SYSCALL, pid, 0, 0). Это запустит его в режиме трассировки SYSCALL и не даст вашему сигналу получить сообщение от дебюта (таким образом, не вводя неожиданные сигналы в процесс).

Смежные вопросы