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("%dn", syscall);
            ptrace(PTRACE_SYSCALL, pid, NULL, NULL);
        }
    }
    return 0;
}

在我看来,程序应该打印“2”来屏幕(因为系统调用“fork”id是2),但是程序结束后我什么也没有得到。 有人能解释我吗?


如果你的程序正常退出,那么

if (WIFEXITED(status)) break;

这个语句可能会导致不打印2,因为它将它从循环中取出。

请看这个声明。

链接地址: http://www.djcxy.com/p/66375.html

上一篇: how does ptrace catch fork's system call?

下一篇: PTrace Not Recognizing Child Process