Разница между ptrace(PTRACE_PEEKUSER) и ptrace(PTRACE_PEEKDATA)?

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

reg_val[1] = ptrace(PTRACE_PEEKDATA, child, 4 * EBX, NULL);

с участием

reg_val[1] = ptrace(PTRACE_PEEKUSER, child, 4 * EBX, NULL);

Разница, упомянутая на странице руководства, выглядит следующим образом

  • PTRACE_PEEKTEXT читает слово по адресу адреса в памяти ребенка
  • PTRACE_PEEKUSER читает слово по смещению addr в дочерней области USER

Я не могу понять эту разницу только из справочной страницы. Может ли кто-нибудь просветить меня по этому поводу??


person kidd0    schedule 21.03.2012    source источник


Ответы (1)


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

print count

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

PTRACE_PEEKUSER используется для чтения содержимого дочерней области USER, которая содержит содержимое регистров и другую информацию. sys/user.h перечисляет, что это за другая информация.

Например, область ПОЛЬЗОВАТЕЛЯ содержит,

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 предназначен для таких вещей, как значения регистров и другая отладочная информация;

Обратите внимание на эквивалентность между PTRACE_PEEKDATA и PTRACE_PEEKTEXT. Из man ptrace:

Linux не имеет отдельных адресных пространств для текста и данных, поэтому эти два запроса в настоящее время эквивалентны.

person Pavan Manjunath    schedule 21.03.2012
comment
PTRACE_PEEKDATA is for things like register values and other debug info. Разве регистры ebx, ecx не являются значениями?? :О Я так и думал. Под регистрами ты что имел в виду? EIP (указатель инструкции)?? - person kidd0; 21.03.2012
comment
извините за опечатку. Я исправил это. PTRACE_PEEKUSER предназначен для регистров, а НЕ PTRACE_PEEKDATA - person Pavan Manjunath; 21.03.2012
comment
Ваше последнее предложение сбивает меня с толку (это опечатка??). Вы сказали, что peekdata предназначена для данных программы. нормально с татом. Теперь вы снова говорите, что peekdata для регистров !! Вы имели в виду peekuser?? - person kidd0; 21.03.2012
comment
Всем привет; извините, что воскрешаю древний пост, но было интересно: где на самом деле хранится детская область USER в виртуальной памяти? Я знаю, что это, скорее всего, будет зависеть от реализации, но, скажем, в 64-разрядной версии Ubuntu, куда на самом деле смотрит PTRACE_PEEKUSER в виртуальной памяти? Большое спасибо заранее - person Atticus Stonestrom; 10.06.2020