#include <stdio.h>
#include <sys/ptrace.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/reg.h>
int main(int argc, char *argv[])
{
pid_t pid = fork();
if(pid < 0)
{
printf("fork failed\n");
exit(-1);
}else if(pid == 0){
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
execve(argv[1], NULL, NULL);
} else {
int status;
int bit;
long num;
long ret;
wait(&status);
if(WIFEXITED(status))
{
return 0;
}
num = ptrace(PTRACE_PEEKUSER, pid, ORIG_RAX * 8, NULL);
printf("system call num = %ld\n", num);
ptrace(PTRACE_SYSCALL, pid, NULL, NULL);
while(1){
wait(&status);
if(WIFEXITED(status))
return 0;
if(bit){
num = ptrace(PTRACE_PEEKUSER, pid, ORIG_RAX * 8, NULL);
printf("system call num = %ld", num);
bit = 0;
}else {
ret = ptrace(PTREACE_PEEKUSER, pid, RAX * 8, NULL);
printf("system call return = %ld\n", ret);
bit = 1;
}
ptrace(PTRACE_SYSCALL, pid, NULL, NULL);
}
}
}
03-17