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 :

comment voir et modifier les membres d'une structure ?


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut comment voir et modifier les membres d'une structure ?
    Messieurs bonsoir,
    je voudrais voir et modifier les membres d'un structure "proc" qui est associée à un process m'appartenant; j'ai accès à l'adresse de cette structure de la façon suivante et voici ce que ça me donne :

    $ ps -o user,pid,addr,args -p $$
    USER PID ADDR COMMAND
    st13277 25588 30029089570 /bin/ksh

    Le problème qui se pose alors à moi est que cette adresse est un si grand nombre que atoi(argv[1]) ne marche pas, ni même atoll().
    Je passe cette chaine en argument à un programme en C et c'est pour ça qu'il y a du argv[1] ci dessus.
    Dans quel type de variable ce nombre peut-il être contenu ?

    Il sagit de l'adresse en mémoire du début d'une structure contenant certaines données relatives à mon process, mais si on compte un octet par unité, cette valeur correspond grosso-modo à 30 Go. (30 029 089 570)

    Est-il possible par ailleurs que la machine sur laquelle je bosse (une sunfire 68000 sous sunOS 5.8) ait autant de mémoire ? (cette quantité me parait digne des machines expérimentales ou très très gourmandes et fortement dotées)

    Si j'arrive à rentre ce nombre dans une variable addr, comment voir ce qui est contenu à cette adresse ?
    Pour un entier, je ferais int *paddr;
    puis paddr=addr;
    puis printf("*paddr=%d\n", *paddr);

    Est-ce correct ?
    Merci,
    David (qui patine encore avec les pointeurs et les adresses en mémoire)
    P.S. Dis Toto, pourquoi l'univers existe-t'il ?
    Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se causer avant.

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Je ne connait pas les machines sun (je bosses sur AIX) mais un long long est la pluspart du temps 64 bits, ce qui veut dire que tu peux stocker dedans des valeurs de 18 chiffres... Ton truc devrait rentrer dedans sans problème.

    Celà dit les fonction ato* sont à éviter puisqu'elles ne permettent pas de détecter proprement les erreurs. Utilises plutôt strtoll.

    Pour afficher un long long avec printf, c'est "%lld" (ou %llu en non signé).

    Pour ce qui est des 30 Go, deux choses :

    1) Je ne sait pas à quoi correspond cette valeur "addr", mais il y a des chances que se soit une adresse virtuelle (en fait c'est quasiment sûr, je vois mal ps afficher des adresses physiques). Suivant comment solaris gère la mémoire, tu peux très bien avoir des adresses virtuelles super grandes, qui correspondent à des adresses physiques basses. Donc même si tu n'a que 2 Go de mémoire, tu peux très bien avoir des adresses virtuelles de l'ordre du milliard de milliard. Ca ne veut strictement rien dire.

    2) Même en parlant de mémoire physique, 30 Go, ce n'est pas complètement hallucinant. Sous AIX, sur certaines machines, il est possible d'utiliser des pages de 16 Go et des segments de 1 To. Certains en ont l'utilité... Ce qui veut dire qu'ils on plus de 1 Tera octet de mémoire.

  3. #3
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut
    Re-bonsoir,
    je viens de voir sur le site de wikipedia que cette foutue bécane pouvait en fait tourner avec jusqu'à 384 Gigas de mémoire (et ça va jusqu'à 576 pour d'autres modèles n'étant pourtant pas les plus récents). Donc l'adresse que je lis n'est peut être pas fausse, surtout si on envisage que c'est du 64 bits, donc huit octets.
    Par ailleurs, sur la page qui détaille le travail de recherche des informations dans les structures "proc" et "cred", il apparait aussi le préfixe "3000" au début des adresses.
    Mais comment faire pour rentrer cette gigantesque adresse dans une variable en C, et quel type de variable utiliser, et comment aller lire ce qui s'y trouve ?
    Je cherche un peu tout seul de mon côté, mais je ne suis pas contre quelque aide !
    David
    PS, bonsoir matafan, je viens de voir ta réponse en voulant relire mon post.
    Ok pour le 64 bits; j'y pensais aussi ci dessus.
    Ok pour le strtoll, j'essaierai ça demain au boulot.
    Ok pour %lld et %llu, ce sont des trucs pourtant basiques que je ne connais même pas puisque je bosse avec du fortran.
    Ok pour la mémoire virtuelle; de toute façon si j'ai un pointeur qui y va (un long long ?) je suppose que l'OS saura me répondre le contenu de la case, même si elle n'est pas réelle.
    En tous cas merci, ça me fait plusieurs choses à vérifier demain et je pourrai en donner le résultat ici et les nouvelles interrogations que je ne devrais pas manquer d'avoir.
    Merci,
    David
    P.S. Dis Toto, pourquoi l'univers existe-t'il ?
    Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se causer avant.

  4. #4
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut
    Salut matafan,
    Alors j'ai essayé le strtoll, pour obtenir un long long d'après une chaine de catactères, et ça marche YOUPI.
    Mais comment faire pour voir la valeur des termes de la structure qui commence à cette adresse là ?
    J'ai fait un #include de .../proc.h, donc le format de cette structure est connu du programme, mais qu'ai-je comme affichage en demandant des printf des membres de cette structure ?

    Il m'affiche le contenu de la mémoire, selon le format de cette structure, mais l'adresse de départ de cet affichage est n'importe quoi.

    voici le code de ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    // gcc cred.c -o cred
    // ./cred 30029089570
    //
    //   rappels sur les pointeurs :
    // &truc est l'adresse de truc
    // ptruc = &truc, l'adresse en question.
    // ptruc prend la même place qu'un entier, quel que soit
    // le type de l'objet sur lequel il pointe.
    // int *ptruc; // ici, il pointera sur un entier.
    // int n=10;   // n est un entier initialisé à 10.
    // ptruc=&n;   // ptruc pointe sur n.
    // *ptruc+=5;  // l'objet sur lequel pointe ptruc est augémenté de cinq.
    // à partir d'ici, n vaut quinze.
    //
    // ps -o user,pid,addr,args -p $$
    //  (si $$ est le PID de la shell en cours)
    //
    // $ more /local/patch/Solaris/8_Recommended/108528-29/SUNWhea/reloc/usr/include/sys/proc.h
    // [...]
    // typedef struct proc {
    //         /*
    //          * Fields requiring no explicit locking
    //          */
    //         struct  vnode *p_exec;          /* pointer to a.out vnode */
    //         struct  as *p_as;               /* process adr_process space pointer */
    //         struct  plock *p_lockp;         /* ptr to proc struct's mutex lock */   
    //         kmutex_t p_crlock;              /* lock for p_cred */
    //         struct  cred    *p_cred;        /* process credentials */
    // [...]
    //
    // find / -name cred.h -print -exec echo {} \;
    // $ more /usr/include/sys/cred.h 
    // [...]
    // typedef struct cred {
    //         uint_t          cr_ref;         /* reference count */
    //         uid_t           cr_uid;         /* effective user id */
    //         gid_t           cr_gid;         /* effective group id */
    //         uid_t           cr_ruid;        /* real user id */
    //         gid_t           cr_rgid;        /* real group id */
    //         uid_t           cr_suid;        /* "saved" user id (from exec) */  
    // [...]
    //
    // From this it is apparent that the pointer to the credential structure is
    // located 24 bytes into the proc struct. In the above example that means the
    // pointer is at 0xf5e09000 + 0x18 = 0xf5e09018.  The credential struct is
    // listed in /usr/include/sys/cred.h.  From this we note that the effective user
    // id is 4 bytes into the cred structure.
    //
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "/local/patch/Solaris/8_Recommended/108528-29/SUNWhea/reloc/usr/include/sys/proc.h"
    #include "/usr/include/sys/cred.h"
    //
    main(int argc, char *argv[])
    {
        int uid, adr_uid, *p_uid;
        long long adr_sproc;
        long long adr_scred;
        struct proc st_proc;
        struct cred st_cred;
        printf("\n\tHello, cred !\n\n");
        // $ ps -o user,pid,addr,args -p $$
        printf("adr_sproc=%s (s)\n", argv[1]); // ceci est la chaine d'adresse de la stucture proc.
        // 
        adr_sproc=strtoll(argv[1], &argv[1], 0);
        printf("adr_sproc=%lld (lld)\n", adr_sproc); // ceci est l'adresse décimale la stucture proc.
        printf("adr_sproc=  %llx (llx)\n\n", adr_sproc); // ceci est l'adresse hexa de la stucture proc.
        // 
        printf("&st_proc         =%x\n\n", &st_proc); // ceci est l'adresse de st_proc. mais ???
        printf("st_proc->*p_exec =%x\n", st_proc.p_exec);
        printf("st_proc->*p_as   =%x\n", st_proc.p_as);
        printf("st_proc->*p_lockp=%x\n", st_proc.p_lockp);
        printf("st_proc.p_crlock =%x\n", st_proc.p_crlock);
        printf("st_proc->p_cred  =%x\n\n", st_proc.p_cred); // ceci est le pointeur vers st_cred.
        //
        printf("&st_cred         =%x\n\n", &st_cred); // ceci est l'adresse de st_cred. mais ???
        printf("st_cred.cr_ref   =%d\n", st_cred.cr_ref);
        printf("st_cred.cr_uid   =%d\n", st_cred.cr_uid);
        printf("st_cred.cr_gid   =%d\n", st_cred.cr_gid);
        printf("st_cred.cr_ruid  =%d\n", st_cred.cr_ruid);
        printf("st_cred.cr_rgid  =%d\n", st_cred.cr_rgid);
        printf("st_cred.cr_suid  =%d\n\n", st_cred.cr_suid);
    }
    //
    // gcc cred.c -o cred
    /*
    Et voici le résultat que cela donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    $ ./cred 30029089570
     
            Hello, cred !
     
    adr_sproc=30029089570 (s)
    adr_sproc=30029089570 (lld)
    adr_sproc=  6fddf8b22 (llx)
     
    &st_proc         =ffbee6c8
     
    st_proc->*p_exec =ffbee6f0
    st_proc->*p_as   =ff33d00c
    st_proc->*p_lockp=1
    st_proc.p_crlock =ffbee698
    st_proc->p_cred  =ff3df470
     
    &st_cred         =ffbee6a0
     
    st_cred.cr_ref   =0
    st_cred.cr_uid   =0
    st_cred.cr_gid   =0
    st_cred.cr_ruid  =0
    st_cred.cr_rgid  =-13867848
    st_cred.cr_suid  =0
    Comment faire pour qu'il m'affiche réellement ce qui est contenu en mémoire après l'adresse adr_sproc (selon le format d'une structure proc), puis ce qu'il y a après st_proc.p_cred que j'aurai eu précédemment. (et qui est une structure cred)

    Merci,
    David
    P.S. Dis Toto, pourquoi l'univers existe-t'il ?
    Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se causer avant.

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Mais comment faire pour rentrer cette gigantesque adresse dans une variable en C, et quel type de variable utiliser, et comment aller lire ce qui s'y trouve ?
    Le seul type possible est un pointeur. Si ça ne rentre pas dans un pointeur, c'est que cette adresse n'est pas valide en C.

    Si on obtient effectivement l'adresse d'une structure proc, ce pointeur doit être un pointeur sur cette structure : struct proc * p;
    On pourra ensuite normalement accéder à ses champs
    p->p_exec
    p->p_as
    ....
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Comme je l'ai dis je ne connais pas solaris, mais à mon avis ADDR est une adresse "vue du kernel", pas de ton process. Tu ne peux probablement pas accéder à ta structure proc simplement en allant lire à l'adresse ADDR dans ton process.

    Est-ce qu'il y a un fichier /dev/kmem sous solaris ? Si oui, à mon avis tu dois aller lire ce device à l'offset ADDR. Tu peux faire ça avec un lseek ou un lseek64.

    Mais bon, je pense qu'il y d'autres moyens qu'aller lire /dev/kmem pour accéder aux infos que tu veux. Il y a probablement un system call qui peut te renvoyer ce que tu cherches.

  7. #7
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut
    pour diogène,
    la grande adresse que j'ai lue est donc dans adr_sproc;
    me suffirait-il donc alors de faire :
    #include .../proc.h
    struct proc *p;
    p=adr_sproc;
    printf("p.p_exec=%llx\n",p->p_exec);
    printf("p.p_as=%llx\n",p->p_as);
    pour avoir les deux premiers membres ? (à supposer que ce soient aussi des long long)

    pour matafan,
    j'essaierai de penser demain à regarder s'il y a du /dev/kmem sur la machine, mais je n'en ai pas le souvenir bien que je sois allé voir sous /dev, mais sans m'y attarder.
    Et j'essaierai aussi de piger si ma structure y est contenue.

    Merci à vous deux, (et bonjour Emmanuel)
    David
    P.S. Dis Toto, pourquoi l'univers existe-t'il ?
    Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se causer avant.

  8. #8
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Citation Envoyé par dva2tlse Voir le message
    pour diogène,
    la grande adresse que j'ai lue est donc dans adr_sproc;
    me suffirait-il donc alors de faire :
    #include .../proc.h
    struct proc *p;
    p=adr_sproc;
    printf("p.p_exec=%llx\n",p->p_exec);
    printf("p.p_as=%llx\n",p->p_as);
    pour avoir les deux premiers membres ? (à supposer que ce soient aussi des long long)
    Oui c'est ça (en supposant que tu soit effectivement sensé lire à l'addresse adr_sproc de ton process, ce dont je doute fortement).

    Attention, si tu fais ce genre de choses et que ton kernel est 64 bits, il faut également que tu compiles ton appli en 64 bits. Sinon tu ne lira pas aux bons offsets dans la structure (sans compter que tu n'ira de toute façon pas chercher la structure au bon endroit puisque ton pointeur p ne contiendra que la moitié faible de adr_sproc).

  9. #9
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut
    Salut matafan,
    alors aujourd'hui je suis allé voir s'il existait un /dev/kmem sur la machine qui stocke mes fichiers (pour mémoire : $ uname -a -> SunOS machine 5.8 Generic_117350-14 sun4u sparc SUNW,Sun-Fire) et ça dit ça :
    $ ls -l /dev/kmem
    lrwxrwxrwx 1 root other 27 Aug 13 2007 /dev/kmem -> ../devices/pseudo/mm@0:kmem

    Mais je ne sais pas du tout quoi en faire pour y voir le contenu des structures qui m'intéressent. Qu'appelles tu aller lire ce device à l'offset ADDR, avec un lseek ou un lseek64 ? (c'est un peu chinois pour moi)

    Par contre j'ai essayé en C d'aller voir ce qui se cache dans la structure proc associée à ma shell, dont j'ai l'adresse par :
    $ ps -o user,pid,addr,args -p $$
    USER PID ADDR COMMAND
    st13277 25588 30029089570 /bin/ksh
    $

    Je sais maintenant mettre ceci, qui est probablement un pointeur 64 bits, dans une variable adr_sproc de type long long. Mon programme en C s'appelle cred.c et j'obtiens à la compilation
    cred.c: In function `main':
    cred.c:65: incompatible types in assignment
    l'"assignement" en question est "p=adr_sproc;" et il est logique que les types ne collent pas puisque p est déclaré comme un pointeur sur une structure "proc" alors que adr_sproc est de type long long.
    Je voudrais cependant que le pointeur pointe sur ma structure "proc" qui commence à l"adresse adr_sproc, puis accéder aux valeurs des deux premiers membres de la structure "proc" par :
    printf("p.p_exec=%llx\n",p->p_exec);
    printf("p.p_as=%llx\n",p->p_as);
    Comment faire pour mettre dans le pointeur p l'adresse de la structure "proc" dont le contenu m'intéresse ?

    Est il possible d'aller lire dans la mémoire, pourvu que ce soit une section sur laquelle on ait le droit de lecture, à l'adresse qu'on veut ? Quitte à lire en hexa, je peux me débrouiller pour le reconvertir de façon lisible ? (ce serait une sorte de dump hexa de la mémoire, ou du /dev/kmem dont tu me parles)
    David
    P.S. Dis Toto, pourquoi l'univers existe-t'il ?
    Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se causer avant.

  10. #10
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Citation Envoyé par dva2tlse Voir le message
    Salut matafan,
    alors aujourd'hui je suis allé voir s'il existait un /dev/kmem sur la machine qui stocke mes fichiers (pour mémoire : $ uname -a -> SunOS machine 5.8 Generic_117350-14 sun4u sparc SUNW,Sun-Fire) et ça dit ça :
    $ ls -l /dev/kmem
    lrwxrwxrwx 1 root other 27 Aug 13 2007 /dev/kmem -> ../devices/pseudo/mm@0:kmem

    Mais je ne sais pas du tout quoi en faire pour y voir le contenu des structures qui m'intéressent. Qu'appelles tu aller lire ce device à l'offset ADDR, avec un lseek ou un lseek64 ? (c'est un peu chinois pour moi)
    Tu fais un truc du genre (c'est juste pour donner l'idée, en vrai il faut tester les erreurs) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct proc myproc;
    int kmem = open("/dev/kmem", O_RDONLY);
    lseek(kmem, adr_sproc, SEEK_SET);
    read(kmem, &myproc, sizeof myproc);
    Et avec un peu de chance tu te retrouve avec la structure proc de ton process dans myproc.
    Citation Envoyé par dva2tlse Voir le message
    Par contre j'ai essayé en C d'aller voir ce qui se cache dans la structure proc associée à ma shell, dont j'ai l'adresse par :
    $ ps -o user,pid,addr,args -p $$
    USER PID ADDR COMMAND
    st13277 25588 30029089570 /bin/ksh
    $

    Je sais maintenant mettre ceci, qui est probablement un pointeur 64 bits, dans une variable adr_sproc de type long long. Mon programme en C s'appelle cred.c et j'obtiens à la compilation
    cred.c: In function `main':
    cred.c:65: incompatible types in assignment
    l'"assignement" en question est "p=adr_sproc;" et il est logique que les types ne collent pas puisque p est déclaré comme un pointeur sur une structure "proc" alors que adr_sproc est de type long long.
    Je voudrais cependant que le pointeur pointe sur ma structure "proc" qui commence à l"adresse adr_sproc, puis accéder aux valeurs des deux premiers membres de la structure "proc" par :
    printf("p.p_exec=%llx\n",p->p_exec);
    printf("p.p_as=%llx\n",p->p_as);
    Comment faire pour mettre dans le pointeur p l'adresse de la structure "proc" dont le contenu m'intéresse ?
    Il faut caster :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p = (struct proc *)adr_sproc;
    Citation Envoyé par dva2tlse Voir le message
    Est il possible d'aller lire dans la mémoire, pourvu que ce soit une section sur laquelle on ait le droit de lecture, à l'adresse qu'on veut ?
    Tu ne peux pas aller lire n'importe où et espérer que ça marche. Je crois beaucoup plus au coup du /dev/kmem, qu'a ton histoire d'aller lire dans ton address space directement à l'adresse adr_sproc.

  11. #11
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut
    Ouiais SUPER; merci de m'avoir répondu aussi vite; je suis en train de manger et d'écouter la radio sur mon PC, mais je vois aussi tranquillement qu'il y a du nouveau par ici; alors je vais faire de petits essais divers au boulot demain et je viendrai dire par ici ce que ça aura donné.
    Bon, je viens de relire ton post à la recherche d'interrogations éventuelles de ma part, mais tout me parait clair; alors à demain, je pense que j'aurai pas mal avancé grace à tes indications,
    bonsoir et merci encore,
    David
    PS. "Et avec un peu de chance tu te retrouve avec la structure proc de ton process dans myproc." ...ça ce serait super !
    PS2. Ah si, je viens de me faire une remarque concernant tes indications; je suppose forcément que le /dev/kmem n'est pas un lien vers un quelconque "device" comme un disque à cause de la vitesse; donc les "/dev" peuvent être un peu ce que l'on veut.
    P.S. Dis Toto, pourquoi l'univers existe-t'il ?
    Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se causer avant.

  12. #12
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par dva2tlse Voir le message
    PS2. Ah si, je viens de me faire une remarque concernant tes indications; je suppose forcément que le /dev/kmem n'est pas un lien vers un quelconque "device" comme un disque à cause de la vitesse; donc les "/dev" peuvent être un peu ce que l'on veut.
    Oui, dans /dev, on trouve des devices (dans le sens général) et donc des disques durs, mais aussi les process et encore la mémoire et la cpu et les cartes PCI et plein d'autres choses encore
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  13. #13
    Membre habitué
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Points : 180
    Points
    180
    Par défaut
    Oui en effet, /dev/kmem semble bien contenir ce que je veux voir. Mais je ne l'ai lu qu'une première fois pour accéder à ma structure "proc" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    main(int argc, char *argv[])
    {
        int kmem = open("/dev/kmem", "r");
        long long adr_sproc;
        struct proc myproc;
        adr_sproc=strtoll(argv[1], &argv[1], 0); // enfournage de la chaine ascii dans un long long.
        printf("adr_sproc         =%lld (%%lld)\n", adr_sproc); // ceci est l'adresse décimale la stucture proc.
        printf("adr_sproc         =%llu (%%llu)\n\n", adr_sproc); // ceci est l'adresse u-s de la stucture proc.
        lseek64(kmem, adr_sproc, SEEK_SET);
        read(kmem, &myproc, sizeof myproc); // Et avec un peu de chance tu te retrouves avec
        //                                  // la structure proc de ton process dans myproc.
        // accès aux membres :
        printf("myproc.p_exec     =%llu (%%llu)\n" ,myproc.p_exec);
        printf("myproc.p_as       =%llu (%%llu)\n", myproc.p_as);
        // et aussi ensuite :
        printf("myproc.p_lockp    =%llu (%%llu)\n", myproc.p_lockp);
        // le  membre suivant ne m'intéresse pas non plus : kmutex_t p_crlock; /* lock for p_cred */
        //
        printf("myproc.p_cred     =%llu (%%llu)\n\n",myproc.p_cred); // ce cinquième membre de "proc"
        //                                                      //  est un pointeur vers "cred".
    Ensuite par contre, ce dernier membre de la structure "proc", myproc.p_cred, est un pointeur vers la structure cred qui m'intéresse aussi; donc est-ce que je peux la lire de la façon suivante ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        adr_scred=myproc.p_cred;
        lseek64(kmem, adr_scred, SEEK_SET);
        read(kmem, &mycred, sizeof mycred);
    Je suis assez peu sûr que l'offset avec lequel on vient chercher "mycred" dans kmem soit le bon, ni même son type puisque j'hésite entre int et long long, alors qu'il est défini dans la structure "proc" comme étant un pointeur vers une structure "cred"; que faire ?

    Deuxième question, toujours relative à mes structures et la mémoire; la première instruction de mon code vient ouvrir le psendo-device /dev/kmem comme un fichier, en "read". Serait il possible de l'ouvrir aussi en "write", pour les seules sections qui m'appartiennent évidemment.
    (je ne sais pas si ce open("/dev/kmem", "r") m'ouvre la totalité de la mémoire ou seulement ce qui m'est affecté)(mais il serait quand même étonnant, voire anormal, que j'aie accès à toute la mémoire)
    Donc j'aimerais avoir accès à "ma" mémoire en écriture; est-ce possible ? (avec le "r+" ???)

    J'ai posé la question à l'admin du réseau où je bosse (celui que j'ai connu à l'école, non pas maternelle mais celle d'ingénieurs de Besançon, où j'étais avec lui il y a plus de vingt ans, et où on se disait déjà entre nous de façon anachronique qu'il ne faudrait pas qu'Émmanuel "dépollutionne" trop cette phrase), et il m'a parlé de la fonction ptrace; est-ce nécessaire d'en arriver là puisque ce que j'en ai lu dans le "man" me parait assez obscur et compliqué... !
    Donc je fais des essais, et j'en suis à essayer d'ouvrir une shell qui resterait intéractive alors que mon programme en C triturerait en mémoire les structures qui lui sont associées.
    Merci de m'avoir aidé à avancer jusqu'ici,
    David
    P.S. Dis Toto, pourquoi l'univers existe-t'il ?
    Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se causer avant.

Discussions similaires

  1. Réponses: 11
    Dernier message: 03/08/2010, 17h19
  2. Tri à bulle sur les membres d'une structure
    Par Jérôme.O[76] dans le forum C++
    Réponses: 3
    Dernier message: 02/10/2008, 14h29
  3. Problème avec les membres d'une structure
    Par doderic dans le forum C
    Réponses: 19
    Dernier message: 12/08/2008, 20h27
  4. initialiser les membres d'une structure
    Par molesqualeux dans le forum C
    Réponses: 8
    Dernier message: 02/02/2006, 19h57
  5. comment modifier les données d'une table à travers un dbgrid
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 12
    Dernier message: 19/07/2005, 09h51

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