2009-06-23 6 views
1

J'ai une petite application de ligne de commande écrite en C qui agit comme un wrapper/lanceur pour d'autres programmes (think: xargs). L'application est écrite pour compiler sur FreeBSD/Linux (via fork()/exec()) et Windows (CreateProcess()). En plus de pouvoir intercepter, injecter ou manipuler les arguments de ligne de commande de l'application enfant, je me demandais s'il existait un moyen facile d'intercepter l'activité du système de fichiers du programme enfant (ou les enfants, etc.). Je m'intéresse principalement aux noms de fichiers accédés pour lire ou écrire, mais pas au contenu de ces fichiers, et je voudrais que l'interception soit aussi légère que possible. En recherchant quelques mots-clés pertinents ci-dessus, il semble y avoir plusieurs façons de le faire dans Win32. Des pilotes de filtre de système de fichiers à la falsification des en-têtes de table d'importation PE. Aucun d'entre eux ne semble trivial ou quelque chose que je pourrais contenir dans l'exécutable de mon programme wrapper (par exemple, la plupart nécessiterait des DLL ou des fichiers pilotes supplémentaires à côté de l'exécutable principal.) J'aimerais aussi que cela fonctionne sur Windows XP à 7 , sans avoir à pirater UAC ou d'autres deltas de plate-forme. Sur mon système Linux, il y a inotify(), mais il surveille l'accès général au système de fichiers sans se soucier UNIQUEMENT de mon/mes processus fils. La même chose vaut pour kqueue de FreeBSD(). Ceux-ci se décomposent également dans les cas SMP où plusieurs instances de l'encapsuleur peuvent exécuter des programmes différents, et chacun doit désambiguïser l'activité du système de fichiers de son propre enfant les uns des autres.Méthode d'interception de l'activité du système de fichiers du processus enfant

J'apprécierais certainement toutes les suggestions que la communauté SO pourrait avoir à offrir.

Répondre

0

Ecrivez une bibliothèque "interposer" qui connecte votre fopen et définissez la variable d'environnement LD_PRELOAD pour tous les processus enfants. Cela fonctionne avec des bibliothèques dynamiquement liées tu.

Exemple de comment faire cela se trouve ici: http://developers.sun.com/solaris/articles/lib_interposers.html et http://lists.debian.org/debian-powerpc/2004/11/msg00039.html montre une mise en œuvre partielle pour interposeur fopen() ..

+0

Si vous voulez suivre cette route, il serait probablement mieux d'intercepter les appels système qui accèdent au système de fichiers. open(), creat(), chmod(), exec *(). Il peut y avoir d'autres. –

+0

^vrai, tous écrire un tel wrapper avec des implémentations pour open(), fopen(), fdopen(), freopen() devrait couvrir beaucoup de cas. – rasjani

+0

Cette approche semble être la plus simple, avec le seul inconvénient étant que j'ai besoin d'avoir un fichier de bibliothèque partagé 'interceptor' séparé en plus de mon exécutable. Existe-t-il un mécanisme équivalent à LD_PRELOAD sur les plateformes Win32? – Optigrab

3

La seule suggestion que je voudrais faire est d'utiliser strace (appels système de suivi et de signaux), bien que ce soit plus d'un outil de débogage, et n'a aucune incidence sur les performances du processus étant tracé

strace -f -e trace=file -o <output-file> <cmd-line> 

-f - follow forks 
-e trace=file - will output system calls related to the file-system 
-o <output-file> 

à mon humble avis - Si vous vous familiarisez avec strace, il est toujours un outil utile à avoir dans l'arsenal.

+0

Merci, Beano. J'ai utilisé strace, mais je ne connaissais pas le -e trace = raccourci de fichier ... très pratique. Malheureusement, la pénalité de performance est un peu élevée, car elle utilise ptrace (2) sous le capot. – Optigrab

Questions connexes