2012-03-21 17 views
8

ptrace (सबसे हाल 5 सवाल मेरे हैं :() पर सवाल का एक बहुत पोस्ट करने के बाद मैं अंत में वांछित आउटपुट मिला जब मैं प्रतिस्थापितptrace (PTRACE_PEEKUSER) और ptrace (PTRACE_PEEKDATA) के बीच अंतर?

reg_val [1] = ptrace (PTRACE_PEEKDATA, बच्चे, 4 * EBX , शून्य);

reg_val [1] = ptrace (PTRACE_PEEKUSER, बच्चे, 4 * EBX, शून्य के साथ

);

अंतर आदमी पेज में उल्लेख की तरह इस

  • peektext बच्चे की स्मृति में स्थान addr पर एक शब्द भी पढ़ता है।
  • peekuser बच्चे के USER क्षेत्र में ऑफसेट एडीआर पर एक शब्द पढ़ता है।
    मैं मैन पेज से अकेले इस अंतर को समझने में असमर्थ हूं। क्या कोई मुझे इस पर और अधिक शिक्षित कर सकता है ??

उत्तर

14

PTRACE_PEEKDATA (सामान्य रूप में प्रक्रिया) बच्चे के डेटा/कोड खंड को पढ़ने के लिए है। जैसा कि आप जानते हैं कि डिबगर्स वे हैं जो ptrace का उपयोग करते हैं, वे चर के मूल्यों की जांच करने के लिए इस कॉल का उपयोग कर सकते हैं। उदाहरण के लिए, GDB/DBX में, अगर आप कहते हैं कि

print count 

डिबगर आंतरिक PTRACE_PEEKDATA साथ ptrace लागू है और इसके मूल्य मिल जाएगा।

PTRACE_PEEKUSER बच्चे के उपयोगकर्ता क्षेत्र की सामग्री को पढ़ना है जिसमें रजिस्टरों और अन्य जानकारी की सामग्री है। 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 रजिस्टर मूल्यों और अन्य डिबग info.' EBX नहीं कर रहे हैं, ECX रजिस्टर मूल्यों जैसी चीजों के लिए है ?? : ओ मैंने ऐसा सोचा।रजिस्टरों द्वारा आपका क्या मतलब था? 'ईआईपी '(निर्देश सूचक) ?? –

+0

टाइपो के लिए खेद है। मैंने इसे सही किया। ** PTRACE_PEEKUSER ** रजिस्टरों के लिए है और ** नहीं ** ** PTRACE_PEEKDATA ** –

+0

आपकी आखिरी वाक्य मुझे भ्रमित कर रही है (क्या यह एक टाइपो है ??)। आपने कहा कि peekdata प्रोग्राम डेटा के लिए है। टैट के साथ ठीक है। अब आप कहते हैं कि पेकडाटा रजिस्टरों के लिए है !! क्या आपका मतलब पिक्यूसर था ?? –

1

PTRACE_PEEKDATA: पता addr पते पर एक शब्द को ट्रेससी memory में पढ़ें।

PTRACE_PEEKUSER: ट्रेससी USER में ऑफ़सेट addr पर एक शब्द पढ़ें।

PTRACE_PEEKDATA: stack या heap डेटा पढ़ने के लिए पते का उपयोग करें।

PTRACE_PEEKUSER: USER क्षेत्र डेटा पढ़ने के लिए ऑफ़सेट का उपयोग करें।

  • दरअसल, यह user_regs_struct संरचना के तत्व में से एक को पढ़ता है।