Voici le roi des langages: j'ai nommé l'assembleur. Personnelement, malgré le fait que je puisse facilement utiliser une dizaine de langages de programmation, c'est encore celui qui me parait le plus dur car le moins intuitif. C'est pour cela que je le mets dans la partie avancée car sa difficulté est supérieure.

 

C'est parti, nous allons donc voir le code d'un trainer en C++. Sachez tout de suite que l'affichage final, ne sera pas spécialement joli. Mais vous êtes là pour apprendre.

Première chose: les headers. Cela va nous permettre d'utiliser des fonction de base car sinon il nous faudrait toutes les réécrire.

#include <windows.h>
#include <iostream.h>



Puis nous écrivons notre fonction main(). Nécessaire pour le lancement de l'appli. Elle contient le constructeur pour la classe CMain.

int main(){

}


Voyons maintenant quelques variables qu'il nous faudra placer en début de fonction main()

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

 

Il nous faut rajouter la fonction qui va nous trouver l'handle de notre fenêtre.

Wnd = FindWindoo Game");

 

On vérifie que l'handle de la fenêtre a été trouvé et on continue

if(Wnd){

/* ICI */

}
else cout << " le jeu n'a pas ete trouve" ;



A place de /* ICI */, on va insérer le reste du programme. On commence donc par retrouver l'id du processus grâce au nom de la fenêtre

Proc= GetWindowThreadProcessId(Wnd,(LPDWORD) &PID);



On vérifie maintenant si l'id du processus a bien été trouvé et selon le cas on continue ou non

if(Proc){

/* ICI */

}
else cout << "Process ID non trouve";

 

On insère donc à la place de /* ICI */.On ouvre le processus en mode all_access (pour pouvoir lire et écrire dedans) et on met son handle dans HProc pour pouvoir le retrouver plus facilement

Hproc= OpenProcess(PROCESS_ALL_ACCESS,NULL,(DWORD)PID);

 

On continue de travailler si on a bien un handle sur un processus

if(Hproc){

/* ICI */

}
else cout << "ouverture du process impossible";

 

On écrit dans l'adresse mémoire du process.

if(WriteProcessMemory (Hproc, (LPVOID)Addr, PATCH, 3,NULL)){

cout << "ecriture effectuee";

}



Et voilà, il ne vous reste plus qu'à le compiler avec un compilateur C++. Evitez d'utiliser Visual Studio .Net, ou vous serez forcer d'éditer le code pour utiliser la dernière norme du C++.


Voici le code final:

#include <windows.h>
#include <iostream.h>

int main(){

HWND Wnd=0;
LPDWORD PID;
DWORD Proc=0;
HANDLE Hproc;
DWORD Addr = 0x052858E ;
BYTE PATCH[] = "\x90\x90\x90";

Wnd = FindWindow(NULL,"Demo Game");

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,NULL)){

                cout << "ecriture effectuee";
            }
        }
        else cout << "ouverture du process impossible";
    }
    else cout << "Process ID non trouve";
}
else cout << " le jeu n'a pas ete trouve" ;
}