好友
阅读权限20
听众
最后登录1970-1-1
|
最近,闲来无聊,在深度研究, linux' ptrace
遇到一条指令 [Asm] 纯文本查看 复制代码 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: %d symaddr= %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的值 ,程序的机器码没有发生改变 ,这是什么原因导致的呢
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|