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

0

Я пытаюсь использовать 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), но после завершения программы я ничего не получил. Может ли кто-нибудь объяснить мне об этом?

  • 1
    Подожди, значит, ты разветвляешься, ждешь , когда ребенок закончит , проследит его после того, как он закончит , а потом ptrace что ptrace не показывает, что он разветвляется?
  • 0
    Это моя вина. код "ptrace (PTRACE_TRACEME, 0, NULL, NULL);" должны быть добавлены. Я хочу поймать системный вызов fork, когда "pid_t t = fork ()." казнены.
Теги:
ptrace

1 ответ

1

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

if (WIFEXITED(status)) break;

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

См. Это выражение.

  • 0
    извините за мою ошибку. "ptrace (PTRACE_TRACEME, 0, NULL, NULL);" должны быть добавлены в программу. Когда «pid_t t = fork ()» выполняется, функция wait4 () не блокирует родительский процесс, а затем я использую «ptrace (PTRACE_PEEKUSER, pid, 4 * ORIG_EAX, NULL);» чтобы получить системный вызов。

Ещё вопросы

Сообщество Overcoder
Наверх
Меню