2016-11-24 51 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用於32位代碼中的64位整數運算).CS:代碼 DS:數據 SS:堆棧 ES:額外的數據 FS:額外的數據#2 GS:額外的數據#3 –