macOS: interceptando a execução do programa

macOS: interceptando a execução do programa

Quero interceptar uma execução de executável arbitrário. Suponha que exista um binário /usr/bin/binary. Sempre que alguém inicia esse binário, quero iniciar meu próprio executável. A partir daí eu quero decidir se o binário original deve ser iniciado ou não. Por fim, quero inserir meu calço entre o binário original e o usuário.

Pergunta semelhante do Windows foi feita:Quero interceptar um determinado programa antes de ele ser executado e executar meu próprio programa primeiro

Tenho direitos de administrador no sistema. Não consigo realocar os binários originais para outros lugares.

Atualizaçãoconforme perguntado por @dirkt:

  • haverá uma lista codificada de binários que gostaria de interceptar.

Responder1

ISENÇÃO DE RESPONSABILIDADE: sou totalmente ignorante no mundo MacOS, mas gostaria de lhe dar uma maneira de fazer isso no GNU/Linux... pode ser que ajude.

Hmmm... eu teria respondido exatamente como @dirkt (também conhecido como wrapper chamado binaryque apontaria para binary.real), mas:

  1. Se o usuário estiver ciente do seu mecanismo, ele poderá iniciar binary.realdiretamente.
  2. Você deve duplicar esse mecanismo para cada programa que deseja "monitorar".

Então, vamos cavar um pouco em outro lugar...

O módulo do kernel

No mundo GNU/Linux, eu teria escrito um módulo do kernel para conectar a chamada do sistema exec e implementar a ACL como você deseja... mas isso é um pouco exagerado. Parece que é possível desenvolver módulos de kernel para Mac OS... Mas não sei se a Apple permite esse tipo de hack.

O hack LD_PRELOAD

Usando o mecanismo bem conhecido LD_PRELOAD(que parece serDYLD_INSERT_LIBRARIES no seu mundo), você pode reescrever qualquer função C de qualquer biblioteca do seu sistema. Então você simplesmente precisa:

  1. Escreva uma biblioteca dinâmica que implemente exec*().
  2. Implemente sua ACL.
  3. Certifique-se de que todas as sessões de usuário (gráficas, terminal) sejam iniciadas com sua biblioteca pré-carregada graças ao DYLD_INSERT_LIBRARIES)

Et voilá!

informação relacionada