本系列文章将对ptrace系统调用的强大功能进行详细分析和验证,通过本系列文章,可以深入理解ptrace的实现原理和使用方法,之后编写自己的编译器就不在话下了。
我们首先以一个简单的例子作为入门。‘CTRL+C’这个快捷键我们再熟悉不过了。在正常情况下,我们向一个正常的进行发送‘CTRL+C’ 即SIGINT信号,程序就会停止运行。但是,如果我们在程序中加入ptrace系统调用之后,‘CTRL+C’这个信号就不能让进程终止(terminated),而是让进程暂停(stopped)。
程序一:
child1:
#include "ptrace.h"
void main()
{
ptrace(PTRACE_TRACEME,NULL,0,0);
while (1);
}
本系列所有的头文件我们都在“ptrace.h”中定义
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/user.h> /* For struct user_regs_sturct */
#include <sys/syscall.h> /* For SYS_write etc */
#include <sys/reg.h> /* For constants ORI_EAX etc */
编译程序并运行
#gcc list1.c -o list1.o
#./list1.o
从上面的程序中我们可以看到,这个程序其实啥也没做,就是一个死循环,此时我们输入'CTRL+C'。然后查看进程的状态
#ps -ax