macOS: Перехват выполнения программы

macOS: Перехват выполнения программы

Я хочу перехватить выполнение произвольного исполняемого файла. Предположим, что есть двоичный файл /usr/bin/binary. Всякий раз, когда кто-то запускает этот двоичный файл, я хочу запустить свой собственный исполняемый файл. Из него я хочу решить, следует ли запускать исходный двоичный файл или нет. В конечном счете, я хочу вставить свою прокладку между исходным двоичным файлом и пользователем.

Похожий вопрос по Windows был задан:Я хочу перехватить заданную программу до ее запуска и сначала запустить свою собственную программу.

У меня есть права администратора в системе. Однако я не могу перемещать оригинальные бинарники в другие места.

ОБНОВЛЕНИЕкак спросил @dirkt:

  • будет жестко заданный список двоичных файлов, которые я хотел бы перехватить.

решение1

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я полный профан в мире MacOS, но я бы дал вам способ, как я бы это сделал под GNU/Linux... может быть, это поможет.

Хм... Я бы ответил так же, как @dirkt (он же оболочка, binaryкоторая указывает на binary.real), но:

  1. Если пользователь знаком с вашим механизмом, то он может запустить его binary.realнапрямую.
  2. Вам придется дублировать этот механизм для каждой программы, которую вы хотите «мониторить».

Давайте копнем немного в другом месте...

Модуль ядра

В мире GNU/Linux я бы написал модуль ядра, чтобы зацепить системный вызов exec и реализовать ACL, как вам нужно... но это немного перебор. Похоже, что можно разрабатывать модули ядра для Mac OS... Но я не знаю, позволяет ли Apple такой взлом.

Хак LD_PRELOAD

Используя хорошо известный LD_PRELOADмеханизм (который выглядитDYLD_INSERT_LIBRARIES в вашем мире), вы можете переписать любую функцию C любой библиотеки вашей системы. Поэтому вам просто нужно:

  1. Напишите динамическую библиотеку, реализующую exec*().
  2. Внедрите свой ACL.
  3. Убедитесь, что каждый сеанс пользователя (графический, терминальный) запускается с предварительно загруженной библиотекой благодаря DYLD_INSERT_LIBRARIES)

И вуаля !

Связанный контент