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?