yutao531315 发表于 2021-6-30 17:53

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]
查看完整版本: Linux 关于 ptrace 断点查看寄存器的值