Vous me direz:"pourquoi coder un trainer quand TMK le fait déjà très bien?". Très bonne question!! Vous aurez une image :D
Bah tout simplement, parce que même si TMK est de loin le plus poussé des TrainerMakers, il ne fait pas tout. Donc ici, je vais montrer simplement comment coder les bases d'un trainer, plus ou moins identique à celui fait pour projet IGI 2. Dans un autre tutoriel en c#, je montrerai d'autres choses.

ATTENTION ce code peut être copié collé et édité dans vos trainers, pas de lamers ici :D. Deuxième chose, si vous ne connaissez pas grand chose à la programmation w32 ou au c++ ou un autre langage, ne lisez pas la suite, vous allez vous abîmer le cerveau ;)

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 = FindWindow(NULL,"Projet IGI2");

 

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" ;
}