Как вставить команду LC_LOAD_DYLIB в двоичный файл Mach-O (OSX)

StackOverflow https://stackoverflow.com/questions/273142

Вопрос

Я собираюсь исправить часть оставленной программы с помощью некоторого кода.

Программное обеспечение основано на углероде, поэтому я не могу использовать 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 ...

У кого-нибудь есть идеи?

Это было полезно?

Решение

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

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

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

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

    set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib
    

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top