我正在使用 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, ®s);
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/