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 59 60 61 62 63 64 65 66 67 68 69 70 71
| #include <iostream> //Fichier d'en-tête necessaire au flux cout
#include <windows.h> //Fichier d'en-tête neccesaire pour utiliser les fonctions FindWindow(),GetWindowThreadProcessId()
//OpenProcess(),ReadProcessMemory() et la fonction Sleep()
using namespace std;
int main ()
{
BYTE patch[] = "\x90\x90\x90"; //Déclaration d'une variable BYTE qui contient le patch
intptr_t Adressememoire = 0x007C8F77; //Adresse mémoire où appliquer le patch
LPCWSTR Titrefenetre = (L"Tom Clancy's H.A.W.X"); //Déclaration d'une variable LPCWSTR qui contient le nom de la fenêtre du jeu
DWORD Pid = 0; //Déclaration d'une variable DWORD qui contiendra le PID du processus du jeu
SIZE_T Infolues = 0; //Déclaration d'une variable size_t qui contiendra le nombre d'octets lu
SIZE_T Infoecrites = 0; //Déclaration d'une variable size_t qui contiendra le nombre d'octets écrie
int Valeurlue = 0; //Déclaration d'une variable int qui contiendra la valeur lue en mémoire
HWND Handlefenetre = 0; //Déclaration d'un HWND qui contiendra un handle sur la fenêtre du jeu
HANDLE Handleprocess = 0; //Déclaration d'un Handle qui contiendra un handle sur le processus du jeu
SetConsoleTitleA ("Tom Clancy's H.A.W.X V 1.02 trainer By NiCk.0"); //Changement du titre de l'application console
cout << "Lancement du trainer " << endl;
cout << endl;
cout << "En attente du processus ..." << endl;
do{ //Boucle qui permetra de se mettre en standby si la fenetre n'est pas trouvee
Sleep (500); //On attend 500ms pour pas surcharger le processeur de facon inutile
//tant que le jeu n'est pas lancé
Handlefenetre = FindWindow(0,(Titrefenetre)); //Recherche de la fenetre par son nom, le nom doit être utiliser en tant que deuxieme
//argument de la fonction, cette fonction renvoie un handle sur la
//fenetre trouvée.
}
while (Handlefenetre == NULL); //Tant que la fonction FindWindow() n'a pas renvoyé un handle la boucle se poursuit
GetWindowThreadProcessId(Handlefenetre,&Pid); //On récupére le PID du processus cette fonction prend en argument un Handle sur fenetre
//et un pointeur sur une valeur DWORD qui recevra le PID
cout << "Fenetre trouvee ... "<< endl;
cout << "Tentative d'ouverture du processus" << endl;
Handleprocess = OpenProcess (PROCESS_ALL_ACCESS,true,Pid); //La fonction renvoie un handle sur processus le premier argument
//est le type d'acces désiré, le second permer de spécifier si on veut que il y est
//un héritage de l'handle et le dernier la variable contenant le PID
if (Handleprocess != NULL){ //Instruction à éxécuter dans le cas ou le processus est bien ouvert
cout << "Processus ouvert, HANDLE sur processus acquis " << endl;
cout << "Tentative de lecture de la memoire" << endl;
ReadProcessMemory(Handleprocess,reinterpret_cast<void*>(Adressememoire),&Valeurlue,3,&Infolues); // Lecture de la mémoire la fonction prend comme argument
// le handle sur processus retourné par OpenProcess(),l'adresse où lire dans la mémoire via
// un cast vers un void* ,un pointeur sur une variable qui recevra les données lues,le nombre d'octet à lire,
// et pour finir un pointeur sur une variable qui recevra le nombre d'octet lu.
if ((Infolues == 3)&&(Valeurlue == 0x286e01)) //Instruction à éxécuter dans le cas ou on a bien lue 3 octets de données et que ca correspond à ce qui est attendu
//Cela peut être utile pour detecter l'utilisation du trainer sur une autre version du jeu que celle pour laquelle il a été codé
{
cout << "Ok " << endl;
cout << "Tentative d'injection des donnees" << endl;
WriteProcessMemory(Handleprocess,reinterpret_cast<void*>(Adressememoire),patch,sizeof(patch),&Infoecrites); //On écrit en mémoire la fonction utilise comme argument un handle sur processus,
//l'adresse ou écrire caster vers un void*,la variable contenant les données à écrire,
//la taille des données à écrire via sizeof et un pointeur vers une variable qui contiendra le nombre d'octets écrit
if (Infoecrites == sizeof(patch)) //Instruction à éxécuter si la taille des données écrites en mémoire est égale à la taille des données qui devrait être écrite .
cout << "Injection reussie" << endl;
else
cout << "Injection ratee" << endl ; //Instruction à éxécuter si la taille des données écrites en mémoire est differente à la taille des données qui devrait être écrite.
}
else
cout << "Erreur de lecture en memoire, assurez vous d'utiliser la version 1.02 du jeu."<< endl;
CloseHandle(Handleprocess);
} //On ferme l'Handle sur processus la fonction prend pour argument l'handle à fermer
else //Instruction à éxécuter dans le cas ou le processus n'a pu être ouvert
cout << "Erreur a l'ouverture du processus" << endl;
system("PAUSE");
return 0;
} |
Partager