Ответ зависит от того, хотите ли вы сделать это в своем приложении или в масштабе всей системы. В вашем собственном приложении это довольно просто; динамический компоновщик предоставляет такие функции, как DYLD_INSERT_LIBRARIES
. Если вы делаете это для целей отладки / инструментирования, также проверьте DTrace.
Вы можете заменить реализации метода Objective C на метод swizzling, например JRSwizzle или Apple method_exchangeImplementations
(10,5 +).
Если вы хотите изменить поведение библиотеки в масштабе всей системы, вам потребуется загрузить адресные пространства других процессов.
- Два механизма загрузки, изначально разработанные для других целей ( менеджеры ввода и добавления сценариев ), обычно используются для этой цели, но я бы не стал их рекомендовать.
mach_inject/mach_override
- это набор библиотек с открытым исходным кодом для загрузки кода и замены реализаций функций соответственно; тем не менее, вы несете ответственность за написание собственного приложения, которое использует библиотеки. (Также взгляните на этот ответ ; вам нужны специальные разрешения для внедрения кода в другие процессы.)
Пожалуйста, имейте в виду, что Apple не одобряет исправления приложений / внедрение кода в целях без отладки, и некоторые пользователи Mac (и разработчики) крайне критически относятся к этой практике. Большая часть этой критики плохо информирована, но было несколько законно плохо написанных «плагинов» (особенно тех, которые исправляют Safari), которые были замешаны в сбоях приложений и проблемах. Код в обороне.
(Отказ от ответственности: я являюсь автором (бесплатного) модуля APE и приложения, которое использует mach_inject
.)