Как стать автором
Обновить

Комментарии 9

ptrace(PTRACE_SYSCALL, pid, 0, 0) срабатывает и на входе и на выходе из syscall. Мы делаем PTRACE_ATTACH к существующему процессу, может ли получиться что первый вызов с PTRACE_SYSCALL будет на выходе из syscall?
Если через PTRACE_ATTACH — то да. Но в примере используется PTRACE_TRACEME, поэтому такого случиться не должно.
А можете привести подтверждение, что это может случиться? Если это действительно так, как различить вход это в syscall или выход? Я читаю код ядра, и попутно gdb и strace, но этот момент неясен пока. Может Вы быстрее подскажите?
При аттаче посреди системного вызова с последующим PTRACE_SYSCALL, программа остановится, а для трассировщика это будет выглядеть как вход в syscall (затем, как обычно, последует выход). При этом orig_eax=0, то есть номер вызова не сохранен (насколько я знаю, это потому, что номер syscall'а сохраняется в orig_eax только если программа находится под трассировкой).
Кое-что прояснилось. При аттаче к процессу ему посылается сигнал SIGSTOP и процесс трассировщик ждет уведомления получения с помощью waitpid(). Обработка сигналов происходит после перехода в соответствующий user space, т.е. например после обработки syscall. Соответственно первый PTRACE_SYSCALL сработает только на входе в syscall. Если я не прав, пожалуйста поправьте.
Есть познавательный проект ministrace github.com/nelhage/ministrace — готовые исходники к тому, что Вы написали.
Очень полезная информация для домашних пользователей Linux.

Подозреваю, это предназначалось для блога habrahabr.ru/blogs/system_development/
Можно ли с помощью ptrace отменить вызов метода, заменив ожидаемый результат своим?
Да, можно при помощи PTRACE_SYSEMU: он действует так же, как PTRACE_SYSCALL, но запрошенный сискол при этом не выполняется.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории