Как вставить команду LC LOAD DYLIB в двоичный файл Mach-O (OSX)
Я ищу, чтобы исправить кусок abandonware с некоторым кодом.
программное обеспечение основано на углероде, поэтому я не могу использовать InputManager (по крайней мере, я не думаю, что могу). Моя идея состояла в том, чтобы добавить ссылку dylib к заголовку mach-o и запустить новый поток при вызове процедуры инициализации.
я возился с заголовком mach-o, используя hexeditor, чтобы добавить соответствующую команду загрузки (LC_ LOAD_DYLIB).
otool сообщает, что я ожидал увидеть, поэтому я уверен, что файл правильно отформатирован.
Load command 63 cmd LC_LOAD_DYLIB cmdsize 60 name @executable_path/libAltInput.dylib (offset 24) time stamp 1183743291 Fri Jul 6 19:34:51 2007 current version 0.0.0 compatibility version 0.0.0
однако запуск двоичного файла дает мне следующую ошибку
dyld: bad external relocation length
все, что я могу предположить, это означает, что мне нужно изменить разделы LC_ SYMTAB или LC_ DYNSYMTAB...
у кого-нибудь есть идеи?
2 ответов
Я не совсем уверен, что вы пытаетесь выполнить, но самый простой способ сделать это, вероятно, ввести поток в задачу mach после ее запуска. Отличный источник информации об этом (а также запущенный код для этого) можно найти здесь:http://rentzsch.com/mach_inject/.
некоторые предостережения, которые вы должны знать:
- вызов mach task_for_pid (), необходимый для получения порта mach для задачи, теперь privleged и требует разрешение на звонок. Причина этого довольно очевидна, но если вы планируете выпустить что-то с введенным кодом, вы должны знать об этом.
- ваш код будет работать в том же пространстве процесса, что и исходное приложение, но в отдельном потоке. Таким образом, у вас будет полный доступ к приложению, однако, если оно не знает потоков, будьте очень осторожны с использованием и манипулированием данными из-за пределов вашего введенного кода. Очевидно, все многопоточные проблемы будет усилен здесь, потому что исходный код никогда не знал о ваших дополнениях.
самое простое решение, которое не включает исправление двоичного файла, - это просто использовать переменную среды DYLD_INSERT_LIBRARIES, а затем запустить приложение.
set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib
Я предполагаю, что причина, по которой динамический компоновщик сообщил об ошибке, заключается в том, что многие поля в формате файла Mach-O содержат адреса, указанные в качестве смещения от начала файла, поэтому добавление другой команды загрузки аннулирует каждый адрес. Например, см. symoff
и stroff
записи в Mac OS X ABI Mach-O ссылка на формат файла.