【发布时间】:2013-12-24 18:16:50
【问题描述】:
我尝试使用 ptrace 来捕获子进程系统调用 id,例如 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),但是程序完成后我什么也没得到。 有人可以解释一下吗?
【问题讨论】:
-
等等,所以你正在分叉,等待孩子完成,完成后跟踪它,然后惊讶
ptrace不显示分叉? -
这是我的错。代码“ptrace(PTRACE_TRACEME, 0, NULL, NULL);”应该添加。我想在“pid_t t = fork()”时捕获 fork 系统调用。执行。