В Linux, при входе в системный вызов, какое значение в% eax?(не orig_eax) - PullRequest
6 голосов
/ 31 марта 2011

Когда возвращается системный вызов, я получаю возвращаемое значение системного вызова в% eax, однако при вводе я получаю -38, что равно 0xFFFFFFDA в шестнадцатеричном формате. Это как для записи / чтения. Что это за номер? Может ли оно быть использовано для безопасного различения входа и выхода?

Ответы [ 2 ]

7 голосов
/ 01 апреля 2011

-38 в eax для записи syscall, по-видимому, является ENOSYS (функция не реализована) и помещается туда syscall_trace_entry в arch / x86 / kernel / entry_32.S.Я полагаю, можно с уверенностью предположить, что он всегда будет там при входе в системный вызов, однако он также может быть там при выходе из системного вызова , если системный вызов возвращает ENOSYS.

Лично я всегда простоотслеживал, вхожу ли я во вход или выход из системного вызова при использовании ptrace, хотя я также видел некоторый код, использующий ENOSYS.(Я предполагаю, что вы используете ptrace) Я думаю, что это не сработает, если процесс окажется внутри системного вызова при подключении к нему, но мне повезло, что я не столкнулся с этой проблемой.

Я быстро взглянул на источники strace и думаю, что он также отслеживает состояние, поскольку в нем был комментарий: «Мы подключаемся к уже запущенному процессу. Попробуйте выяснить состояние процесса в системных вызовах,хорошо справиться с первым событием ".и чуть позже после этого он сказал: «Процесс спит в середине системного вызова. Подделка события входа системного вызова.».

Короче говоря, значение не может быть безопасно использовано, чтобы отличить запись от выхода,Тем не менее, я не уверен, что отслеживание этого вручную - лучший метод, так как у меня действительно нет никакого источника, который определенно сказал бы вам использовать эту технику, извините.:)

0 голосов
/ 01 апреля 2011

Я все еще не получаю, когда вы получаете -38 в eax, но при выполнении системного вызова eax содержит число, определяющее системный вызов (в ядре 2.6 вы можете взглянуть на arch / x86 / include / asm / unistd_64.h, чтобы увидеть номера для каждого вызова).

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

  1. ваша программа
  2. установите eax на syscall (также откладывать вызовнекоторые другие правила)
  3. системный вызов init (через int 0x80)
  4. результат системного вызова в eax
  5. ваша программа снова

Возможно, ваш вопросне так сформулировано, но если вы не пишете код / ​​драйвер ядра, самый простой способ сказать, что вы находитесь перед входом в системный вызов или после выхода из системного вызова: TRUE, когда вы находитесь в своем коде ;-).Сам вход / выход происходит (более или менее) мгновенно в одной инструкции, так что либо вы находитесь в системном вызове (тогда вы будете знать, потому что это должен быть некоторый код ядра или блокирующий вызов), либо нет (почти каждый раз, когда вы отлаживаетеваш код).

...