首先介紹一下ptrace:
ptrace提供了一種使父進程得以監視和控制其它進程的方式,它還能夠改變子進程中的寄存器和核心映像,因而可以實現斷點調試和系統調用的跟蹤。
使用ptrace,你可以在使用者層攔截和修改系統調用(sys call)
我們以一個執行個體為例:
#include <sys/ptrace.h>#include <sys/types.h>#include <sys/wait.h>#include <unistd.h> #include <linux/user.h> /* For constants ORIG_EAX etc */int main() { pid_t child; long orig_eax; child = fork(); if(child == 0) { ptrace(PTRACE_TRACEME, 0, NULL, NULL); execl("/bin/ls", "ls", NULL); } else { wait(NULL); orig_eax = ptrace(PTRACE_PEEKUSER, child, 4 * ORIG_EAX, NULL); printf("The child made a " "system call %ld ", orig_eax); ptrace(PTRACE_CONT, child, NULL, NULL); } return 0;}
運行gcc -o xxxx xxxx.c 之後報<linux/user.h> no such file...這個錯誤提示。
錯誤形成的原因是因為核心結構的變化使得原先/usr/include/linux/user.h消失而是變為了/usr/include/sys/reg.h
因此,調試的時候需要將 #include linux/user.h> 這句變為 #include <sys/reg.h>
當然修改之後還是會報錯,原因是因為64位的寄存器結構和32位不同,解決方案是將ORIG_EAX改為ORIG_RAX便可以運行成功。