2012-03-21 144 views
8

上PTRACE(最近的5個問題是我的:()發佈了很多問題後,我終於得到了所需的輸出,當我更換ptrace(PTRACE_PEEKUSER)和ptrace(PTRACE_PEEKDATA)之間的區別?

reg_val [1] = ptrace的(PTRACE_PEEKDATA,兒童,4 * EBX ,NULL);

reg_val [1] = ptrace的(PTRACE_PEEKUSER,兒童,4 * EBX,NULL);

在手冊頁中提到的區別是這樣

  • peektext在孩子的記憶位置地址讀一個字。
  • peekuser在孩子的USER區域的offset addr處讀取一個單詞。
    我無法從手冊頁單獨瞭解這種差異。任何人都可以在這方面進一步教育我嗎?

回答

14

PTRACE_PEEKDATA用於讀取兒童的數據/代碼部分(一般過程)。如你所知,調試器是一個使用ptrace的人,他們可以使用這個調用來檢查變量的值。例如,在GDB/DBX,如果你說

print count 

調試器將內部調用ptracePTRACE_PEEKDATA,發現它的價值。

PTRACE_PEEKUSER是讀取兒童的USER區域的內容,其中包含寄存器和其他信息的內容。 sys/user.h列出了什麼是其他信息。

例如用戶區包含,

struct user_regs_struct 
{ 
    long int ebx; 
    long int ecx; 
    long int edx; 
    long int esi; 
    long int edi; 
    long int ebp; 
    long int eax; 
    long int xds; 
    long int xes; 
    long int xfs; 
    long int xgs; 
    long int orig_eax; 
    long int eip; 
    long int xcs; 
    long int eflags; 
    long int esp; 
    long int xss; 
}; 

總之,PTRACE_PEEKDATA爲節目數據(變量等)和代碼和PTRACE_PEEKUSER是對於像寄存器值和其他調試信息。

+0

'PTRACE_PEEKDATA是用於像寄存器值和其他調試信息的東西。' 是不是ebx,ecx寄存器值:哦,我是這麼想的。通過註冊你是什麼意思? 'EIP'(指令指針)?? – 2012-03-21 12:04:41

+0

抱歉的錯字。我糾正了它。 ** PTRACE_PEEKUSER **用於寄存器和** NOT ** ** PTRACE_PEEKDATA ** – 2012-03-21 12:08:26

+0

您的最後一句話令我困惑(是否是錯字?)。你說peekdata是用於程序數據。與達特好。現在再說你說peekdata是寄存器!你是不是指peekuser? – 2012-03-21 12:10:26

1

PTRACE_PEEKDATA:在tracee的memory的地址addr處讀一個字。

PTRACE_PEEKUSER:在tracee的USER的偏移量addr處讀一個字。

PTRACE_PEEKDATA:使用地址來讀取stackheap數據。

PTRACE_PEEKUSER:使用偏移量讀取USER區域數據。

  • 實際上,它讀取了user_regs_struct結構中的一個元素。