Bien le bonjour,
Je suis étudiant en informatique, et j'ai un projet dans lequel il faut coder un mini-shell, qui réimplémente "open", pour effectuer divers traitements.
Pour le codage du shell, OK ça va, pas de problèmes.
Le chargement et la compilation de la librairie dynamique qui redéfinit "open" avec LD_PRELOAD, ça roule (ça a l'air en tout cas).
Par contre après avoir testé, rien, le néant, pas de réaction, comme si mon "open" n'existait pas.
Hélas, je venait de brutalement apprendre qu'il y avait "open" et "open", la libc nous cache des choses...
D'après ce que j'ai compris, le "open" de la libc n'est qu'une fonction (section 3 du man), une pâle copie du véritable appel système qui lui est codé en asm, mais qui d'après ce que j'ai lu appelle le syscall presque immédiatement, elle effectue juste 2-3 verifications avant ça (merci de me corriger si je me trompe).
Apparemment on appelle ça un wrapper, pour nous éviter d'avoir à utiliser nous-même "syscall" si j'ai bien compris.
Et donc là est mon problème : ma fonction "open" sera utilisée lorsqu'une commande fera appel à open(3), mais si cette commande utilise directement le syscall, ben mon beau "open" customisé ne sert à rien, on n'y passe jamais. Et apparemment c'est le cas pour toutes les commandes utiles/interessantes du shell.
La seule chose que j'ai constatée, c'est que lorsque j'utilise une commande svn (ou man), du style "svn log", là mon "open" est pris, et du coup je vois toutes les ouvertures de fichiers (vu que je "printf" les arguments pour tester mon "open"). Du coup ben super, c'est marrant, je comprends bien que "svn" utilise le open(3) mais ça m'avance pas plus.
Du coup voila ou j'en suis, je cherche comment faire pour intercepter, ou redéfinir cet appel système...et c'est donc là que j'ai besoin de votre aide ^^
Bon je ne demande pas une solution toute faite, mais juste une piste, quelque chose pour m'aiguiller.
En fait, il faut "juste" que la commande passe par mon "open", c'est tout ^^.
Pour l'instant je regarde du coté de "ptrace", donc suivi de l'exécution d'un processus, et de ce qu'il a en mémoire, mais je patauge quand même...
Merci d'avance à ceux qui prendront la peine de me lire ! (et de me répondre bien sur ;-)
Partager