2008-11-07 2 views
7

Я ищу для исправления части отказа от кода с некоторым кодом.Как вставить команду LC_LOAD_DYLIB в двоичный файл Mach-O (OSX)

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

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

ответ

4

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

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

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

Отлично. Это отличный совет. Чтобы ответить вам, нет, я не распространяю приложение. Я исправляю его для личного использования, так что я могу использовать альтернативный HID (я все же оставил надежду как на дистрибутив приложения, так и на производителя драйверов для HID). – 2008-11-07 19:28:24

2

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

set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib 

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