1.环境配置:
a.在终端输入ddd命令,打开ddd调试工具。然后打开上文的test_fork可执行文件。
注意 编译test_fork.c文件中,-g是将代码加入进去,便于ddd分析
b.如下图所示,右键函数开始执行处,加上断点。
c.在ddd中点击run命令,执行该程序。这样程序就会执行执行到断点处,下面开始分析程序。
2.首先查看现在寄存器的值。因为系统调用号是通过eax传递过去的,所以要监控eax寄存器的变化。
3.在fork+147处,eax寄存器发生改变。当执行到上图箭头所指命令时eax数值变为了0x78=120 ,通过查看系统调用表,发现对应的系统调用为sys_clone。
上图在箭头处进入了一个函数,执行stepi进入该函数
4.由下图可知进入了kernel_vsyscall的函数,继续跟踪这个函数,sysenter这个命令使函数由用户态进入到内核态。eax的寄存器的值为0x78
执行完sysenter后,fork函数执行执行到+16处,跳过了int 0x80中断。说明是通过sysenter快速系统调用进入得到的内核。
上述只是在用户态调试,并没有办法进入内核态去跟踪系统调用。要想继续跟踪,需要进入已经搭建好的环境进一步调试内核。
5.函数触发系统调用是通过调用libc里的封装例程syscall , 借助这个封装例程向内核发送系统调用号。终端中输入man syscall 来查看这个函数的功能。
文档下载地址:很全:http://download.csdn.net/detail/u014734779/7417169