2011-09-14 17 views
6

Tôi đang theo hướng dẫn here, và sửa đổi một chút cho x86-64 (về cơ bản thay thế eax để rax, vv) để nó biên dịch:Làm thế nào để chơi với ptrace trên x86-64?

#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; 
} 

Nhưng nó không thực sự làm việc như mong đợi, nó luôn luôn nói :

The child made a system call -1 

Có gì sai trong mã?

Trả lời

5

trả về ptrace -1 với errno EIO vì những gì bạn đang cố gắng đọc không được căn chỉnh chính xác. Lấy từ ptrace manpage:

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.) 

Trong hệ thống 64-bit của tôi, 4 * ORIG_RAX không 8-byte liên kết. Hãy thử với các giá trị như 0 hoặc 8 và nó sẽ hoạt động.

+0

Tôi không hiểu những gì bạn có nghĩa là ... –

5

Trong 64 bit = 8 * ORIG_RAX

8 = sizeof (long)

Các vấn đề liên quan