#include #include #include #include #include #define ORIG_EAX 0x80 // x86架构下,ORIG_EAX寄存器的偏移值 void trace_syscall(pid_t child_pid) { int status; // 启动子进程并开始调试 waitpid(child_pid, &status, 0); // 等待子进程停止 while (1) { // 让子进程在每个系统调用中断 ptrace(PTRACE_SYSCALL, child_pid, NULL, NULL); // 等待系统调用返回 waitpid(child_pid, &status, 0); // 获取系统调用号 long syscall_number = ptrace(PTRACE_PEEKUSER, child_pid, 4 * ORIG_EAX, NULL); // 打印系统调用号 printf("系统调用号:%ld\n", syscall_number); // 如果子进程终止,退出循环 if (WIFEXITED(status)) { break; } } } int main() { pid_t child_pid = fork(); // 创建子进程 if (child_pid == 0) { // 子进程: 执行一个简单的系统调用(例如exit) ptrace(PTRACE_TRACEME, 0, NULL, NULL); execlp("ls", "ls", NULL); // 子进程执行 ls 命令 } else { // 父进程: 跟踪子进程 trace_syscall(child_pid); } return 0; }