Получить уведомление о создании процесса в Mac OS X - PullRequest
3 голосов
/ 24 ноября 2011

Я пытаюсь написать kext для Mac OS X, который будет получать уведомления при запуске любого процесса.

В Windows вы можете сделать это, вызвав PsSetLoadImageNotifyRoutine (...) и указать обратный вызов, который будет вызываться при запуске процесса.Это документированный способ, и он работает во всех Windows, начиная с Win 2k.

Есть ли что-нибудь подобное для Mac?Кажется, что этого можно достичь с помощью прослушивателей процесса kauth, но область действия процесса никогда не была реализована в OS X.

Другой альтернативой является перехват SYS_execve и друзей, но это недокументированный и неподдерживаемый способ.Я действительно не хочу идти по этому пути.

Мне не нужно ничего отменять - просто хочу получать уведомления о запуске процесса и получать его pid & path.

Ответы [ 4 ]

4 голосов
/ 26 апреля 2012

Ну, ваш вопрос немного двусмысленный.

Быть «уведомленным при запуске любого процесса» IMHO означает системный вызов fork, а не execve. Однако я понятия не имею, можно ли получить уведомление о fork через любой официальный API.

Если вас интересует execve, взгляните на API авторизации ядра (kauth) .

Вы можете зарегистрироваться в KAUTH_SCOPE_VNODE и отслеживать KAUTH_VNODE_EXECUTE, чтобы получать уведомления до выполнения execve (и, возможно, отказать ему в успешном завершении, возвращая значение из вашего обратного вызова); или зарегистрируйтесь в KAUTH_SCOPE_FILEOP и отслеживайте KAUTH_FILEOP_EXEC, чтобы получать уведомления после выполнения execve().

1 голос
/ 11 марта 2013

Старый вопрос - но - ответ о том, что перехват SYS_execve - единственный способ получить уведомление, является неправильным и опасным. Во-первых, таблица sysent не экспортируется (хотя, вероятно, ее можно найти довольно легко). Для двоих, вы должны пропатчить память и убедиться, что она работает.

Гораздо лучший способ, в кексте, состоит в том, чтобы использовать структуру MAC (это было бы Обязательным контролем доступа). Это в источниках XNU, в ветке / security. MAC Framework был разработан именно для этого вида операций - то есть уведомлений / перехвата без фактической перезаписи функции или адреса, но с выносками. Это также подробно описано в книге под названием «Внутренние компоненты Mac OS X и iOS», глава 14.

0 голосов
/ 29 октября 2016

Вот пример использования MAC и KAUTH.

https://www.synack.com/2015/11/17/monitoring-process-creation-via-the-kernel-part-i/

0 голосов
/ 25 ноября 2011

SYS_execve - это единственный способ получать уведомления при запуске любого процесса.Кроме того, вы можете попробовать использовать DTrace и libdtrace для получения уведомления о начале процесса;Я пытался таким образом, но безуспешно.

...