IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

"Tromper" fopen pour qu'il ouvre un fichier virtuel


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 34
    Points : 44
    Points
    44
    Par défaut "Tromper" fopen pour qu'il ouvre un fichier virtuel
    Bonjour,

    La fonction fopen ouvre a priori un fichier sur un disque.

    Si je crée une zone mémoire quelconque dans un programme C, y a-t-il moyen de l'associer à un nom de fichier "virtuel" qu'on fournirait à fopen pour que l'identificateur FILE * renvoyé ne pointe pas sur un fichier du disque, mais sur la zone mémoire ? L'idée serait que cet identificateur, s'il est fourni à fread, fscanf, ... aille lire les données dans la zone mémoire.

    Merci pour vos réponses.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 628
    Points : 10 553
    Points
    10 553
    Par défaut
    Il me semble que c'est impossible avec la fonction fopen.

    Mais il faut chercher sur les Internets comme open_memstream.
    Je soupçonne que cela doit être spécifique selon le système d'exploitation.

    Édit: il y a peut-être sous Windows CreateFileMapping

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Citation Envoyé par foetus Voir le message
    Mais il faut chercher sur les Internets comme open_memstream.
    Je soupçonne que cela doit être spécifique selon le système d'exploitation.
    Voire même fmemopen(), sur la page que tu cites…

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 34
    Points : 44
    Points
    44
    Par défaut
    Merci de ta réponse.

    Néanmoins, je n'ai pas trop le choix. Je m'explique : je possède une bibliothèque objet dont je n'ai pas les sources et que je ne peux modifier. Cette bibliothèque contient une fonction qu'on doit tester et qui prend en entrée non pas seulement des variables diverses mais aussi un nom de fichier d'un type particulier qu'il lit. Et cette bibliothèque écrite en C standard utilise plus que sûrement fopen ainsi que fread pour lire dedans.

    Autre problème, on doit faire ces tests par quelqu'un d'extérieur à qui on ne peut pas laisser accès aux fichiers pris en entrée car certaines parties, nécessaires, doivent rester confidentielles (ah, l'industrie ! ). Or, ces parties peuvent être renconstituées. L'idée était alors de créer une base sans données confidentielle et faire un exécutable qui génère un fichier temporaire contenant ces données, appeler le module et effacer ensuite le fichier temporaire. La parano étant ce qu'elle est mais nous poussant à la prudence extrême, s'est posé le problème de celui qui casserait l'exécution du programme et qui donc aurait accès au fichier tempoarire avec les données secrètes et pourrait ainsi les vendre à la concurrence, la Chine, la Russie ou aux Pingouins d'Antarctique. Bonjour la prise de tête.

    Bref, j'avais donc pensé à ce système de simuler un fichier en mémoire qui disparaîtrait en cas de kill -9 ou de Ctrl-C mal intentionné...

    Si ce n'est pas possible, il restera juste à éliminer le testeur à la fin de son travail .

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Je suppose que tu travailles sous Linux.

    Citation Envoyé par olivier_u Voir le message
    Néanmoins, je n'ai pas trop le choix. Je m'explique : je possède une bibliothèque objet dont je n'ai pas les sources et que je ne peux modifier. Cette bibliothèque contient une fonction qu'on doit tester et qui prend en entrée non pas seulement des variables diverses mais aussi un nom de fichier d'un type particulier qu'il lit. Et cette bibliothèque écrite en C standard utilise plus que sûrement fopen ainsi que fread pour lire dedans.
    Utilise déjà ptrace et strace pour voir si c'est vrai.
    Ensuite, tu peux utiliser la variable d'environnement LD_PRELOAD pour que ton programme soit lié en premier lieu aux bibliothèques dynamiques de ton crû avant les autres. Tu pourras alors y définir une fausse fonction fopen() qui s'appuiera éventuellement sur les autres.

    Tu peux aussi tricher en créant à l'avance le fichier en question en tant que tube nommé ou socket associé à un autre programme qui, lui, contrôlera et enverra les données que tu veux que ton programme reçoive (ça risque de poser problème en cas de fseek()/rewind(), cela dit).

    Autre problème, on doit faire ces tests par quelqu'un d'extérieur à qui on ne peut pas laisser accès aux fichiers pris en entrée car certaines parties, nécessaires, doivent rester confidentielles (ah, l'industrie ! ). Or, ces parties peuvent être renconstituées. L'idée était alors de créer une base sans données confidentielle et faire un exécutable qui génère un fichier temporaire contenant ces données, appeler le module et effacer ensuite le fichier temporaire. La parano étant ce qu'elle est mais nous poussant à la prudence extrême, s'est posé le problème de celui qui casserait l'exécution du programme et qui donc aurait accès au fichier tempoarire avec les données secrètes et pourrait ainsi les vendre à la concurrence, la Chine, la Russie ou aux Pingouins d'Antarctique. Bonjour la prise de tête.

    Bref, j'avais donc pensé à ce système de simuler un fichier en mémoire qui disparaîtrait en cas de kill -9 ou de Ctrl-C mal intentionné...
    Ça ne servira à rien : un utilisateur averti reste toujours maître de sa machine et heureusement. Pour explorer le contenu de la mémoire d'un processus, il suffit de l'arrêter en cours d'exécution avec un débogueur comme gdb et de faire un dump des parties qui nous intéressent. Il est même possible d'accéder à cela via /proc/<PID du programme> et, en dernier recours, de faire une copie de /proc/kcore pour faire un snapshot de la mémoire entière et l'examiner à tête reposée.

    Si ce n'est pas possible, il restera juste à éliminer le testeur à la fin de son travail .
    Blague à part, c'est plutôt par cela qu'il faut commencer : pas par liquider le testeur bien sûr, mais à évaluer la probabilité qu'il en rentre en possession, ainsi que les risques et les pertes si jamais l'utilisateur y arrive effectivement. Souvent, la valeur des données à protéger reste inférieure au coût du système de sécurité à mettre en place. Et si c'est VRAIMENT trop sensible, alors il ne faut pas les diffuser du tout mais, au contraire, les protéger dans un datacenter blindé au trente-sixième sous-sol. Et si l'enjeu vaut effectivement d'investir dans de telles infrastructures, alors le plus simple consiste à mettre en place un serveur d'entreprise interrogé à distance qui, lui, fera les traitements et servira les informations nécessaires en fonction des données restées confidentielles. Et le plus beau, c'est que ce sera cent fois plus simple à mettre à jour.

    Dans tous les cas, il s'agit de politique générale et de conception, qui doivent être menées en amont pour orienter ensuite le sens du développement.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 34
    Points : 44
    Points
    44
    Par défaut
    Bonsoir,

    N'étant pas revenu depuis six ans, j'adresse des remerciements tardifs à ceux qui m'ont conseillé.
    Bonne année à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL] magic quotes ou double apostrophes pour échapper apostrophe
    Par zorian dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 13/03/2006, 16h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo