c++ - 保存 ptrace() PTRACE_POKEDATA 调用的变化

标签 c++ operating-system ptrace

我正在使用 ptrace(PTRACE_POKETEXT, pid, addr, (orig ^ flip_mask)); 来更改实时进程的数据,但是一旦调用终止,更改就会发生已经消失,是否有可能在终止 ptrace 调用后永久保留 PTRACE_POKETEXT 更改?

void run_pro1 (pid_t child_pid) {
    srand(time(0));    
    int wait_status;
    unsigned icounter = 0;
    procmsg("debugger started\n");
    wait(&wait_status); 
    while (WIFSTOPPED(wait_status)) {
        icounter++;
        struct user_regs_struct regs;
        ptrace(PTRACE_GETREGS, child_pid, 0, &regs);       
        unsigned instr = ptrace(PTRACE_PEEKTEXT, child_pid,  regs.rax , 0);      
        unsigned *instr3 ;
        instr3 = &instr;                           
        unsigned instr2 = instr ^ (1UL << (1 << (rand()%32)));         
        ptrace(PTRACE_POKETEXT, child_pid, instr, instr2);        
        unsigned *instr4 ;
        instr4 = &instr2;        
        cout<<"addrctn="<< *instr3 <<endl;
        cout<<"addrctn="<< *instr4 <<endl; 
       if (ptrace(PTRACE_SINGLESTEP, child_pid, 0, 0) < 0) {
            perror("ptrace");
            return;
        }        /* Wait for child to stop on its next instruction */
        ptrace(PTRACE_CONT, child_pid, 0, 0);
        wait(&wait_status);             //break;      
    }   
    procmsg("the child executed %u instructions\n", icounter);
}

最佳答案

我认为,您的主要问题是您调用了两次 ptrace。第一次传递给它 PTRACE_SINGLESTEP 时,告诉它只继续一条指令。然而,紧接着,您调用 PTRACE_CONT,它告诉它继续直到下一个信号。最终结果是您的程序根本不会单步执行。它只是运行。

您的代码存在一些次要问题。首先是您总是以零作为信号参数调用这两个函数。实际上,您是在屏蔽来自程序的信号。

此外,您正在调用 PEEK 和 POKE TEXT,并将其存储在名为“instr”的变量中。所有这些都没有任何区别,但它们表明你认为你正在处理指令。您从中读取的内存来自 rax,它很少指向指令,而且可能通常根本不指向任何映射。这也意味着您可能正在做与您认为正在做的事情不同的事情,这可能是您出现问题的原因。

关于c++ - 保存 ptrace() PTRACE_POKEDATA 调用的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40791120/

相关文章:

c++ - 父进程的父进程 ID - Linux

linux - 使用 ptrace 设置 RIP 的奇怪行为

multithreading - 使用ptrace在多线程应用程序中检测linux调试器

c - 在开始时停止子进程

c++ - 如何在 FASM 上同时使用 Assembly 和 C/C++ 进行开发?

c++ - MKL 矩形矩阵就地转置 : not using multiple cores?

c++ - Trying Favorite Tries : Radix, 后缀,和哈希!甚至三元组,天哪!

c++ - 循环帮助 : string vector to 3D char vector

c++ - 如何编写监听网络流量的程序? (即 wireshark)

c - 桌面环境是一个自定义操作系统