Я использую ptrace(PTRACE_POKETEXT, pid, addr, (orig^flip_mask));
, чтобы изменить данные в реальном времени, но как только вызов прекращается, изменения, которые были сделаны, исчезнут, можно ли сохранить PTRACE_POKETEXT
постоянно меняется даже после завершения вызова ptrace
?Сохраните изменения ptrace() PTRACE_POKEDATA вызов
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);
}
Изменения не должны исчезать. – Barmar
Единственная причина, по которой он исчезнет, состоит в том, что процесс, который вы ткнули, переназначил переменную. Для предотвращения этого вам придется изменить код процесса. – Barmar
Можете ли вы показать код процесса, который вы трассируете, и как вы используете 'ptrace'? – Barmar