Linux 关于 ptrace 断点查看寄存器的值
最近,闲来无聊,在深度研究, linux'ptrace遇到一条指令 if ((hander.symaddr = lookup_symbol(&hander, hander.symname)) == 0) { printf("Unable to find symbol: %s not found in executable\n",
hander.symname);
exit(-1);
}
// 关闭文件
close(fd);
// 创建一个子线程
if ((pid = fork()) < 0) {
perror("fork");
exit(-1);
}
if (pid == 0) {
// 子线程,附加进程 ,子线程
if (ptrace(PTRACE_TRACEME, pid, NULL, NULL) < 0) {
perror("PTRACE_TRACEME");
exit(-1);
}
// 启动可执行文件
execve(hander.exec, args, envp);
exit(0);
}
// wait 调用后 ,就会这里阻塞,等待,fork 的子线程结束 ,否则就一直阻塞在这里 ..
wait(&status);
printf("status= %d\n",status);
//拿到,函数地址
printf("Beginning analysis of pid: %dsymaddr= %lx\n", pid, hander.symaddr);
// 从内存中,读取 代码段内容
//
if ((orig = ptrace(PTRACE_PEEKTEXT, pid, hander.symaddr, NULL)) < 0) {
perror("PTRACE_PEEKTEXT");
exit(-1);
}
// 安装一个陷阱
// prig 里面,保存着 相关的 指令机器码
printf("orig=%lx \n ",orig);
// 产生一个异常
trap = (orig & ~0xff) | 0xcc;
printf("orig cc=%lx \n ",orig);
可以正确跟踪 比如 myprinf 函数,入口地址 ,
并且可以 把函数的 机器码打印出来
其中疑惑的是
trap = (orig & ~0xff) | 0xcc;指令是不是可以理解为,把 指令替换为 0xcc 这里,产生一个异常
然而这条指令执行后 ,我在答应 trap的值 ,程序的机器码没有发生改变 ,这是什么原因导致的呢
页:
[1]