7
votes

Existe-t-il un moyen d'envoyer des données à l'entrée standard d'un autre processus sous Mac OS?

Je me demandais s'il y avait une API, cependant obscurs, cela permettrait à une personne d'envoyer des données à un flux STDIN d'un autre processus sous Mac OS X. Sous Linux, si je me souviens bien, si je me souviens bien, Vous pouvez utiliser le système de fichiers dans / proc pour accéder à ces flux (avec les autorisations correctes, bien sûr).

i Dunno. Ports de Mach, n'importe qui?


0 commentaires

5 Réponses :


5
votes

Malheureusement, je ne crois pas que vous puissiez faire cela - MacPorts sont tous des terres utilles et l'opération dont vous avez besoin (beaucoup de superches, voir ci-dessous ou) la coopération du noyau, qui, je crois, n'est pas à venir. Par exemple, Mac OSX Internals, un système Approche dans la section sur le descripteur de fichier en passant, explique

Le descripteur est local au processus en ce que cela n'a significatif que dans le processus qui a acquis le descriptorsay, en ouvrant un fichier. Dans particulier, un processus A ne peut pas accéder un fichier ouvert dans un autre processus B en utilisant simplement la valeur de la Descripteur représentant ce fichier dans B.

puis continue à décrire comment les FD sont envoyés.

La partie "Testery" nécessiterait d'obtenir un code de votre code à courir (soit dans Userland, soit dans le cadre du noyau) dans l'autre processus.

Par exemple, vous pouvez le faire dans Userland en corrigeant le fichier binaire qui est leur exécutable - trouvez toute instruction tôt dans son chemin de démarrage qui est sûr d'être exécuté et de mettre à pied un saut à votre propre code qui envoie la FD à votre processus de démon de surveillance, exécute l'instruction corrigée, puis retourne à l'autre flux séquentiel normal du processus.

