मैं एक लेख here के माध्यम से जा रहा था और कोड स्निपेट नीचे मैंने बाहर की नकल की है बाहर कोशिश कर रहा था: -(ORIG_EAX * 4) ptrace में कॉल
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <linux/user.h> /* For constants
ORIG_EAX etc */
int main()
{ pid_t child;
long orig_eax;
child = fork();
if(child == 0) {
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
execl("/bin/ls", "ls", NULL);
}
else {
wait(NULL);
orig_eax = ptrace(PTRACE_PEEKUSER,
child, 4 * ORIG_EAX,
NULL);
printf("The child made a "
"system call %ld\n", orig_eax);
ptrace(PTRACE_CONT, child, NULL, NULL);
}
return 0;
}
मैं के बारे में क्या ORIG_EAX
वास्तव में है और क्यों है एक संदेह है 4*ORIG_EAX
को पीआरटीसी कॉल पर पास किया गया है। मैंने शुरुआत में माना कि ORIG_EAX
, EBX
, ECX
इत्यादि एक विशेष संरचना में ऑफ़सेट होंगे जहां रजिस्टरों के मूल्य संग्रहीत किए जाएंगे।
इसलिए मैंने printf("origeax = %ld\n", ORIG_EAX);
का उपयोग करके प्रतीक्षा के बाद ORIG_EAX के मान को मुद्रित करने का निर्णय लिया। मान 11
था। तो, ऑफसेट के बारे में मेरी पिछली धारणा गलत थी।
मैं समझता हूं कि wait
कॉल समाप्त हो जाता है जब बच्चे के पास राज्य परिवर्तन होता है (इस मामले में, सिस्टम कॉल जारी करता है) और ORIG_EAX में सिस्टम कॉल नंबर होगा।
हालांकि, ORIG_EAX * 4 क्यों ptrace कॉल पर पारित किया गया है?
32 और 64-बिट के बीच dfferences के बारे में क्या? क्या हम उस पर संकलन-समय-मामले नहीं लेना चाहिए? –
आगे ..., क्या यह केवल ptrace x86 है? यदि नहीं, तो हमें ऐसा करने के कुछ और सामान्य लक्ष्य-स्वतंत्र तरीके की आवश्यकता है! –
निश्चित रूप से AMD64 'user_regs_struct' की परिभाषा है, लेकिन मुझे यकीन नहीं है कि क्या आप आर्किटेक्चर को मिश्रित और मिलान कर सकते हैं। आईआईआरसी ने 'पट्रेस' में टिप्पणियों को अलग-अलग शीर्षकों का उल्लेख किया एक समस्या थी। चूंकि 'ptrace' एक syscall है, इसे काम करना चाहिए (आपको बस प्रत्येक आर्किटेक्चर के लिए ऑफसेट को मैन्युअल रूप से स्विच करना पड़ सकता है) लेकिन मैं नहीं कह सकता कि मैंने कभी कोशिश की है। –