Melhor maneira de injetar funcionalidade em um binário

Qual seria a melhor maneira de inserir funcionalidade em um aplicativo binário (partido 3d, código fechado).

O aplicativo de destino está no OSX e parece ter sido compilado usando o gcc 3+. Eu posso ver a lista de funções implementadas no binário e depurei e isolou uma função específica que gostaria de chamar remotamente.

Especificamente, eu gostaria de chamar essa função - vamos chamá-la de nulazoomByFactor(x,y) - quando recebo determinados dados de um HIDevice complexo.

Posso modificar ou injetar facilmente instruções no próprio arquivo binário (ou seja, o patch não precisa ocorrer apenas na RAM).

O que você recomendaria como uma maneira "agradável" de fazer isso?

Editar:

Eu realmente preciso de aplicação inteira. Portanto, não posso abandonar e usar uma biblioteca. (Para aqueles que precisam de uma explicação ética: este é um software proprietário de CAD, cujo site não é atualizado desde 2006. Paguei por este produto (bastante dinheiro pelo que realmente é) e tenho um projeto dados que não consigo migrar facilmente para longe. O produto combina comigo como está, mas quero usar um novo HID que obtive recentemente. Examinei as partes internas do aplicativo e estou bastante confiante que eu possa chamar a função correta com os dados relevantes e fazê-la funcionar corretamente).

Aqui está o que eu fiz até agora, e é bastante óbvio.

Eu já modifiquei partes do aplicativo através deste processo:

xxd -g 0 binary > binary.hex
cat binary.hex | awk 'substitute work' > modified.hex
xxd -r modified.hex > newbinary
chmod 777 newbinary

Eu estou fazendo esse tipo de salto, porque o binário tem quase 100 megas.

O ponto principal do que estou pensando é que eu faria jmp em algum lugar do loop principal do aplicativo, lançaria um thread e retornaria à função principal.

Agora, as perguntas são: onde posso inserir o novo código? preciso modificar tabelas de símbolos? Como alternativa, como eu poderia fazer um carregamento do dylib automaticamente para que o único "hacking" que eu precise fazer seja inserir uma chamada para um dylib normalmente carregado na função principal?

questionAnswers(6)

yourAnswerToTheQuestion