
Я хочу перехватить выполнение произвольного исполняемого файла. Предположим, что есть двоичный файл /usr/bin/binary
. Всякий раз, когда кто-то запускает этот двоичный файл, я хочу запустить свой собственный исполняемый файл. Из него я хочу решить, следует ли запускать исходный двоичный файл или нет. В конечном счете, я хочу вставить свою прокладку между исходным двоичным файлом и пользователем.
Похожий вопрос по Windows был задан:Я хочу перехватить заданную программу до ее запуска и сначала запустить свою собственную программу.
У меня есть права администратора в системе. Однако я не могу перемещать оригинальные бинарники в другие места.
ОБНОВЛЕНИЕкак спросил @dirkt:
- будет жестко заданный список двоичных файлов, которые я хотел бы перехватить.
решение1
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я полный профан в мире MacOS, но я бы дал вам способ, как я бы это сделал под GNU/Linux... может быть, это поможет.
Хм... Я бы ответил так же, как @dirkt (он же оболочка, binary
которая указывает на binary.real
), но:
- Если пользователь знаком с вашим механизмом, то он может запустить его
binary.real
напрямую. - Вам придется дублировать этот механизм для каждой программы, которую вы хотите «мониторить».
Давайте копнем немного в другом месте...
Модуль ядра
В мире GNU/Linux я бы написал модуль ядра, чтобы зацепить системный вызов exec и реализовать ACL, как вам нужно... но это немного перебор. Похоже, что можно разрабатывать модули ядра для Mac OS... Но я не знаю, позволяет ли Apple такой взлом.
Хак LD_PRELOAD
Используя хорошо известный LD_PRELOAD
механизм (который выглядитDYLD_INSERT_LIBRARIES
в вашем мире), вы можете переписать любую функцию C любой библиотеки вашей системы. Поэтому вам просто нужно:
- Напишите динамическую библиотеку, реализующую exec*().
- Внедрите свой ACL.
- Убедитесь, что каждый сеанс пользователя (графический, терминальный) запускается с предварительно загруженной библиотекой благодаря
DYLD_INSERT_LIBRARIES
)
И вуаля !