Memory editing [c++]

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

Mr-N4th4n-X3

Membre Banni
Dec 4, 2009
381
0
581
26
Dans mon pc
gam3-of-gam3rs.max2forum.com
Tout d'abord , bonjour à tous.

Dans ce tutoriel , je vais vous expliquer , et apprendre comment écrire et lire dans la mémoire en utilisant le langage c++ (C'est dans le titre ok)

Nécéssaire

Un IDE :
Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!

Un cerveau :
Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!

Un minimum de bases en c++:
Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!
à lire avec la suite.

Tout d'abord , je met en garde les puristes de la programmation POO , mais je ne fais ce tutoriel rien que expliquer les fonctions, je n'écris donc en aucun cas
un code de manière "POO".

I . Le pID, le handle:

Pour pouvoir écrire dans un programme , il nous faut son pID (processID).

Tout d'abord , nous allons chercher notre fenêtre (Ici , Wow) :

Code:
HWND fenetre = FindWindow(NULL, "World of Warcraft");
"fenetre" contient ici le handle de la fenêtre de WoW.

Ensuite , nous allons chercher le pID
Nous devons donc déclarer une variable de type DWORD.

Code:
DWORD pID;
GetWindowThreadProcessId(fenetre, &pID);
Et on stocke le pid dans notre variable pID.

Ensuite , nous allons déclarer le handle qui nous servira à écrire /lire la mémoire tout le long du programme.

Code:
HANDLE handle
handle = OpenProcess(PROCESS_ALL_ACCESS, 0, pID);
On ouvre le processus qui a le pid "pID".
Voilà nous avons notre handle.

II. Le playerbase:

Pour trouver notre playerbase (PB) il nous faut lire dans la mémoire, le code étant assez long , pour une question de lisibilité , je l'écrirais d'une manière simple , mais longue.

Il nous faut tout d'abord déclarer nos pointeurs

Code:
long pointer = 0x12d4ea8,base,value,p1
pointer contient l'adresse où nous allons lire dans un premier temps.

Bon la question est , comment lire dans la mémoire en c++?

Il nous faut tout d'abord inclure une librairie :
Code:
#include <windows.h>
La fonction pour lire dans la mémoire est :
ReadProcesseMemory().

Exemple d'utilisation

Code:
ReadProcessMemory(handle,(LPVOID)pointer,&value,sizeof(value),NULL);
-Handle : représente "l'adresse de la fenêtre". Il indique dans quel programme nous lirons.
-pointer : contient l'adresse à laquelle nous allons lire.
-value : stock le contenue de l'adresse lu dans cette variable.
-Sizeof(value) : renvoit la valeur de la variable.
-Null : un argument qui ne nous intéresse pas.

Cependant , l'acquisition du playerbase se fait en 3 lectures.
On procède donc de cette manière :
Code:
ReadProcessMemory(handle,LPVOID)pointer,&value,sizeof(value),NULL);
ReadProcessMemory(handle,(LPVOID)(value + 0x34),&p1,sizeof(p1),NULL);
ReadProcessMemory(handle,(LPVOID)(p1+ 0x24),&base,sizeof(base),NULL);
Pour comprendre le fonctionnement d'acquisition du playerbase , référez vous au Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!

Nous avons maintenant notre playerbase dans la variable base.

III. Ecrire dans la mémoire:

On s'en serait douter , écrire dans la mémoire n'est pas bien plus compliquer une fois les étapes précédentes effectuées :
On utilise la fonction WriteProcessMemory().

Exemple d'utilisation:
Code:
WriteProcessMemory(handle,(LPVOID) (base + 0x798),&x,sizeof(x),NULL);
-Handle : représente "l'adresse de la fenêtre". Il indique dans quel programme nous écrirons.
-base + 0x798 : représente l'adresse à laquelle nous allons écrire.
Base est le playerbase (Ha bon?) et 0x798 est l'offset (position X du joueur).
-x : est la variable qui contient ce que nous écrivons .
-Sizeof(x): renvoit la taille de la variable
-Null : un argument qui ne nous intéresse pas.

IV. Conclusion :


Notre programme devrais avoir cette allure là : Code:
#include <windows.h>
#include <iostream>


using namespace std;

int main()
{
long pointer = 0x12d4ea8,base,value,p1;
HWND fenetre;
HANDLE handle;
DWORD pID;

fenetre = FindWindow(NULL, "World of Warcraft");

if (fenetre != 0)
{

GetWindowThreadProcessId(fenetre, &pID);

handle = OpenProcess(PROCESS_ALL_ACCESS, 0, pID);

ReadProcessMemory(handle,(LPVOID)pointer,&value,sizeof(value),NULL);
ReadProcessMemory(handle,(LPVOID)(value + 0x34),&p1,sizeof(p1),NULL);
ReadProcessMemory(handle,(LPVOID)(p1+ 0x24),&base,sizeof(base),NULL);
cout<<base;
// On lit / écrit la mémoire à partir d'ici.
}

return 0;
}
Le tutoriel s'achève ici , j'espère que vous aurez compris.
Si vous avez besoin d'aide , où un problème avec le tuto n'hésitez pas à me MP ou de répondre pour que les autres lecteurs en profitent.
N.B. la librairie nomad memory est basée sur ces fonctions , je ne sais pas pour blackmagic en revanche.