Derniers journaux de calandoa :
- [15/01@17:04] Comment identifier un encodage?
Journal : Accéder à la mémoire d'un processus
Posté par calandoa () le 24 février 2004Je 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).
Re: Accéder à la mémoire d'un processus
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
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
#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;
}
Les journaux sont destinés à des informations qui ne sont pas suffisamment intéressantes
pour être validées en dépêche (sinon n'hésitez pas à proposer votre information en
dépêche), qui sont sans rapport avec Linux ou le libre, ou simplement pour donner votre
avis. Si vous désirez poser une question, merci d'utiliser 

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.