Problème avec WriteProcessMemory() ....

Résolu
Messages postés
127
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
5 août 2007
-
Messages postés
755
Date d'inscription
samedi 15 mai 2004
Statut
Membre
Dernière intervention
30 janvier 2011
-
Hello World !

J'ai un ptit problème avec la fonction WriteProcessMemory().
mon code est le suivant :

    HWND Wnd;                          // Hwnd de notre fenêtre
    LPDWORD PID;                        // Id du processus
    DWORD Proc;                       // Id du thread
    HANDLE Hproc;                       // Handle du processus
    DWORD Addr = 0x0000000 ;    // Addresse mémoire trouvée
    DWORD MWritte;
    BYTE PATCH[] = "\x90\x90\x90\x90"; // Notre patch (des NOP)

    Wnd = FindWindow(NULL,"mon prog");
    if(Wnd){
        Proc= GetWindowThreadProcessId(Wnd,(LPDWORD) &PID);
        if(Proc){
            Hproc= OpenProcess(PROCESS_ALL_ACCESS,NULL,(DWORD)PID);
            if(Hproc){
                if(WriteProcessMemory (Hproc, (LPVOID)Addr, PATCH, 3, &MWritte)){
                    MessageBox(hWindow,"Ecriture effectué !", "Succes", MB_OK|MB_ICONINFORMATION);
                }
            }
            else MessageBox(hWindow,"Ouverture du processus IMPOSSIBLE !", "Error", MB_OK|MB_ICONERROR);
        }
        else MessageBox(hWindow,"Process ID non trouvé !", "Error", MB_OK|MB_ICONERROR);
    }
    else MessageBox(hWindow,"NameWindow nom trouvé", "Error", MB_OK|MB_ICONERROR);

PUIS LA QUAND JE LANCE MON PROG IL SE PASSE RIEN DU TOUT
JE COMPRENDS PAS POURQUOI ! IL SE PASSE RIEN MAIS ALORS
RIEN DU TOUT !

Je ne vois pas ou est le problème ??!!
Aidez moi s'il vous plait !
A voir également:

8 réponses

Messages postés
755
Date d'inscription
samedi 15 mai 2004
Statut
Membre
Dernière intervention
30 janvier 2011

addr 0x00000000 n'existe pas ^^^^ et tu sure des Nop, comprend tu l'asm et aussi

          if(WriteProcessMemory (Hproc, (LPVOID)Addr, PATCH, 3, &MWritte)){
                    MessageBox(hWindow,"Ecriture effectué !", "Succes", MB_OK|MB_ICONINFORMATION);

est inutile car MWritte contien le nom de Bits ecrite si sa marche
donc if(MWritte!=4) est plus correct.

sinon le system de recuperer le handle par le nom de la fenetre est perimee, utilise le nom de l'exe, tu fais un Enum Process jusqu'a ce que sa soit egale a mon prog.exe.

deplus BYTE Patch devrait mieux etre BYTE Patch[4] = .....
Messages postés
755
Date d'inscription
samedi 15 mai 2004
Statut
Membre
Dernière intervention
30 janvier 2011

aussi, juste un truc ^^ ta pas de procedure main();
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
GetWindowThreadProcessId(Wnd,(LPDWORD) &PID);




GetWindowThreadProcessId demande simple DWORD en second paramètre pour stocker le PID c'est juste qu'il lui faut sont adresse. Donc il faut faire comme suit:






DWORD PID;



GetWindowThreadProcessId(Wnd, &PID);









C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution
Forum de débats sur la programmation
<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
En réalité, ce qu'il faut en second paramètre de GetWindowThreadProcessId c'est une adresse. Faire &PID va donner l'adresse de PID et donc, la fonction stockera la valeur à la location du second paramètre.

C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution
Forum de débats sur la programmation
<!--
Messages postés
127
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
5 août 2007

>>wxccxw
Oui je suis sur de vouloir Nopper, je comprend un tout ptit peu lassambleur

BYTE Patch[4] <- erreur de compilation

Puis je vais essayer de tester le if(MWritte!=4)
Messages postés
127
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
5 août 2007

Ah oui sa marche !
MERCI ! MERCI !
Messages postés
755
Date d'inscription
samedi 15 mai 2004
Statut
Membre
Dernière intervention
30 janvier 2011

derien ^^
Messages postés
755
Date d'inscription
samedi 15 mai 2004
Statut
Membre
Dernière intervention
30 janvier 2011

fait les separer par des virgules

BYTE Nop4Bytes[4] = {0x90,0x90,0x90,0x90);