2012-03-21 23 views
8

Sau khi đăng rất nhiều câu hỏi về ptrace (5 câu hỏi gần đây nhất là của tôi :() Cuối cùng tôi nhận được kết quả mong muốn khi tôi thaySự khác biệt giữa ptrace (PTRACE_PEEKUSER) và ptrace (PTRACE_PEEKDATA) là gì?

reg_val [1] = ptrace (PTRACE_PEEKDATA, trẻ em, 4 * EBX , NULL);

với

reg_val [1] = ptrace (PTRACE_PEEKUSER, trẻ em, 4 * EBX, NULL);

Sự khác biệt nêu tại trang người đàn ông giống như

  • peektext này đọc một từ vào addr vị trí trong bộ nhớ của trẻ.
  • người đọc giả đọc một từ tại vị trí bù đắp trong vùng USER của trẻ.
    Tôi không thể hiểu sự khác biệt này một mình từ trang người đàn ông. Có ai có thể dạy tôi nhiều hơn về điều này không ??

Trả lời

14

PTRACE_PEEKDATA là để đọc phần dữ liệu/mã của trẻ (quy trình nói chung). Như bạn đã biết rằng các trình gỡ rối là người sử dụng ptrace rất nhiều, họ có thể sử dụng cuộc gọi này để kiểm tra các giá trị của các biến. Ví dụ, trong GDB/DBX, nếu bạn nói

print count 

sự gỡ rối trong nội bộ sẽ gọi ptrace với PTRACE_PEEKDATA và tìm giá trị của nó.

PTRACE_PEEKUSER là để đọc nội dung của khu vực USER của trẻ chứa nội dung của thanh ghi và thông tin khác. sys/user.h liệt kê thông tin khác là gì.

Ví dụ khu vực USER chứa,

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

Nói tóm lại, PTRACE_PEEKDATA là dành cho dữ liệu chương trình (biến vv) và mã và PTRACE_PEEKUSER là cho những thứ như giá trị đăng ký và thông tin gỡ lỗi khác.

+0

'PTRACE_PEEKDATA dành cho những thứ như giá trị đăng ký và thông tin gỡ lỗi khác.' Không phải là giá trị đăng ký ebx, ecx ?? : O Tôi nghĩ vậy.Bằng cách đăng ký tất cả những gì bạn đã có nghĩa là gì? 'EIP' (con trỏ chỉ dẫn) ?? –

+0

xin lỗi vì lỗi đánh máy. Tôi sửa nó rồi. ** PTRACE_PEEKUSER ** là dành cho thanh ghi và ** NOT ** ** PTRACE_PEEKDATA ** –

+0

Câu cuối cùng của bạn gây nhầm lẫn cho tôi (có phải là lỗi đánh máy không?). Bạn đã nói peekdata dành cho dữ liệu chương trình. tốt với tat. Bây giờ một lần nữa bạn nói peekdata là dành cho đăng ký !! Ý bạn là người tìm kiếm? –

1

PTRACE_PEEKDATA: Đọc một từ tại địa chỉ addr trong tracee's memory.

PTRACE_PEEKUSER: Đọc một từ tại offset addr trong tracee's USER.

PTRACE_PEEKDATA: Sử dụng địa chỉ để đọc stack hoặc heap dữ liệu.

PTRACE_PEEKUSER: Sử dụng bù đắp để đọc USER dữ liệu khu vực.

  • Thực ra, nó đọc một phần tử của cấu trúc user_regs_struct.
Các vấn đề liên quan