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 :

ReadProcessMemory probléme de récupération.


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2020
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2020
    Messages : 51
    Points : 14
    Points
    14
    Par défaut ReadProcessMemory probléme de récupération.
    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
     
    #include <winsock2.h>
    #include <iostream>
    #include <sstream>
    #include <tchar.h>
    #include <TlHelp32.h>
     
    bool GetPid(const TCHAR* targetProcess, DWORD* procID){
    HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if(snap && snap != INVALID_HANDLE_VALUE){
    PROCESSENTRY32 pe;
    pe.dwSize = sizeof(pe);
    if(Process32First(snap, &pe)){
    do{
    if(!_tcsicmp(pe.szExeFile, targetProcess)){
    CloseHandle(snap);
    *procID = pe.th32ProcessID;
    return true;
    	}
    }
    while (Process32Next(snap, &pe));
    	}
    }
    return false;
    }
     
    using namespace std;
    int main(int Execution, char * Variables[]){	
    const char * nom_application = "Notepad.exe";
    HANDLE Processus = 0;
    DWORD ProcessusID = 0;
    GetPid(_T(nom_application), &ProcessusID);
    Processus = OpenProcess(PROCESS_ALL_ACCESS, 0, ProcessusID);
     
     
    int Adresse;
    int Parametre;
    int ParametreAdresse;
    int ValeurAdresse;
     
    Adresse = 2;
    Parametre = 2;
     
     
     
    UINT_PTR UINTCreationByteMemoire = 0x28D8FAC0000 + Adresse;
     
    ReadProcessMemory(Processus, (LPCVOID)UINTCreationByteMemoire, &ParametreAdresse, 1, NULL);
     
    cout << ParametreAdresse << endl;
     
     
    system("pause");
    return 0;
    }
    Bonjour, quand j'essaye de récupérer la variable ParametreAdresse avec le code ci-dessus j'ai plus qu'une seul BYTE et la valeur est erroné.
    Par contre avec le code en dessous je récupére tout correctement quand je mets la valeur direct de l'adresse. J'ai tout essayé UINT_PTR, int etc...
    Et le résultat est le même. UINTCreationByteMemoire je dois le déclarer comment ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ReadProcessMemory(Processus, (LPCVOID)0x28D8FAC0000, &ParametreAdresse, 1, NULL);

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 095
    Points : 12 172
    Points
    12 172
    Par défaut
    Dans les 2 cas vous ne lisez qu'un octet, c'est la valeur du 4ème paramètre de "ReadProcessMemory". (toujours 1)

    Mais :
    Vous écrivez le résultat dans une variable non initialisée, avec une taille non compatible avec la taille en octets de la lecture/écriture (1 cf. ci-avant, un int de 1 octet, valeur de 0 à 255, même moi boomer, à ma naissance c'était plus d'actualité des taille aussi ridicules), donc en entré de la merde (pas initialisée) => de la merde en sortie.
    Vous ne lisez pas au même endroit dans les 2 cas (0x28D8FAC0000 != 0x28D8FAC0000 + Adresse = 0x28D8FAC0002)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2020
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2020
    Messages : 51
    Points : 14
    Points
    14
    Par défaut
    Ma question est simple, comment récupérer qu'une seul BYTE ????
    CAr je suis obliger de mettre l'adresse brut...

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 536
    Points : 43 409
    Points
    43 409
    Par défaut
    Bonjour, quand j'essaye de récupérer la variable ParametreAdresse avec le code ci-dessus j'ai plus qu'une seul BYTE et la valeur est erroné.
    Qu'est ce qui te fait dire que tu as plus d'un seul octet ? Tu n'en demande qu'un, et la doc ne précise pas qu'il y a un minimum. Tu peux le vérifier en utilisant lpNumberOfBytesRead au lieu de le mettre à NULL.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 095
    Points : 12 172
    Points
    12 172
    Par défaut
    Ma question est simple, comment récupérer qu'une seul BYTE ????
    Vous le faites déjà.
    C'est juste que vous stocker le résultat de cette lecture dans une variable qui n'a pas le bon type.
    Le "bon" type, ça dépend de ce que vous faites avec après dans votre code. (Mais ça peut pas être un "int")

    CAr je suis obliger de mettre l'adresse brut...
    "Car" : je ne vois pas le lien "logique" entre une adresse "en dur" ("brut", ça veut rien dire de précis, des types d'adresse "en dur", il y en a autant que de modèle d'adressage et/ou d'activation de la mémoire virtuelle ou pas, etc...) et le fait de ne lire qu'un octet et pas 4 ou 8 (tailles habituelles d'un "int" sur architecture Intel).

Discussions similaires

  1. Récupération valeur d'une propriété type TStrings
    Par Stéphane Vaillant dans le forum Langage
    Réponses: 2
    Dernier message: 01/03/2003, 11h47
  2. [XMLRAD] récupération de donnée
    Par Mitch79 dans le forum XMLRAD
    Réponses: 7
    Dernier message: 30/01/2003, 15h36
  3. Réponses: 5
    Dernier message: 09/01/2003, 11h55
  4. récupération d'images
    Par MANU_2 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 05/08/2002, 18h36
  5. Réponses: 4
    Dernier message: 05/06/2002, 12h15

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