Mac OS: есть ли способ пронюхать вызов системы без ядра

Мне нужно открыть файл из любого места в Mac OS, и я хочу выполнить некоторую операцию, прежде чем он откроется в любом соответствующем приложении. Есть ли способ пронюхать системный вызов открытия, удерживать его некоторое время и выполнять какую-то операцию.

Например, я открываю файл test.doc, который открывается в приложении msword или может выбрать любое другое приложение, щелкнув правой кнопкой мыши и открыв с помощью. Я хочу задержаться на некоторое время и хочу выполнить некоторую операцию перед запуском этого приложения MS Word или любого связанного приложения (системный открытый вызов) в моем файле text.doc.

Есть ли способ на языке программирования для Mac OS (C/C++/ObjectiveC/Swift) без обращения к ядру.

Любая помощь будет высоко оценена.


person vikkuu    schedule 22.07.2018    source источник
comment
что вам именно нужно? С помощью команды bash open -a "Application name" file.extension вы можете открыть что угодно, поэтому, если вы напишете какой-нибудь скрипт, который выполняет какую-то работу перед этим открытием, вы получите то, что просили. Надеюсь, я вас правильно понял.   -  person Dominik Bucher    schedule 23.07.2018
comment
Я могу открыть файл и добавить свою логику перед открытием. Но если обычный пользователь открывает файл из Finder в стороннем приложении, я не могу его удержать, у меня нет этого события.   -  person vikkuu    schedule 23.07.2018
comment
Требование: если пользователь открывает какой-либо файл в системе, мое приложение узнает, что этот файл будет открыт, а затем я могу выполнить свою операцию и открыть файл. Это своего рода открытый вызов системы переопределения / прослушивания   -  person vikkuu    schedule 23.07.2018


Ответы (2)


Насколько мне известно, полный перехват/перехват системного вызова можно выполнить только в kext.

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

В принципе, вы можете внедрить код в процесс и перехватить системный вызов open() для этого процесса, даже если приложение не поддерживает плагины. (например, с помощью mach_inject) Недостатком этого является то, что если, например. пользователь дважды щелкает файл в Finder, и это запускает приложение и немедленно открывает файл, есть только очень небольшое временное окно, в течение которого вы можете внедрить код. Я не думаю, что вы можете сделать это надежно, используя только код пользовательского пространства.

person pmdj    schedule 23.07.2018
comment
mach_inject, вероятно, больше не стоит упоминать как вариант — системные приложения, такие как Finder, защищены SIP и не могут быть нацелены. (task_for_pid() не получится.) - person ; 24.07.2018
comment
Спасибо за информацию. У вас есть пример кода? - person vikkuu; 24.07.2018
comment
Внедрение кода и переопределение библиотечных функций намного сложнее, чем может разумно поместиться в ответ на переполнение стека. (Я использовал эту технику в проекте для клиента, и только эта часть кода составляет около 400 LOC.) - person pmdj; 30.07.2018

Даже с расширением ядра перехват системных вызовов больше невозможен из-за различных средств защиты в ядре, таких как KASLR. С Mojave внедрение кода больше не будет жизнеспособным из-за SIP. Единственный поддерживаемый способ сделать то, что запрашивается, — это использовать авторизацию ядра ( KAuth).

person TheDarkKnight    schedule 24.07.2018