Pergunta

Eu estou olhando para remendar um pedaço de abandonware com algum código.

O software é baseada em carbono, por isso não posso usar um InputManager (pelo menos, eu não acho que eu posso). Minha idéia era adicionar uma referência dylib ao cabeçalho mach-o, e lançar um novo thread quando a rotina de inicialização é chamado.

Eu muck ao redor com o mach-o cabeçalho usando um editor hexadecimal para adicionar o comando load apropriado (LC_ LOAD_DYLIB).

relatórios otool o que eu esperar para ver, por isso estou bastante confiante de que o arquivo está formatado corretamente.

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

No entanto, o lançamento do binário me dá o seguinte erro

dyld: bad external relocation length

Tudo o que posso acho que isso significa é que eu preciso modificar o seções LC_ SYMTAB ou LC_ DYNSYMTAB ...

Alguém tem alguma idéia?

Foi útil?

Solução

Eu não sou inteiramente certo o que você está tentando realizar, mas a maneira mais fácil de fazer isso é, provavelmente, para injetar um fio na tarefa mach depois de iniciado. Uma grande fonte de informações sobre como fazer isso (assim como a execução de código para fazê-lo) pode ser encontrada aqui: http: // Rentzsch .com / mach_inject / .

Algumas advertências que você deve estar ciente de:

  1. o task_for_pid mach () chamar necessário para obter a porta mach à tarefa agora é privleged e requer autorização para chamada. A razão para isto é bastante auto-evidente, mas se você estava planejando lançar algo com código injetado, você deve estar ciente disso.
  2. O seu código será executado no mesmo espaço de processo como o aplicativo original, mas em um segmento separado. Você vai, portanto, tenham pleno acesso à aplicação, no entanto, se ele não é thread-aware ser muito cuidadosos sobre como usar e manipular dados de fora do seu código injetado. Obviamente todos os problemas de vários segmentos serão amplificados aqui porque o código original nunca foi consciente de suas adições.

Outras dicas

A solução mais fácil que não envolve remendar o binário é simplesmente usar a variável de ambiente DYLD_INSERT_LIBRARIES e, em seguida, executar o aplicativo.

set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib

Estou assumindo a razão que o vinculador dinâmico relatou um erro é porque muitos campos no formato de arquivo de Mach-O contêm endereços especificados como um deslocamento a partir do início do arquivo assim que adicionar um outro comando de carga invalidaria cada endereço. Por exemplo, veja as entradas symoff e stroff na Mac OS X ABI Mach-O File Format Referência .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top