Как вставить команду 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/.

некоторые предостережения, которые вы должны знать:

  1. вызов mach task_for_pid (), необходимый для получения порта mach для задачи, теперь privleged и требует разрешение на звонок. Причина этого довольно очевидна, но если вы планируете выпустить что-то с введенным кодом, вы должны знать об этом.
  2. ваш код будет работать в том же пространстве процесса, что и исходное приложение, но в отдельном потоке. Таким образом, у вас будет полный доступ к приложению, однако, если оно не знает потоков, будьте очень осторожны с использованием и манипулированием данными из-за пределов вашего введенного кода. Очевидно, все многопоточные проблемы будет усилен здесь, потому что исходный код никогда не знал о ваших дополнениях.

самое простое решение, которое не включает исправление двоичного файла, - это просто использовать переменную среды DYLD_INSERT_LIBRARIES, а затем запустить приложение.

set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib

Я предполагаю, что причина, по которой динамический компоновщик сообщил об ошибке, заключается в том, что многие поля в формате файла Mach-O содержат адреса, указанные в качестве смещения от начала файла, поэтому добавление другой команды загрузки аннулирует каждый адрес. Например, см. symoff и stroff записи в Mac OS X ABI Mach-O ссылка на формат файла.