Derniers journaux de calandoa :

Journal : Accéder à la mémoire d'un processus

Posté par calandoa () le 24 février 2004
0
Bonjour,

Je cherche à accéder à la mémoire d'un processus, c'est à dire au fichier /proc/PID/mem. Après quelques recherches, il m'a semblé comprendre que l'accès au contenu de ce fichier était assez restreint, mais je n'arrive même pas lire /proc/self/mem quelque soit le programme! Quels sont les règles qui autorisent l'accès à ce fichier?

D'autre part, je crois aussi que pour pouvoir lire le fichier, on ne peut se contenter d'un open() puis d'un read() : il faut aussi choisr une zone de mémiore lisible avec lseek(). Existe-t-il des commandes pouvant faire ça depuis un shell?

> Lire le journal (8 commentaires, moyenne: 1,4).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

Re: Accéder à la mémoire d'un processus

Posté par Boa Treize (page perso, ) le 24/02/2004 à 10:49. (lien). Évalué à 1.

Je n'ai pas la réponse à ta question, mais je me la suis également posée, sans succès. Même en root je n'y suis pas arrivé. Le seul truc que j'ai réussi à faire, c'est des « dd » en série sur la mémoire (sur /proc/kcore, si je me souviens bien), ce qui m'a permis de tout récupérer ou presque, enfin surtout ce que je voulais retrouver.

Re: Accéder à la mémoire d'un processus

Posté par furai (page perso, ) le 24/02/2004 à 11:59. (lien). Évalué à 1.

D'autre part, je crois aussi que pour pouvoir lire le fichier, on ne peut se contenter d'un open() puis d'un read() :

Sisi
open (2) te donne un descripteur de fichier
read (2) te permet de le lire,
et enfin lseek (2) te permet de te balader dans ton fichier un peu comme tu veux

Pour le shell, je ne crois pas.

  • [^]Re: Accéder à la mémoire d'un processus

    Posté par calandoa () le 24/02/2004 à 13:28. (lien). Évalué à 1.

    Oui mais en l'occurence le fichier mem n'est pas ordinaire, il correspond à l'espace mémoire du processus. On va prendre par exemple celui de mon tcsh (/proc/self/maps):
    08048000-08089000 r-xp 00000000 03:01 104219 /bin/tcsh
    08089000-0808c000 rw-p 00041000 03:01 104219 /bin/tcsh
    0808c000-08146000 rwxp 00000000 00:00 0
    40000000-40015000 r-xp 00000000 03:01 61874 /lib/ld-2.3.2.so
    ...
    Donc, d'après ce que j'ai compris, on doit faire un lseek (08048000) pour pouvoir lire le début de la mémoire avec read()... et je cherche donc un moyen de le lire avec une commande accessible depuis un shell.
    -------
    Bon en fait je viens à l'instant de faire un petit essai avec dd qui a reussi :
    dd if=/proc/self/mem ibs=1 skip=134512640 count=10

    (avec l'offset skip correspondant à une adresse de maps en décimal) ça marche mais c'est assez relou à utiliser... le problème restant est que dd ne peut lire que son propre espace mémoire... comment lire celui d'un autre process?

    • [^]Re: Accéder à la mémoire d'un processus

      Posté par Matthieu Moy (page perso, ) le 24/02/2004 à 14:32. (lien). Évalué à 1.

      > comment lire celui d'un autre process?

      1) En faisant explicitement de la mémoire partagée

      2) En étant root

      Heureusement que c'est pas possible autrement !!!

      • [^]Re: Accéder à la mémoire d'un processus

        Posté par calandoa () le 24/02/2004 à 14:52. (lien). Évalué à 2.

        Sauf qu'en étant root ça ne marche pas... et c'est justement ce que je cherche à faire!

        root@tech04 ~# dd if=/proc/4241/mem ibs=1 skip=134512640 count=10
        dd: reading `/proc/4241/mem': No such process

        Et un débugger, il fait comment pour lire la mémoire du prog qu'il lance?

        • [^]Re: Accéder à la mémoire d'un processus

          Posté par Matthieu Moy (page perso, ) le 24/02/2004 à 15:20. (lien). Évalué à 1.

          C'est un processus fils, donc il a des "droits" dessus.

          man ptrace

          en sait plus que moi sur le sujet.

  • [^]Re: Accéder à la mémoire d'un processus

    Posté par Jonathan ILIAS (Jabber id, page perso, ) le 24/02/2004 à 13:37. (lien). Évalué à 1.

    Je crois qu'il parle d'un fichier bien spécifique dans /proc, pas de la sortie d'erreur standard.

Re: Accéder à la mémoire d'un processus

Posté par pappy (page perso, ) le 24/02/2004 à 13:27. (lien). Évalué à 3.


#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>

main(int argc, char **argv)
{
FILE *mem = NULL;
int addr = strtoul(argv[1], NULL, 16);
char str[100];

if ( !(mem = fopen("/proc/self/mem", "r"))) perror("fopen(mem)");
if (fseek(mem, addr, SEEK_SET) < 0) perror("fseek()");
if (! (i = fread(str, 1, sizeof(str)-1, mem))) perror("fread()");
fclose(mem);
printf("fname=(%s) str=(%s) i=(%d)\n", fname, str, i);

return 0;
}

Revenir en haut de page