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