本文分析一下父进程通过ptrace系统调用查看子进程寄存器的情况。
首先附上源码:
list6.c
#include "ptrace.h"
void main()
{
int i=0,status=0,pid;
struct user_regs_struct uregs;
if((pid=fork())==0){
ptrace(PTRACE_TRACEME,0,0,0);
execl("/root/child3.o","child3.o",0);
printf("exec error!\n");
}
else{
wait(&status);//子进程执行exec系统调用的时候会被唤醒。
ptrace(PTRACE_CONT,pid,0,0);
sleep(1);
kill(pid,SIGINT);//向子进程发送SIGINT让子进程暂停
wait(&status);//子进程暂停之后,该wait被唤醒
ptrace(PTRACE_GETREGS,pid,0,&uregs);
printf("ebx=%d\n",uregs.ebx);
uregs.ebx=245;
ptrace(PTRACE_SETREGS,pid,0,&uregs);
ptrace(PTRACE_CONT,pid,0,0);//修改寄存器值成功之后,让子进程继续。
}
}
child3.c
#include "ptrace.h"
void main()
{
printf("child 3 starts...\n");
asm("pushl %ebx\n\t"
"movl