Pour le faire au niveau du noyau nécessiterait des correctifs similaires sur le code du noyau lui-même ou pour coder que le noyau charge et fonctionne avec une fiduciaire complète et non vérifiée (afin qu'ils puissent détourner le fichier de processus non associé. Entrées de la table descripteur) - J'espère bien qu'il n'y ait pas de tels chemins de code dans Mac OS X (car leur utilisation principale serait sans aucun doute par des virus, des chevaux de Troie et d'autres logiciels malveillants de toutes sortes) mais, s'il y a et que vous puissiez Trouvez-les, cela pourrait être une solution plus générale que de corriger chaque exécutable binaire d'intérêt.

Retour à la zone user, une autre approche assez générale peut être de corriger des bibliothèques chargées de manière dynamique que tous les processus de charge d'intérêts, au lieu de corriger les différents processus de plusieurs exécutables.


3 commentaires

Eh bien, on peut installer un conducteur et détourner le noyau toute la journée; Mais cela nécessiterait bien sûr des autorisations administratives en premier lieu, avec laquelle on pouvait essentiellement détruire l'installation de toute façon.


@Billy, le problème général est que l'utilisateur MacOSX typique a une autorisation administrative et est malheureusement utilisé pour taper son mot de passe, à la demande, de permettre l'installation de tout ce qui est téléchargé sur le net. Je ne pense pas que l'installation d'un pilote nécessiterait quelque chose de différent, n'est-ce pas?


Non, ce n'est pas différent. Cela dit, si un programme peut gagner des droits d'administrateur, il peut détruire complètement la machine. Être capable de rediriger STDIN pour un processus est relativement mineur par comparaison.



0
votes

Eh bien, techniquement, vous pouvez utiliser un fil-thread dans le processus cible, puis l'avoir envoyé un DUP du descripteur de fichier STDIN ... mais vous ne devriez probablement pas. : -)

Qu'est-ce que vous essayez vraiment de faire?


5 commentaires

Eh bien, j'ai fait un plugin pour Adium (un client de discussion) pouvant lancer des processus de la saisie de texte et envoie la sortie à la conversation. Cependant, je n'ai donné aucun moyen d'accéder au flux stdin de processus de lancement d'ADIUM, donc je pensais qu'il serait "amusant" d'injecter des données dans stdin au lieu de travailler réel, solution viable de mon plugin.


Quoi qu'il en soit, écrire à stdin échoue simplement avec fwrite et écrire (0, ...) écrit sur le terminal mais ne fait pas ces données Lisible par un autre lire appel. Juste pour la science, une idée de la façon dont je pouvais travailler autour de cela?


Je recommanderais d'explorer la suggestion de Juleslt ci-dessous ... Si Adium implémente une interface AppleScript, c'est probablement le meilleur moyen d'autoriser votre plug-in d'envoyer des messages de discussion (si je comprends correctement ce que vous essayez de faire). Si Adium est une application d'interface graphique de cacao, il ne va pas lire de STDIN! L'injection de Mach est une technique avancée ... de même que le passage des descripteurs de fichier ouverts entre les processus. Ce niveau de Darwin-Fu n'est probablement pas obligé d'écrire un plug-in d'applications simple.


Mon plan était plutôt de faire un programme autonome que je pourrais invoquer à partir de mon plugin pour parler au stdin d'un autre processus. Je n'ai pas peur des choses à faible niveau-ish.


Ah, alors re-lisant vos réponses, il semble que ce ne soit pas STDIN de l'ADIUM que vous essayez d'interposer, mais celui d'un processus que votre plug-in se lancent? C'est un scénario beaucoup plus simple, ce qui n'exige que la danse standard UNIX de fournir les descripteurs de fichiers pour les processus d'enfant que vous avez pour la fourchette / frai vous-même. (Est-ce que cela décrit ce que vous faites avec précision?)



1
votes

supposer que c'est avec l'autorisation des utilisateurs (c'est-à-dire que vous souhaitez capturer des informations à partir d'une application tierce, pour rediriger vers une autre application, telles que les applications audio de Rogue AMOEBA ou certaines applications de capture de flux vidéo), je dirais que vous voulez soit Regardez les extensions du noyau ou les gestionnaires d'entrée.

(voir aussi Fscript Anywhere, SimBL et Application Enhancer - Tous les exemples de logiciels qui injectent une fonctionnalité dans des applications tierces).

Beaucoup de techniques plus anciennes pour l'injection de code pilotée par l'utilisateur ont été restreintes dans 10,6 (les gestionnaires d'entrée sont plus difficiles à installer, par exemple).

Si vous êtes intéressé par l'entrée de l'utilisateur plutôt que sur STDIN, le kit de méthode d'entrée de remplacement peut être «assez bon» - classiquement, les gestionnaires d'entrée ont été utilisés pour injecter toutes sortes de code dans les applications.

D'autre part, si vous voulez faire cela sans permission de l'utilisateur (c'est-à-dire la journalisation des clés), alors vous êtes au piratage. Il y a probablement une chaîne de vulnérabilités aussi non corrigée pouvant être combinée pour faire ce que vous voulez faire, mais celui qui sait qu'il est susceptible de gagner de l'argent de celui-ci.


6 commentaires

Non non, je veux vraiment juste mettre des choses dans STDIN. Pas même lu. Je veux juste pipeler la saisie des utilisateurs de mon programme à un autre programme de STDIN, qui a été lancé avant le mien.


Étant donné que AppleScript peut simuler des événements de frappes et de souris invididus, ainsi que des actions de niveau supérieur tels que Coller, je me demande si les API AppleEvent pourraient fonctionner - c'est un niveau supérieur à STDIN / ne fonctionnerait vraiment que pour les applications de cacao, mais cela peut être possible de atteindre votre objectif de cette façon.


Eh bien, je ne suis pas dans capture stdin . J'aimerais plutôt vous injecter des données.


C'est ce que j'ai compris. Les API AppleEvent vous permettent de passer des événements (un événement clé comme «Maj-Key-Bas», une chaîne de texte, une action comme la pâte), etc., dans un programme en cours d'exécution. C'est au niveau du cacao plutôt que le niveau Unix, mais si les données que vous souhaitez envoyer sont prises en charge par l'API AppleEvent, cela pourrait être une option. C'est l'option prise en charge pour contrôler / script d'applications tierces (limitées)


Oh je vois. J'étais trop somnolent quand j'ai lu votre commentaire, je suppose. Être au cacao plutôt que le niveau Unix pourrait être un problème: la communication via stdin n'est en grande partie pas la même que la communication par les frappes de frappe. Je suis sûr que je ne sais pas la saisie standard de Safari pour écrire ce commentaire; Et je suis sûr que les programmes UNIX CLI ne répondent pas aux frappes eux-mêmes.


Non - l'interface d'événement Apple ne fonctionne pas directement pour les applications CLI, uniquement cacao (je lisais votre commentaire Re.Scripting ADIUM à l'époque, et c'est une solution qui pourrait fonctionner). Il fournit simplement une manière relativement simple / relativement bien prise en charge pour contrôler les applications de cacao. Plus je comprends ce dont vous avez besoin, plus je pense que votre seule option sera une extension du noyau (avec tout le risque qui implique) développeur.apple.com/mac/library/documentation/darwin/concept ual / ...



6
votes

Juste une pensée, mais ne pouviez-vous pas faire un tuyau et redirier que (nommé) tuyau à l'entrée standard du processus lors du démarrage de ce processus?

environ quelque chose comme P>

mkfifo MYPIPE
Prog < MYPIPE
echo "test" > MYPIPE


3 commentaires

Je ne suis pas celui qui lance le processus, je ne peux donc pas faire cela.


Vous voulez donc que votre plug-in Adium interpose l'entrée d'un autre processus de ligne de commande en cours d'exécution? Vous êtes probablement de retour à la recherche de mach-injection ...


@Alexandermills Vous pouvez simplement l'essayer et découvrir. Mais la réponse est ... mkfifo sort avec code 1 et écrit "mkfifo: mypipe: le fichier existe" à stardr.



5
votes

Si vous exécutez le processus cible sur un terminal, vous pouvez utiliser writevt, dont le code source est ici .

Supposons par exemple que vous exécutez la commande "CAT" sur Terminal TTYS000. P>

sur la borne 1: P>

$ gcc -o writevt writevt.c 


1 commentaires

C'est une belle solution. Combinez-le avec Sudo Chown root: Wheel Writevt et Sudo Chmod 4755 Writevt , vous pouvez utiliser le writevt sans la commande sudo par la suite. Comme décrit ici