微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ptrace() 获取存储在位置

如何解决Ptrace() 获取存储在位置

我目前正在开发一个程序,该程序使用 ptrace 在给定的十六进制地址处放置断点,然后可以选择单步执行、继续或打印当前地址处的数据。这是我当前的代码

int main(int argc,char **argv)
{
    if(argc < 2)
    {
        printf("Enter parameter");
        return 0;
    }

    pid_t child = fork();
    if(child == 0){
        ptrace(PTRACE_TRACEME,NULL,NULL);
        char* proc_path = strdup(argv[1]);
        if(proc_path == NULL){
            return 0;
        }
        const char *args2 = NULL;
        execl(proc_path,args2,NULL);
    }
    else if(child > 0){
       // struct user_regs_struct uregs;
        long address = 0;
        size_t read;
        size_t size = 0;
        char* line = NULL;
        long data = 0;
        long orig_data = 0;
        int word;
        while(1) {
            read = getline(&line,&size,stdin);
            if(read <= 0){
                break;
            }
            switch(line[0])
            {
                case 'b':
                   // ptrace(PTRACE_GETREGS,child,&uregs);
                   // printf("ebx = %p\n",&uregs.rbx);
                    read = getline(&line,stdin);
                    if(read < 1){
                        break;
                    }
                    address = strtol(line,16);
                    data = ptrace( PTRACE_PEEKTEXT,(void *)address,NULL );
                    orig_data = data;
                    data = (data & ~0xff) | 0xcc;
                    ptrace( PTRACE_POKETEXT,data );
                    break;
                case 's':
                    ptrace(PTRACE_SINGLESTEP,NULL);
                    break;
                case 'c':
                    ptrace(PTRACE_CONT,NULL);
                    break;
                case 'p':
                    word = ptrace(PTRACE_PEEKTEXT,(void*)address,NULL);
                    printf("%i",word);
                    break;
                default:
                    break;

            }
        }


    }
    else{
        printf("error/n");
    }
    return 0;
}

总的来说,我对 C 和 Linux 还很陌生,但我认为我的 continue 和 single step 函数应该按预期工作,断点也应该如此。我在对我的程序进行故障排除时遇到了麻烦,因为我不知道如何获取我的程序的起始地址以在那里放置断点(我已经尝试在我的测试程序中打印位置,但我假设有更好的方法做)。同样,我希望在提取“p”情况下的数据方面得到一些帮助,我只想在当前位置获取值。我知道这里有抵消和其他障碍,但没有运气试图克服它们。如果有人能将我推向正确的方向,我将不胜感激。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。