2012-03-21 3 views
8

После размещения много вопросов на Ptrace (самые последние 5 вопросов мои :() я, наконец, получил желаемый результат, когда я заменилРазница между ptrace (PTRACE_PEEKUSER) и ptrace (PTRACE_PEEKDATA)?

reg_val [1] = ptrace (PTRACE_PEEKDATA, ребенок, 4 * EBX , NULL);

с

reg_val [1] = ptrace (PTRACE_PEEKUSER, ребенок, 4 * EBX, NULL);

Разница упоминается в человеке странице, как это

  • peektext читает слово в местоположении адрес в памяти ребенка.
  • peekuser читает слово в позиции addr в области ПОЛЬЗОВАТЕЛЯ.
    Я не могу понять эту разницу только на странице руководства. Может ли кто-нибудь просветить меня по этому поводу?

ответ

14

PTRACE_PEEKDATA предназначено для чтения раздела данных/кода ребенка (процесс вообще). Как вы знаете, отладчики - это те, кто много использует ptrace, они могут использовать этот вызов для проверки значений переменных. Например, в GDB/DBX, если вы говорите,

print count 

отладчики будет внутренне вызван ptrace с PTRACE_PEEKDATA и найти его значение.

PTRACE_PEEKUSER должен прочитать содержимое области ПОЛЬЗОВАТЕЛЯ ребенка, которая содержит содержимое регистров и другую информацию. sys/user.h перечисляет что это Другая информация.

Например область USER содержит

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 предназначен для таких вещей, как регистровые значения и другая информация об отладке.' Не являются ли значения ebx, ecx? : О, я так и думал.Регистрирует, что все вы имели в виду? 'EIP' (указатель инструкции)? –

+0

извините за опечатку. Я исправил это. ** PTRACE_PEEKUSER ** для регистров и ** NOT ** ** PTRACE_PEEKDATA ** –

+0

Ваше последнее предложение меня сбивает с толку (это опечатка?). Вы сказали, что peekdata - это данные программы. отлично с tat. Теперь снова вы говорите, что peekdata - это регистры! Вы имели в виду peekuser ?? –

1

PTRACE_PEEKDATA: Прочтите слово по адресу addr в профиле трассировки memory.

PTRACE_PEEKUSER: Прочитать слово в смещении addr в файле tracee's USER.

PTRACE_PEEKDATA: Использовать адрес для чтения stack или heap данных.

PTRACE_PEEKUSER: Использовать смещение для чтения USER данных о районе.

  • Фактически, он считывает один из элементов структуры user_regs_struct.