Как вставить команду LC_LOAD_DYLIB в двоичный файл Mach-O (OSX) - PullRequest
8 голосов
/ 07 ноября 2008

Я собираюсь исправить какой-нибудь код из-за ненужного ПО.

Программное обеспечение на основе углерода, поэтому я не могу использовать InputManager (по крайней мере, я не думаю, что я могу). Моя идея состояла в том, чтобы добавить ссылку на dylib в заголовок mach-o и запустить новый поток при вызове процедуры инициализации.

Я перебрал заголовок mach-o, используя шестигранник, чтобы добавить соответствующую команду загрузки (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 ]

5 голосов
/ 07 ноября 2008

Я не совсем уверен, что вы пытаетесь выполнить, но самый простой способ сделать это, вероятно, - вставить поток в задачу mach после ее запуска. Отличный источник информации о том, как это сделать (а также как запустить код для этого), можно найти здесь: http://rentzsch.com/mach_inject/.

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

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

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

set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib

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

...