как ptrace перехватывает системный вызов fork?

Я пытаюсь использовать ptrace для перехвата идентификатора системного вызова дочернего процесса, такого как execve (11) или fork (2).

мой код здесь.

#include <sys/syscall.h>
#include <sys/reg.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>

int main(){
pid_t pid;
if ((pid = fork()) == 0){
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
pid_t t = fork();
} else{
int status;
struct rusage resource;
while (true){
wait4(pid, &status, 0, &resource);
if (WIFEXITED(status)) break;
int syscall = ptrace(PTRACE_PEEKUSER, pid, 4 * ORIG_EAX, NULL);
if (syscall == SYS_execve) printf("%d\n", syscall);
ptrace(PTRACE_SYSCALL, pid, NULL, NULL);
}
}
return 0;
}

По моему мнению, программа должна вывести «2» на экран (потому что системный вызов «fork» id равен 2), но я ничего не получил после завершения программы.
Может кто-нибудь объяснить мне об этом?

0

Решение

Если ваша программа вышла нормально, то

if (WIFEXITED(status)) break;

это утверждение могло привести к тому, что он не печатал 2, поскольку выводит его из цикла.

Пожалуйста, посмотрите это утверждение.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]