首先介绍一下ptrace:
ptrace提供了一种使父进程得以监视和控制其它进程的方式,它还能够改变子进程中的寄存器和内核映像,因而可以实现断点调试和系统调用的跟踪。
使用ptrace,你可以在用户层拦截和修改系统调用(sys call)
我们以一个实例为例:
运行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 便可以运行成功。
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 便可以运行成功。