Я пытаюсь контролировать/перенаправлять системные вызовы в моем собственном процессе. 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?