2011-09-14 13 views
6

मैं ट्यूटोरियल here अनुसरण कर रहा हूँ, और (मूल रूप से, Rax को eax की जगह आदि) इतना है कि यह संकलित x86-64 के लिए एक छोटे से संशोधित:x86-64 पर ptrace के साथ कैसे खेलें?

#include <sys/ptrace.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <sys/user.h> 
#include <sys/reg.h> 
#include <unistd.h> 


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_RAX, 
          NULL); 
     printf("The child made a " 
       "system call %ld\n", orig_eax); 
     ptrace(PTRACE_CONT, child, NULL, NULL); 
    } 
    return 0; 
} 

लेकिन यह वास्तव में अपेक्षा के अनुरूप काम नहीं करता है, यह हमेशा कहते हैं :

The child made a system call -1 

कोड में क्या गलत है?

उत्तर

5

ईआरटीओ ईआईओ के साथ ptrace रिटर्न -1 क्योंकि आप जो पढ़ने की कोशिश कर रहे हैं वह सही ढंग से गठबंधन नहीं है। ptrace मैनपेज से लिया:

PTRACE_PEEKUSER 
      Reads a word at offset addr in the child's USER area, which 
      holds the registers and other information about the process (see 
      <sys/user.h>). The word is returned as the result of the 
      ptrace() call. Typically the offset must be word-aligned, 
      though this might vary by architecture. See NOTES. (data is 
      ignored.) 

मेरी 64-बिट प्रणाली में, 4 * ORIG_RAX नहीं 8-बाइट संरेखित है। ऐसे 0 या 8 के मानों के साथ प्रयास करें और इसे काम करना चाहिए।

+0

मुझे समझ नहीं आता तुम क्या मतलब है ... –

5

64 बिट में = 8 * ORIG_RAX

8 = sizeof (लंबी)

संबंधित मुद्दे