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

Windows Discussion :

lire la valeur d'une adresse mémoire


Sujet :

Windows

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 84
    Points : 42
    Points
    42
    Par défaut lire la valeur d'une adresse mémoire
    bonjour,
    j'ai une adresse mémoire : F70FE8 par exemple

    sa valeur peut être : 0 ou 1 ou 2

    quelle fonction c++ me permettrai de la lire ?

    une aide, un tut, un site ...

    merci pour votre aide

  2. #2
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 886
    Points : 1 526
    Points
    1 526
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      char toto = * ((char *) 0xF70FE8);

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 84
    Points : 42
    Points
    42
    Par défaut
    quand je le fais, il y a erreur car violation d'accès

    un site pour comprendre comment lire et afficher et mettre dans des variables les valeurs des adresses mémoires d'autres applications ??


  4. #4
    Membre averti Avatar de niglo
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 379
    Points : 383
    Points
    383
    Par défaut
    Tu l'as sors d'ou l'adresse 0xF70FE8 ???
    Ca vient peut etre de la ton erreur !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 84
    Points : 42
    Points
    42
    Par défaut
    non, c'était juste une adresse fictive l'histoire d'avoir une focntion ou un petit code

    sinon, j'ai une vrai adresse mais il y a violation d'accès pour lecture :
    0x1AB40F0

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Une adresse mémoire n'est valide que pour un processus donné. Tu l'obtiens comment cette adresse ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 84
    Points : 42
    Points
    42
    Par défaut
    ReadProcessMemory(hReadp,(LPCVOID)0x28000496, &buf, bufsize,NULL);

    (LPCVOID)0x28000496 = cette adresse est l'adresse de la case mémoire qu'on veut lire ?

  8. #8
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Mais que diable veux-tu faire avec une adresse absolue ?
    Il y a de fortes chances que windows t'en empêche.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Luc Hermitte
    Mais que diable veux-tu faire avec une adresse absolue ?
    Il y a de fortes chances que windows t'en empêche.

    A mon avis Ilimo veut se faire un utilitaire qui permette de tricher dans un jeu...
    mais effectivement une adresse mémoire ne représente jamais des données continuellement valides dans le temps

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 84
    Points : 42
    Points
    42
    Par défaut
    bon sang..
    j'ai un programme qui me lit des adresses mémoires

    mais il est en delphi
    ce n'est pas moi qui l'ai fait
    mais je l'ai utilisé pour lire des données mémoires en boucle

    vous me direz alors pour quoi je voudrais en faire un autre?

    pour la simple raison que ce programme utilise la pile de message de windows pour simuler des touches claviers

    donc je suis détecté au bout d'une 30 de mn

    avec c++ je peux simuler le niveau materiel, mais envoyer des des frappes de clavier ne sert pas à grande chose si c'est pas au bon moment
    d'où lecture des adresses mémoires

    bon bonne idée ou pas

    au moins, c'est un défi pour le petit programmeur que je suis

    vilà un bout de code:
    mais je ne sais pas pourquoi, rien ne s'affiche

    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
    #include <iostream>
    #include <tchar.h>
    #include <windows.h>
    
    int _tmain&#40;int argc, _TCHAR* argv&#91;&#93;&#41;
    &#123;
    char adresse_data&#91;24000&#93;; 
    
    DWORD adresse_data_size = sizeof&#40;adresse_data&#41;; 
    DWORD dw_PID=21; // un process id quelconque 
    HANDLE h_Read_Process; 
    
    h_Read_Process = OpenProcess&#40;PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE, dw_PID&#41;; 
    
    if&#40;NULL != h_Read_Process&#41; 
    &#123;
    int ret = ReadProcessMemory&#40;h_Read_Process,&#40;LPCVOID&#41;0x28000496, &adresse_data, adresse_data_size,NULL&#41;; 
    
    for&#40;int e=0;e<=sizeof&#40;adresse_data&#41;;e++&#41; printf&#40;"%c",adresse_data&#91;e&#93;&#41;;
    &#125;
    
    CloseHandle&#40;h_Read_Process&#41;;
    return 0;
    &#125;
    bon voilà vous savez tout

    alors ça vous dit de m'aider ?

  11. #11
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    C'est spécifique Windows.
    DWORD dw_PID=21; // un process id quelconque
    tu lis n'importe où dans n'importe quel process, pas étonnant que ça plante.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 84
    Points : 42
    Points
    42
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DWORD dw_PID=21; // un process id quelconque
    ceci ne précise pas que je veux lire uniquement le process 21 et non pas n'importe quel programme?

  13. #13
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    C'est quoi le process 21 ?
    Chez moi le PID des premiers process commence à 450.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 84
    Points : 42
    Points
    42
    Par défaut
    désolé
    c'était une valeur fictive
    l'histoire juste de remplir le code

    sinon, j'utilise Process Explorer et je trouve pour Flashget : 3892
    mais je ne sais pas si c'est pareil sur tous les ordi

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 84
    Points : 42
    Points
    42
    Par défaut
    mais après tout je me demande si je suis clair dans ma demande et je me demande aussi que peut-être je ne sais pas exactement comment ça se passe au niveau mémoire :

    1- j'utilise Windows XP Pro mise à jour totale
    2- j'utilise Visaul c++ 2003
    3- j'ai fait un programme win32 console application
    4- ce programme s'appelle rm ( read memory )

    5- j'ai un autre programme qui manipule beaucoup de données( =dp)
    6- pour cela dp, charge une dll ( dont je connais le nom )
    7- le rôle de rm est d'aller dans la zone mémoir de cette dll pour :
    a- lire la valeur contenu dans une adresse donnée
    b- la stocker dans une autre variable

    8- j'ai la base adresse de cette dll(ça me permet de calculer le offset)
    9- j'ai l'adresse de la variable qui m'interesse

    10- est-ce que mon petit bout de code est utile ?

    11- mais ce que je dis, est valable pour n'importe quel programme du moment où vous connaissez sa base-adresse, l'adresse de la variable dont vous chercher la valeur

    12- j'espère que cette fois-ci mes intentions sont un peu plus clair pour vous aider à me diriger

    merci

  16. #16
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Il te manque quelques notions.
    Même sur un même ordi, le PID est aléatoire, ton process peut s'exécuter x fois en même temps, avec un PID différent à chaque fois.

    8/ la base adresse codée dans la dll est seulement indicative, si Windows n'arrive pas à charger la dll à cette adresse, elle sera modifiée (rebasing).

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 84
    Points : 42
    Points
    42
    Par défaut
    il est aleatoire à chaque demarrage de windows

    mais je peux le retrouver : Process Explorer

    mais il doit être possible de trouver la base adresse de cette dll utilisant son nom, même si ça cahnge à chaque démarrage de windows

    ayant à chaque fois le PID, la base adresse et ayant calculé les offsets
    j'aurais accès tout le temps aux varaibles que je veux

    du moins théoriquement
    ///////////////////////////////////
    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
    
    #include <iostream> 
    #include <tchar.h> 
    #include <windows.h> 
    
    int _tmain&#40;int argc, _TCHAR* argv&#91;&#93;&#41; 
    &#123; 
    char adresse_data&#91;24000&#93;; 
    
    DWORD adresse_data_size = sizeof&#40;adresse_data&#41;; 
    DWORD dw_PID=21; // un process id quelconque 
    HANDLE h_Read_Process; 
    
    h_Read_Process = OpenProcess&#40;PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE, dw_PID&#41;; 
    
    if&#40;NULL != h_Read_Process&#41; 
    &#123; 
    
    ------------------------------------
    SIZE_T dwSize;
    PDWORD lpflOldProtect;
    VirtualProtectEx&#40; h_Read_Process, &#40;LPVOID&#41;0x1630000, dwSize, PAGE_READONLY, lpflOldProtect&#41;;
    ------------------------------------
    
    int ret = ReadProcessMemory&#40;h_Read_Process,&#40;LPCVOID&#41;0x28000496, &adresse_data, adresse_data_size,NULL&#41;; 
    
    for&#40;int e=0;e<=sizeof&#40;adresse_data&#41;;e++&#41; printf&#40;"%c",adresse_data&#91;e&#93;&#41;; 
    &#125; 
    
    CloseHandle&#40;h_Read_Process&#41;; 
    return 0; 
    &#125;
    j'ai ajouté ceci dans les code précedent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ------------------------------------
    SIZE_T dwSize;
    PDWORD lpflOldProtect;
    VirtualProtectEx&#40; h_Read_Process, &#40;LPVOID&#41;0x1630000, dwSize, PAGE_READONLY, lpflOldProtect&#41;;
    ------------------------------------
    je pense que ceci permet de modifier les droits d'accès à la zone mémoire

    mais je ne sais pas comment trouver le dwSize, et non plus si c'est à moi de remplir la variable : lpflOldProtect

  18. #18
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Le redémarrage de Windows n'a aucune influence. Tout dépend des dll que ton exe utilise. S'il utilise 2 dlls qui ont la même base adresse (ou qu'elles se chevauchent), va y avoir conflit et donc relocation de l'une d'entre elles.
    Le PID varie a chaque exécution de ton jeux. Dans un autre topic, on t'a expliqué comment lister les dlls d'un process, et donc comment avoirt leurs adresses mappées.

Discussions similaires

  1. [Débutant] lecture d'une valeur dans une adresse mémoire
    Par pixigol dans le forum C#
    Réponses: 4
    Dernier message: 29/04/2013, 20h54
  2. Lire la valeur d'une adresse mémoire
    Par barhili04 dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 11/11/2009, 10h44
  3. Comment modifier la valeur d'une adresse mémoire ?
    Par copterkill dans le forum Windows
    Réponses: 6
    Dernier message: 08/02/2009, 22h18
  4. lire le contenu d'une adresse mémoire avec VB Script
    Par pierre.zelb dans le forum VBScript
    Réponses: 2
    Dernier message: 13/12/2006, 13h32
  5. Récupérer la valeur d'une adresse hexa 300.
    Par Cochman dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 04/06/2005, 17h45

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