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 :

Crash aleatoire avec RegQueryValueExW


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 88
    Points : 73
    Points
    73
    Par défaut Crash aleatoire avec RegQueryValueExW
    Bonjour,

    cela fait une semaine que je galérè sur RegQueryValueExW
    a essayer dans tous les sens.. je suis proche du but mais j'ai encore des bugs et je ne comprends pas ..

    le code ci dessous me permet :

    -d'ouvrir une clé
    -Récupérer la taille et le type de la clé
    -Récupérer la valeur de la clé si c'est du REG_DWORD, REG_BINARY, ou REG_SZ et l'afficher

    mais c'est instable
    ca crash en général a ce niveau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    wprintf(L"[?] Calcul de lpData\n");
    lResult = RegQueryValueExW(phkResult, lpValueName, NULL,&dwType,(BYTE*)&lpData,&dwSize);
    j'ai remarqué que si je veux print la valeur d'une clé binaire qui contient une string, si je fais un cast en byte* cela plante..
    si je l'enleve cela fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    lResult = RegQueryValueExW(phkResult, lpValueName, NULL,&dwType,(BYTE*)&lpData,&dwSize);
    wprintf(L"[?] Code Retour du Calcul de lpData: %ld \n\n",lResult);
    hier j'ai créé un REG_DWORD sur du x64 et mon prog me sortait que mon TYPE etait egal RZ_NONE

    bref si quelqu'un pouvait debuggé mon code ci dessous svp ..parceque je comprends pas..
    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
     
    #include <tchar.h>
    #include <Windows.h>
    #include <stdio.h>
    #include <malloc.h>
    int main()
    {
        //HKEY hKey = HKEY_USERS;
        //wchar_t * lpSubKey = L"S-1-5-21-1421355107-4124689249-2030404034-1473129\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ComDlg32\\CIDSizeMRU";
        //wchar_t * lpValueName = L"29";
        wchar_t * lpSubKey = L"SOFTWARE\\test";
        HKEY hKey = HKEY_LOCAL_MACHINE;
        wchar_t * lpValueName = L"cletest";
     
        BYTE* lpData = NULL;
        HKEY phkResult;
        DWORD dwSize;
        DWORD dwType;
     
        long lResult = RegOpenKeyExW(hKey, lpSubKey, 0, KEY_READ, &phkResult);
        wprintf(L"[?] Tentative d\'ouverture de cl\x82 :\n");
        wprintf(L"[?] Nom de la Cl\x82 : %ls\n", lpValueName);
        wprintf(L"[?] Chemin de la cl\x82 : %ls\n\n", lpSubKey);
        wprintf(L"[?] Code Retour de l\'ouverture de cl\x82 RegOpenKeyExW : %ld \n\n",lResult);
     
        if (lResult == 0)
        {
            wprintf(L"[?] Cl\x82 ouverte.\n");
            wprintf(L"[?] Calcul de dwSize et dwType\n");
            lResult = RegQueryValueExW(phkResult, lpValueName, NULL,&dwType,NULL,&dwSize);
            wprintf(L"[?] Code Retour du Calcul de dwSize et dwType: %ld \n\n",lResult);
            lpData = (BYTE*) malloc(dwSize) ;
            wprintf(L"\t dwType : %ld \n",dwType);
            wprintf(L"\t dwSize : %ld \n",dwType);
            wprintf(L"\t dwSize : %ld \n\n",lpData);
     
            if(dwType == REG_DWORD)
            {
                wprintf(L"[?] La cl\x82 est de type REG_DWORD.\n");
                wprintf(L"[?] Calcul de lpData\n");
                lResult = RegQueryValueExW(phkResult, lpValueName, NULL,&dwType,(BYTE*)&lpData,&dwSize);
                wprintf(L"[?] Code Retour du Calcul de lpData: %ld \n\n",lResult);
                wprintf(L"[?] valeur de la cl\x82 %s: %ld \n",lpValueName ,lpData);
            }
            else if(dwType == REG_SZ)
            {
                wprintf(L"[?] La cl\x82 est de type REG_SZ.\n");
                wprintf(L"[?] Calcul de lpData\n");
                lResult = RegQueryValueExW(phkResult, lpValueName, NULL,&dwType,(BYTE*)&lpData,&dwSize);
                wprintf(L"[?] Code Retour du Calcul de lpData: %ld \n\n",lResult);
                wprintf(L"[?] valeur de la cl\x82 %s: %ld \n",lpValueName ,lpData);
            }
            else if(dwType == REG_BINARY)
            {
                wprintf(L"[?] La cl\x82 est de type REG_BINARY.\n");
                wprintf(L"[?] Calcul de lpData\n");
                lResult = RegQueryValueExW(phkResult, lpValueName, NULL,&dwType,(BYTE*)&lpData,&dwSize);
                wprintf(L"[?] Code Retour du Calcul de lpData: %ld \n\n",lResult);
                wprintf(L"[?] valeur de la cl\x82 %s: %ls \n",lpValueName ,lpData);
            }
            else
                wprintf(L"[?] La cl\x82 est de type %ld.\n,dwType");
        }
        else
        {
            wprintf(L"[?] Cl\x82 non ouverte.\n");
        }
        //system("pause");
        free(lpData);
        wprintf(L"\nFermeture de la Cl\x82.\n");
        RegCloseKey(hKey);
        return 0;
    }
    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 053
    Points
    33 053
    Billets dans le blog
    4
    Par défaut
    L'utilisation de cette fonction est plutôt simple.
    Il suffit de le faire en 2 temps.

    Vite fait, ça donne ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LONG lRegResult = RegQueryValueEx(hkRegistry, szValue, NULL, &dwType, NULL, &dwSize);
    	char* buffer = (char*)malloc(dwSize);
    	lRegResult = RegQueryValueEx(hkRegistry, szValue, NULL, &dwType, (LPBYTE)buffer, &dwSize);

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    merci pour ta réponse même si cela m'aide absolument
    car je fait déjà en 2 temps

    je continue de chercher..

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Commence par supprimer tous tes & de &lpData: La fonction demande un pointeur, et jamais un pointeur de pointeur (vu qu'elle n'alloue pas les données).

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    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
     
    if(dwType == REG_DWORD)
            {
                lResult = RegQueryValueExW(phkResult, lpValueName, NULL,&dwType,lpData,&dwSize);
                wprintf(L"[?] valeur de la cl\x82 %s: %ld \n",lpValueName ,lpData);
            }
            else if(dwType == REG_SZ)
            {
                lResult = RegQueryValueExW(phkResult, lpValueName, NULL,&dwType,lpData,&dwSize);
                wprintf(L"[?] valeur de la cl\x82 %s: %ls \n",lpValueName ,lpData);
            }
            else if(dwType == REG_BINARY)
            {
                lResult = RegQueryValueExW(phkResult, lpValueName, NULL,&dwType,lpData,&dwSize);
                wprintf(L"[?] valeur de la cl\x82 %s: %ls \n",lpValueName ,lpData);
            }
    si j'enleve les (PBYTE)& de lpData tout fonctionne sauf le DWORD

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Tu ne connais donc plus la différence entre %d et %s? L'un prend un pointeur, l'autre pas...
    Voici un code plus détaillé:

    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
            wprintf("[?] Valeur du pointeur lpData lui-même: %p\n", lpData);
            if(dwType == REG_DWORD)
            {
                lResult = RegQueryValueExW(phkResult, lpValueName, NULL,&dwType,lpData,&dwSize);
                DWORD *pDwData = (DWORD*)lpData;
                DWORD dwData = *pDwData;
                wprintf(L"[?] valeur de la cl\x82 %s: %lu \n", lpValueName, dwData);
            }
            else if(dwType == REG_SZ)
            {
                lResult = RegQueryValueExW(phkResult, lpValueName, NULL,&dwType,lpData,&dwSize);
                WCHAR *pStrData = (WCHAR*)lpData;
                wprintf(L"[?] valeur de la cl\x82 %s: %ls \n",lpValueName, pStrData);
            }
            else if(dwType == REG_BINARY)
            {
                lResult = RegQueryValueExW(phkResult, lpValueName, NULL,&dwType,lpData,&dwSize);
                //Il n'y a pas de moyen "simple" d'afficher des données REG_BINARY;
                //il faudrait que tu écrives une fonction de dump hexadécimal/ASCII classique sur 16 colonnes.
            }
    Edit: Pour ce qui est du dump, j'ai retrouvé un vieux code à moi dans ce thread, mais ce n'est pas vraiment un code compréhensible, je n'ai jamais eu le temps de le nettoyer.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    Tu ne connais donc plus la différence entre %d et %s? L'un prend un pointeur, l'autre pas...

    ça faisait presque une semaine que je me demandai pourquoi je n'arrivais pas a afficher ce **** de DWORD ...je pensais que c’était mon code qui était faux pas le %ld du wprintf !!
    je ne connaissait pas cette différence ! merci vais pouvoir tourner la page lol

    pour la fonction dump je vais l'etudier mais le %s fonctionne et affiche ce que j'ai besoin pour l'instant

    merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème crash application avec dll C++
    Par snake264 dans le forum Windows
    Réponses: 7
    Dernier message: 09/07/2010, 10h14
  2. crash inexpliqué avec sort()
    Par sebkramm dans le forum SL & STL
    Réponses: 8
    Dernier message: 05/01/2009, 21h23
  3. Réponses: 3
    Dernier message: 10/12/2008, 17h57
  4. Réponses: 16
    Dernier message: 29/10/2008, 14h33
  5. Image aleatoire avec lien
    Par badrel dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/07/2007, 11h29

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