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

Posté par  .
Étiquettes : aucune
0
24
fév.
2004
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?
  • # Re: Accéder à la mémoire d'un processus

    Posté par  (site web personnel) . É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  (site web personnel) . É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  . É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  (site web personnel) . É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  (site web personnel) . É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;
    }

Suivre le flux des commentaires

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