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 :

Accéder à de la mémoire


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 12
    Par défaut Accéder à de la mémoire
    Bonjour,

    Je cherche désespéremment comment lire une section de ma mémoire en C++.
    En fait là je chercherai à regarder ce qui se trouve à l'adresse 0x859e1820.
    Je vois ma valeur avec LiveKD, mais j'aimerais construire un outils l'automatisant.

    Merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Que veux-tu faire exactement ? Pourquoi cette adresse en particulier ? Quel outil veux-tu faire ? Je te demande cela car ton problème est peut-être avant et que cette adresse peut très bien changer demain.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 12
    Par défaut
    Oui ma valeur change.

    En fait, quand je demarre un Windows au chargement celui ci place en mémoire des informations que j'aimerais recuperer.
    Ces informations sont précédé d'une suite d'octets:
    2C00 0500 0100 0000 ....
    je veux recuperer les 128 bits qui suivent cet entete.
    Mais dans un premier temps, je voulais pouvoir me placer à un endroit particuilier, et commencer ma recherche.
    Mais je suis d'accord que l'adresse de l'information change à chaque fois que je redemarre mon Windows.


    Voilà

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Est-ce que memcpy pourrait suffir à ton bonheur ? Mais je ne suis pas très convaincu. Auras-tu le droit d'aller y lire ?

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned char const* ptr = (unsigned char const*)0x859e1820;
    est ce qui a le plus de chance de marcher. Evidemment non portable. Ne pas oublier non plus que la memoire est normalement pas partagee entre process et que certaines zones peuvent ne pas etre lisible.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 12
    Par défaut
    ok, ca semble passer, mais je n'arrive pas à accéder au contenu pointé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    unsigned char const* ptr = (unsigned char const*)0x859e1820;
     
    PCHAR pAdresse = (PCHAR)*ptr;
     
    if (*(PUSHORT)(pAdresse)==0x2c00)
    {
         ....
    Lorsque j'execute ca, j'ai une sorte de segfault.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Relis le message de Jean-Marc.Bourguet.
    Ne pas oublier non plus que la memoire est normalement pas partagee entre process et que certaines zones peuvent ne pas etre lisible.
    Tu ne peux pas lire n'importe quelle adresse de ta mémoire. Il va falloir que tu débrouilles autrement mais ce n'est plus vraiment une question de C++. Windows doit bien te fournir un moyen de lire ce fameux entête.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 12
    Par défaut
    et en assembleur, il n'y a pas moyen non plus?
    j'ai ecris ceci, ca ne fonctionne pas non plus, mais si ca donnes des idées à qqun
    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
     
    char b=0;
    __asm{
          xor ebx, ebx
          mov eax, 0005002C
     
       loop_scan:
          repne scasd       
          jnz end_scan
          mov bl, 0x1
       end_scan:
         mov byte ptr [b],bl
    }
     
    b?printf("OK"):printf("ECHEC");

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 399
    Par défaut
    1. Assembleur ou C++, aucune différence: Un processus "utilisateur" ne peut pas regarder n'importe où ainsi.
    2. Je ne connais pas les debuggers de Kernel, mais ils utilisent sûrement un composant exécuté en "kernel mode".
    3. En plus, le type d'exception affiché montre que c'est un projet .Net. Et ça, je suis sûr qu'aucun debugger de Kernel ne tourne en .Net...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Un processus dispose en général d'un adressage mémoire virtuel, grâce au MMU du processeur.
    Tu n'as donc pas accès directement à l'adresse mémoire que tu veux.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 12
    Par défaut
    Pour résumer, un processus utilisateur ne peux accéder à la mémoire comme il veut. (à cause du "mapping" c'est ca ?)
    En recherchant sur le net, on m'a conseillé de coder un driver, pour pouvoir y accéder. Etes vous d'accord? Est ce que ca peut fonctionner?

    Autre chose si je hook un processus noyau, est ce qu'il pourrait accéder à tous l'espace noyau? Ou toujours pas à cause du mapping?

  12. #12
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    C'est le genre de questions que des specialistes de ton OS sont plus a meme de repondre qu'un specialiste C++ (surtout quand comme moi il n'utilise que Unix depuis plus de 10 ans).

    Je te suggere donc de demander a un moderateur de deplacer ce sujet sur un forum windows adequat.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 12
    Par défaut
    J'ai créer une autre discussion dans la section Windows
    Voilà le lien pour la suite
    http://www.developpez.net/forums/sho...61#post2362961

  14. #14
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    J'ai juste une question....

    Elle sort d'ou cette addresse ? Je veux dire...
    Si c'est une adresse "physique" (addressage de la ligne/colonne des barettes mémoire) non seulement elle doit changer à chaque démarrage, mais il ya fort à parier que c'est même pendant l'utilisation....
    Est-ce que c'est une adresse d'un process donné ?
    Ou est-ce une adresse du kernel ?

    Il existe probablement des fonctions pour lire la mémoire dans le kernel... par contre, pou y écrire.... j'espere bien que non !
    Et il y a (heureusement) de moins en moins de drivers tournant en mode kernel (et les BSOD associés).

    Si tu nous en disais un peu plus sur ce que tu veux faire, on pourra peut-etre t'aider plus efficacement.
    C'est quoi les informations que tu veux récupérer par exemple ?

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 12
    Par défaut
    En fait, au chargement de Windows, le winloader charge à un endroit dans la mémoire une clé, utile pour mon programme.
    Cette clé est utilisé pour tous les accès disque.

    L'endroit de cette clé est placé en fonction de l'endroit ou est chargé le noyau. Elle est placé toujours apres mon noyau est chargé en :

    Kernel base = 0x82000000
    Entete Clé = 0x859e1860
    Clé = 0x859e186a


    Pour reperer cette clé elle est précedé toujours d'un entete d'octets du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0x859e1860   2C 00 05 00 01 00 00 00 ....
    Donc moi, je cherche justement une fonction qui permet de lire la mémoire dans l'espace noyau, de rechercher cet en tête, et de lire la clé qui la suit.

    Je sais pas si je suis clair?

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 399
    Par défaut
    T'aurais plutôt intéret à repérer l'endroit où le noyau stocke le pointeur vers cette clé...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 160
    Par défaut
    Sinon, juste une suggestion comme ca.
    Avec un petit driver en mode kernel qui manipule le registre CR0 du proco tu peux complettement déprotéger la memoire et aller lire/ecrire un peu ou tu veux.

    Mais c'est super dangereux.
    Et puis il n'est pas complettement improbable qu tu aie une levée de bouclier de logiciels comme les Anti virus...

    Cette technique étant répertoriée dans les techniques mechantes (on imagine facilement pourquoi)

    Tu peux tenter une call gate pour passer en mode kernel depuis une application user land mais depuis xp je n'ai pas réussit a faire passer de call gate bien que cela soit documenté dans la doc intel.

    Bref a pars des techniques de barbare... Je ne vois pas trop quoi te conseiller.

    Enfin je rapelle quand meme que ces mecanismes de protections de la memoire ont été créés pour eviter qu'un ordinateur se transforme en un gros corewar et de finir avec des processus mutants composés d'un bout de l'un et d'un bout de l'autre (ce qui plante dans 99.9999999% des cas)

Discussions similaires

  1. accéder a la mémoire interne d'un téléphone mobile
    Par ibrahimCA dans le forum Mobiles
    Réponses: 0
    Dernier message: 16/04/2012, 21h57
  2. Accéder directement à la mémoire graphique
    Par raphael_kindt dans le forum OpenGL
    Réponses: 6
    Dernier message: 24/03/2009, 18h10
  3. Eclipse GMF : accéder aux objets en mémoire.
    Par rodbeck dans le forum Eclipse Platform
    Réponses: 9
    Dernier message: 08/12/2008, 15h04
  4. Comment accéder à la mémoire vidéo ?
    Par Jérôme.O[76] dans le forum PureBasic
    Réponses: 16
    Dernier message: 16/03/2008, 14h54
  5. Accéder à un espace mémoire sous XP
    Par keny dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 02/08/2002, 13h37

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