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 :

OpenProcess & WriteProcessMemory


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Par défaut OpenProcess & WriteProcessMemory
    Bonsoir à tous,

    Dans le but de la création d'un trainer, je vais être amener à utiliser les fonctions OpenProcess & WriteProcessMemory. Auriez vous un tuto ou un exemple de code pour ces fonctions car je ne comprends pas comment les utiliser

    Merci beaucoup.

    Bonne soirée

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Sous Windows, chaque processus est identifié de manière unique grâce à son PID (Process Identifier). OpenProcess permet d'obtenir un handle vers un processus (handle qui pourra être passé à des fonctions comme TerminateProcess, WriteProcessMemory, etc.).

    WriteProcessMemory, comme son l'indique, permet d'écrire dans la mémoire d'un processus. Il faut cependant généralement avoir appelé VirtualAllocEx avec le flag MEM_COMMIT avant d'appeler WriteProcessMemory.

    A la fin, il faut libérer la mémoire allouée par VirtualAllocEx à l'aide de VirtualFreeEx avec le flag MEM_RELEASE et fermer le handle retourné par OpenProcess à l'aide de CloseHandle.

    Lire la doc de ces fonctions sur MSDN.

    D'autres questions ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Par défaut
    Pour le moment non, je vais aller lire la MSDN si j'arrive a retrouver la page ou il explique les fonctions quel b*rdel ce site quand même

    Merci à vous.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Par défaut
    Bonsoir, j'avance doucement mais surement :

    Mon programme me trouve le PID et m'ouvre un handle via OpenProcess, ça à l'air de fonctionner mais je me pose quelques questions tout d'abord mon code :

    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
    #include <iostream>
    #include <windows.h>
    using namespace std;
    int main ()
    {
    	int PID = NULL;
    	HWND Jeu = NULL;
    	HANDLE valeurOP = NULL;
    	cout << "En attente du processus ..." << endl;
    	do
    	Jeu = FindWindow(0,TEXT("Calculatrice"));
    	while (Jeu == NULL);
    	GetWindowThreadProcessId(Jeu,(LPDWORD) &PID);
    	cout << "Le handle de la fenetre Calculatrice est : " << Jeu << endl;
    	cout << "Son PID est : " << PID << endl;
    	cout << "Tentative d'ouverture du processus" << endl;
    	valeurOP = OpenProcess (PROCESS_TERMINATE,true,PID);
    		if (valeurOP != NULL){
    			cout << "Le handle du processus est : " << valeurOP << endl;
    			if (CloseHandle(valeurOP) != 0)
    				cout << "Handle ferme "<< endl;
    			else
    				cout << "Erreur de Closehandle" << endl;}
    	else
    		cout << "Erreur à l'ouverture" << endl;
    	system("PAUSE");
    	return 0;
    }
    Tout d'abord quel est la différence entre HANDLE et HWND dans quel cas utilise t on l'un ou l'autre ?

    Est il possible de créer un char que j'utiliserai dans la fonction FindWindow et dans mon cout car VC++ me dit qu'il peut pas convertir char en LPCWSTR j'ai lu pas mal de chose sur le net j'ai voulu changer mon projet en MultiByte mais ca ne résoud pas le probléme

    Je ne comprend pas non plus le deuxieme argument de la fonction OpenProcess :
    If this value is TRUE, processes created by this process will inherit the handle. Otherwise, the processes do not inherit this handle.
    même si je parle un peu anglais la j'avoue que je ne comprend pas du tout :s

    Je sais que le code n'est pas "propre" et je suis à votre écoute pour toute remarque .

    Merci à vous

    Bonne soirée

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    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 391
    Par défaut
    Un HWND est un handle de fenêtre, valable dans tout le système tant que la fenêtre existe. Un HWND ne permet pas de maintenir une fenêtre en vie.

    Un HANDLE est un handle vers un objet du kernel (sauf dans certains cas, comme le type de retour de LoadImage()). Un objet du kernel existe jusqu'à ce que tous ses handles soient fermés (on considère qu'un processus garde un handle sur lui-même tant qu'il s'exécute).

    L'héritage de handle est un truc qui a un rapport avec la création de processus fils: En gros, ça dit si le handle sera valide dans un processus fils ou non.

    Au niveau propreté: Utilise directement un DWORD pour le PID, et ne caste pas le pointeur.

    Au niveau conversion, c'est assez compliqué à gérer si l'on ne bosse pas sous Visual Studio (et une version payante strictement supérieure à 6).
    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.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Par défaut
    Merci de m'avoir répondu.

    J'ai donc modifier comme suit et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	GetWindowThreadProcessId(Jeu,&PID);
    Ca fonctionne toujours Je reconnais ne pas savoir quand utiliser un DWORD un LPCWSTR et compagnie je m'y perd mais je persévère

    La fonction ReadProcessMemory() lit bien ce qu'il y a en RAM un peu comme fait Tsearch donc ?

    Car j'ai voulu essayer avec un programme fait pour s'entrainer à la création de trainer, j'ai donc trouver ma valeur en mémoire ( Je sais utiliser Tsearch ) :

    Adresse : 41D090 ( je ne ferme pas le programme pour être sur que ca change pas )
    Taille : Tsearch me l'a trouver en tant que 4bytes
    Valeur : 16 ( que je peux modifier via Tsearch ca fonctionne niquel )

    Le souci est que quand je veux le faire via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReadProcessMemory(valeurOP,"41D090",&INFO,4,NULL);
    Le résultat est 0 => fonction échoué, et quand j'utilise le 5 ème argument qui me renvoie la taille des données lu celle si est nulle donc ça coince quelque part .

    J'ai utilisé la fonction GetLastError() et celle si me retourne 299 à savoir : Seule une partie de la demande Lecture/Ecriture du processus mémoire a été effectuée.

    j'ai remarqué que le handle retourné par OpenProcess est toujours = 0 quelque sois le processus je précise que je suis sous W7 RC donc peut etre est ce du a cela ?

    Une idée ?

    Merci encore à vous !

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