Вставка системных вызовов OS X
Мне нужно вставить (вызывать мои функции вместо оригинальных функций) некоторые системные вызовы OS X, чтобы преодолеть недостаток в части программного обеспечения с закрытым исходным кодом.
Предпочтительно, чтобы полученное решение работало под 10,5 (Leopard) и новее, но я мог бы потребовать 10,6 (Snow Leopard), если аргумент был достаточно силен.
Предпочтительно, чтобы полученное решение было исполняемым, но я мог бы согласиться на сценарий.
Предпочтительно, чтобы полученное решение могло вставлять ("красть векторы") даже после запуска целевого приложения, но я мог бы согласиться на технологию, которая должна внедряться во время загрузки приложения.
Предпочтительно, чтобы полученное решение было разработано на C или C++, но я мог бы согласиться на Objective-C или что-то еще.
До сих пор я экспериментировал с:
1) Сценарии DTrace, которые многому меня научили, но ограничения языка D (ограниченное управление потоком и т. Д.) Причиняют мне большую боль за то, что я делаю, не говоря уже о том, что результатом будет сценарий, что не так аккуратно и автономно, как то, за что я стреляю.
2) Интерпозиция DYLD_INSERT_LIBRARIES, которая во многих отношениях является гладкой, но, возможно, из-за выравнивания пространства имен (я не буду притворяться, что глубоко понимаю, что это значит), она прекрасно работает против простых исполняемых файлов, но заставляет мое целевое приложение задыхаться, даже когда я собираю бесполезная библиотека, которая на самом деле не вставляет никаких вызовов.
Моя последняя идея - поэкспериментировать с mach_star ( https://github.com/rentzsch/mach_star/), но сначала я остановлюсь здесь, чтобы спросить сообщество переполнения стека, которое неизменно знает больше, чем я...
... я должен смотреть на что-то кроме mach_star дальше?
1 ответ
Я думаю, что вы сделали правильный выбор, глядя на mach_star.
Если вы действительно хотите узнать, как работает загрузчик ссылок darwin и т. Д., Я бы потратил больше времени на проблемы с вставкой DYLD. Но, очевидно, вы ищете быстрое решение, а не углубленное обучение. И я сомневаюсь, что кто-нибудь сможет понять ваши проблемы, не имея доступа к вашему проекту. Итак, это, вероятно, тупик. Кроме того, переопределение Маха и инъекция в любом случае более интересны.
Основы внедрения Маха на самом деле не так уж сложны, но есть масса вещей, которые вы должны правильно понять, большинство из которых плохо документированы. Вы ошибетесь в 11 вещах, прежде чем получите что-то, что работает в вашей системе, и тогда это не будет работать для следующей пробной функции, а затем она не будет работать на 10.5 или 10.8, и… Библиотека mach_star оборачивает все это для вас. Так почему бы не использовать его?
Я должен отметить, что я не использовал mach_star со времен до Intel. Но похоже, что он все еще регулярно обновляется, с изменениями для x86_64 и 10.7 и Xcode 4 и так далее.