[Unix] Accéder directement à la mémoire

Vladounette -  
 Vladounette -
Yop,

Dans le cadre d'un projet sur la fiabilité des logiciels, j'ai besoin de tester la réaction d'un programme face à des injections de fautes dans la mémoire.

Donc exemple concret, j'ai fait un programme tout bête qui affiche la valeur d'une variable toutes les 10 secondes, je voudrais, sans toucher au code de ce programme, et durant son exécution, modifier la valeur de la variable.
Le problème étant que d'autres process ne peuvent pas accéder à l'espace mémoire de ce programme. J'ai tenté de lancer le programme (par la commande system()) dans un thread, mais justement la commande system() crée de toutes façons un nouveau process, et donc un nouvel espace mémoire inacessible.

Je pensais qu'avec des droits root ça fonctionnerait, mais j'ai toujours une seg fault.

Au pire je ferai le projet sous Windows, il y a moins de compartimentatiion, mais bon, je suis plus à l'aise sous Linux, donc si quelqu'un a une idée, même juste un embryon de solution ça m'aiderait bien.

Merci d'avance, si je n'ai pas été assez clair n'hésitez pas à demander.

++

Vladounette
A voir également:

3 réponses

jipicy Messages postés 41342 Statut Modérateur 4 896
 
Salut,

Sans aucune conviction ni connaissance dans la matière, peut être voir du côté de "mmap"...

Voilà ce que j'ai trouvé sur le net à ce sujet :
L'appel système mmap(2) permet d'associer (dans son intégralité ou partiellement) un fichier désigné par son descripteur à une zone de mémoire d'un processus. Il est alors possible d'accéder au contenu du fichier directement à l'aide d'opérations de lecture et/ou d'écriture en mémoire : un fichier ainsi mappé est vu comme un tableau d'octets. L'effet des opérations d'écriture sur le fichier initial est contrôlé par un drapeau dont la signification est la suivante :

    * MAP_SHARED signifie que les opérations d'écriture dans la zone de mémoire correspondant au fichier mappé affectent directement le contenu du fichier initial.

    * MAP_PRIVATE signifie que les opérations d'écriture dans la zone de mémoire correspondant au fichier mappé s'effectuent sur une copie privée du contenu du fichier. Le fichier lui-même n'est dans ce cas pas altéré.

L'appel système munmap(2) supprime le mapping du fichier en mémoire.
Source : par ici...

;-))
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
Regarder du côté de ptrace aussi. C'est une fonction de debbugage qui permet de faire tout et rien.
Par exemple la requête PTRACE_PEEKUSR permet d'écrire dans l'image memoire du processus indiqué...
https://fst-informatique.univ-lyon1.fr/

0
Vladounette
 
Yop, merci pour les réponses.

J'ai regardé un peu ptrace (pour mmap, ça ne correspond pas, en fait je voudrais limite faire l'inverse, à savoir accéder à de la mémoire comme dans un fichier). Le problème est apparemment le même que pour les fork et threads, le partage de mémoire n'est possible qu'entre un père et son (ou ses fils).

Le truc est que le programme que je veux lancer se fera dans un nouveau process automatiquement, en tous cas je ne connais que la commande system() pour faire ça. S'il est possible de lancer un programme externe en tant que fils ça résolverait le tout...

Donc bon, je bute toujours.
0