2016-11-24 9 views
1

Я использую 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, &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); 
} 
+0

Изменения не должны исчезать. – Barmar

+0

Единственная причина, по которой он исчезнет, ​​состоит в том, что процесс, который вы ткнули, переназначил переменную. Для предотвращения этого вам придется изменить код процесса. – Barmar

+0

Можете ли вы показать код процесса, который вы трассируете, и как вы используете 'ptrace'? – Barmar

ответ

1

Ваша основная проблема, я думаю, в том, что вы дважды вызываете ptrace. В первый раз вы передаете его PTRACE_SINGLESTEP, в котором говорится, что он продолжит только одну инструкцию. Сразу же после этого вы вызываете PTRACE_CONT, в котором говорится, чтобы он продолжался до следующего сигнала. Конечным результатом является то, что ваша программа не имеет отдельного шага. Он просто бежит.

Есть пара вторичных проблем с вашим кодом. Во-первых, вы всегда вызываете эти две функции с нулем в качестве аргумента сигнала. Эффективно, вы маскируете сигналы из программы.

Кроме того, вы вызываете PEEK и POKE TEXT и сохраняете это в переменной под названием «instr». Все это не имеет никакого значения, но они предполагают, что вы считаете, что имеете дело с инструкциями. Память, которую вы читаете, это от rax, которая редко указывает на инструкции и часто может не указывать на что-либо отображаемое вообще. Это также означает, что вы, вероятно, делаете что-то другое, чем то, что, по вашему мнению, вы делаете, что является вероятной причиной вашей проблемы.

+0

Уважаемый Шачар, не могли бы вы напишите ваши предложения в коде, действительно оцените, потому что я попробовал то, что вы сказали, но все же дочерний процесс не показывает никаких изменений. –

1

Аргументы POKETEXT являются неправильными. Третий аргумент должен быть адресом, но вы дали instr, который является старым значением, а не адресом, с которого он был прочитан. Для того, чтобы заменить значение, которое вы читаете, это должно быть:

ptrace(PTRACE_POKETEXT, child_pid, regs.rax, instr2); 

Schachar Шемеш также имеет хорошие моменты в своем ответе, но я думаю, что это решает конкретную проблему, вы просили о.

+0

Дорогой Бармар, я попробовал ваше предложение, но все же изменения не были сохранены, ребенок процесс запускается без проблем –

+0

Я не знаю, для чего используется регистр RAX', вы уверены, что это правильный адрес? – Barmar

+0

Я попытался изменить следующие регистры: AL/AH/AX/EAX/RAX: Аккумулятор BL/BH/BX/EBX/RBX: базовый индекс (для использования с массивами) CL/CH/CX/ECX/RCX: Счетчик (для использования с циклами и строками) DL/DH/DX/EDX/RDX: Увеличьте точность аккумулятора (например, объедините 32-разрядные EAX и EDX для 64-разрядных целых операций в 32-битном коде) .CS: Код DS: данные SS: Stack ES: Дополнительные данные FS: Дополнительные данные # 2 GS: Дополнительные данные # 3 –