Для тех, кто интересуется тем, что я в итоге сделал, вот краткое изложение:
Я посмотрел на несколько возможностей. Они попадают в исправления во время выполнения и статические исправления двоичных файлов.
Что касается исправления файлов, я, по сути, попробовал два подхода:
изменение сборки в коде
сегменты (__TEXT) двоичного файла.
изменение команд загрузки в
заголовок Маха.
Первый метод требует наличия свободного места или методов, которые вы можете перезаписать. Это также страдает от чрезвычайно плохой ремонтопригодности. Любые новые двоичные файлы требуют ручного исправления их еще раз, особенно если их исходный код даже немного изменился.
Второй метод состоял в том, чтобы попытаться добавить запись LC_ LOAD_ DYLIB в заголовок mach. Там не так много машинных редакторов, так что это сложно, но я на самом деле изменил структуры так, чтобы моя запись была видна otool -l
. Однако на самом деле это не сработало, поскольку во время выполнения было dyld: bad external relocation length
. Я предполагаю, что мне нужно разобраться с таблицами импорта и т. Д. И это слишком много усилий, чтобы получить права без редактора.
Второй путь - ввод кода во время выполнения. Там не так много, чтобы сделать это. Даже для приложений, которые вы контролируете (например, дочернее приложение, которое вы запускаете). Может быть, есть способ fork()
и запуск процесса инициализации, но я никогда этого не делаю.
Существует SIMBL, но для этого требуется, чтобы ваше приложение было Какао, потому что SIMBL будет представлять собой системный InputManager и выборочно загружать пакеты. Я отклонил это, потому что мое приложение не было Какао, и кроме того, я не люблю общесистемные вещи.
Следующим шагом был mach_ inject и проект mach_star. Существует также более новый проект под названием
PlugSuit, размещенный на Google, который, кажется, не более чем тонкая оболочка вокруг mach_inject.
Mach_inject предоставляет API для выполнения того, что подразумевает название. Я нашел проблему в коде, хотя. На 10.5.4 метод mmap в файле mach_inject.c требует наличия MAP_ SHARED или MAP_READ, иначе mmap завершится ошибкой.
Помимо этого, все на самом деле работает как рекламируется. В итоге я использовал mach_ inject_ bundle, чтобы сделать то, что я намеревался сделать со статическим добавлением DYLIB к заголовку mach: запуск нового потока в модуле init, который ведет грязную работу.
В любом случае, я сделал это вики. Не стесняйтесь добавлять, исправлять или обновлять информацию. Практически нет информации о такой работе над OSX. Чем больше информации, тем лучше.