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

VC++ .NET Discussion :

ERROR_ACCESS_DENIED : OpenProcess et OpenProcessToken


Sujet :

VC++ .NET

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 15
    Par défaut ERROR_ACCESS_DENIED : OpenProcess et OpenProcessToken
    Bonjour,

    Dans un programme que je developpe je souhaiterai pouvoir lire la memoire d'un autre processus, mais plusieurs fonctions me retourne des ERROR_ACCESS_DENIED.

    Tout d'abord, je recherche mon processus avec les fonctions Process32First et Process32Next. Je trouve le processus dont je veux lire la memoire. Mais on me dit que je n'ai pas les droits d'acces quand j'execute le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HANDLE		hProcess = OpenProcess(PROCESS_ALL_ACCESS, true, pe32.th32ProcessID);
    En revanche si a la place de PROCESS_ALL_ACCESS, j'indique PROCESS_TERMINATE la fonction reussit et me retourne un handle. Par contre l'execution du code suivant me retourne la meme erreur, a savoir ERROR_ACCESS_DENIED.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
    Je ne comprends pas pourquoi il me retourne cette erreurs. Je developpe sous Visual Studio 2008 avec Windows XP SP3. Mon compte appartient au groupe administrateur.

    J'ai essayer de trouver des informations sur le net, mais ca n'a rien donner. Notamment certains sites parle du groupe utilisateur 'Debugger Users group', d'autres sites disent que ce n'est plus en vigueur.

    Quelqu'un peut il m'aider ?

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 15
    Par défaut
    La suite de l'histoire...

    J'arrive maintenant a utiliser OpenProcess sans erreur en utilisant le flag PROCESS_QUERY_INFORMATION. Ensuite j'arrive a appeler OpenProcessToken, LookupPrivilegeValue et AdjustTokenPrivileges sans erreur. Par contre je n'arrive pas a lire dans la memoire du processus. Je ne sais pas vraiment comment ca marche, s'il faut utiliser le token de OpenProcessToken, ou reouvrir un handle avec le flag PROCESS_ALL_ACCESS. Tout les tentatives que je fait avec la fonction ReadProcessMemory echoue. Donc c'est soit le code suivant qui est faut, soi je m'y prend pas bien. Quelqu'un a une idee ?

    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
     
    HANDLE		hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, true, pe32.th32ProcessID);
     
    std::cout << std::setw(30) << std::left << "  Handle";
    if (hProcess)
    	std::cout << "0x" << std::setbase(16) << hProcess << std::endl;
    else
    {
    	std::cout << "INVALID_HANDLE_VALUE" << GetLastError() << std::endl;
    	CloseHandle(hProcessSnap);
    	return ;
    }
     
    // Set
    HANDLE		hToken = 0;
     
    std::cout << std::setw(30) << std::left << "  Process Token";
    if (OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) == 0)
    {
    	std::cout << "Error " << GetLastError() << std::endl;
    }
    else
    {
    	std::cout << "Success - " << hToken << std::endl;
    }
     
    // Look Privilege
    LUID		luid;
     
    std::cout << std::setw(30) << std::left << "  LookupPrivilegeValue";
    if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid) == 0)
    {
    	std::cout << "Error " << GetLastError() << std::endl;
    }
    else
    {
    	std::cout << "Success - " << std::endl;
    }
     
    // Enable the privilege
    TOKEN_PRIVILEGES	tp;
     
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    std::cout << std::setw(30) << std::left << "  AdjustTokenPrivileges";
    if (AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL) == 0)
    {
    	std::cout << "Error " << GetLastError() << std::endl;
    }
    else
    {
    	std::cout << "Success - " << hToken << std::endl;
     
    	if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
    		std::cout << "The token does not have the specified privilege." << std::endl;
    }
    CloseHandle(hToken);
    J'obtient la sortie suivante:
    Process ID 1980
    Thread count 17
    Parent process ID 1940
    Handle 0x00000FC4
    Process Token Success - 00000FC0
    LookupPrivilegeValue Success -
    AdjustTokenPrivileges Success - 00000FC0

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 15
    Par défaut
    Bon j'ai trouve la solution tout seul . En faite mon probleme venais du faite que j'essayai de faire le SE_DEBUG_NAME sur le process dont je voulais lire la memoire. En faite il faut le faire sur soi meme, c'est a dire le process appellant. Ensuite on peut faire un OpenProcess avec le flag PROCESS_ALL_ACCESS sans probleme.

    Un petit lien pour voir un code complet qui marche:
    http://www.volynkin.com/debug.htm

    Voila...

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

Discussions similaires

  1. Probleme de HANDLE sur OpenProcess
    Par chuko dans le forum C
    Réponses: 2
    Dernier message: 14/10/2008, 12h50
  2. Probleme API OpenProcess
    Par chuko dans le forum C
    Réponses: 3
    Dernier message: 28/09/2008, 14h48
  3. OpenProcess Lib "kernel32"
    Par laftah71 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 04/01/2008, 11h22
  4. Prob avec OpenProcess
    Par alainpeniche dans le forum Windows
    Réponses: 0
    Dernier message: 16/09/2007, 17h47
  5. OpenProcess renvoie Invalid Process Handle
    Par ktsys dans le forum C++
    Réponses: 2
    Dernier message: 31/07/2007, 12h07

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