macOS: Programmausführung abfangen

macOS: Programmausführung abfangen

Ich möchte die Ausführung einer beliebigen ausführbaren Datei abfangen. Angenommen, es gibt eine Binärdatei /usr/bin/binary. Immer wenn jemand diese Binärdatei startet, möchte ich stattdessen meine eigene ausführbare Datei starten. Daraus möchte ich entscheiden, ob die ursprüngliche Binärdatei gestartet werden soll oder nicht. Schließlich möchte ich meinen Shim zwischen der ursprünglichen Binärdatei und dem Benutzer einfügen.

Eine ähnliche Windows-Frage wurde gestellt:Ich möchte ein bestimmtes Programm vor der Ausführung abfangen und zuerst mein eigenes Programm ausführen

Ich habe Administratorrechte für das System. Ich kann die Originalbinärdateien jedoch nicht an andere Orte verschieben.

UPDwie von @dirkt gefragt:

  • Es wird eine fest codierte Liste von Binärdateien geben, die ich abfangen möchte.

Antwort1

HAFTUNGSAUSSCHLUSS: Ich habe in der MacOS-Welt überhaupt keine Ahnung, aber ich würde Ihnen eine Möglichkeit zeigen, wie ich das unter GNU/Linux machen würde … vielleicht hilft es.

Hmmm ... ich hätte genau wie @dirkt geantwortet (also einen Wrapper namens , binaryder auf verweisen würde binary.real), aber:

  1. Wenn der Benutzer Ihren Mechanismus kennt, kann er ihn binary.realdirekt starten.
  2. Sie müssen diesen Mechanismus für jedes Programm duplizieren, das Sie „überwachen“ möchten.

Lassen Sie uns also woanders ein wenig graben ...

Das Kernelmodul

In der GNU/Linux-Welt müsste ich ein Kernelmodul schreiben, um mich an den Exec-Systemaufruf anzuhängen und die ACL nach Wunsch zu implementieren... aber das ist ein bisschen übertrieben. Es sieht so aus, als ob es möglich wäre, Kernelmodule für Mac OS zu entwickeln... Aber ich weiß nicht, ob Apple diese Art von Hack zulässt.

Der LD_PRELOAD Hack

Mit dem bekannten LD_PRELOADMechanismus (der zu sein scheintDYLD_INSERT_LIBRARIES auf deiner Welt), können Sie jede C-Funktion jeder Bibliothek Ihres Systems umschreiben. Sie müssen also einfach nur:

  1. Schreiben Sie eine dynamische Bibliothek, die exec*() implementiert.
  2. Implementieren Sie Ihre ACL.
  3. Stellen Sie sicher, dass jede Benutzersitzung (grafische Sitzungen, Terminalsitzungen) mit Ihrer vorinstallierten Bibliothek gestartet wird, dank DYLD_INSERT_LIBRARIES)

Und voilà!

verwandte Informationen