Part II Creation d'une DLL-Proxy (Lecture Ecriture memoire)

  • Le Discord de CG3 est maintenant de retour : Discord ! Cependant ce dernier aura des nouvelles règles, nous vous invitons à lire ceci : Nouveau discord CG3

casimir

V
IV
III
II
I
30 Mars 2011
1,014
1
944
In Your Ass
Infos :

Il faut avoir suivi le premier tuto pour attaquer celui ci

http://www.cheat-gam3.com/7-cours-pour-debutant/creation-dune-dll-proxy-pour-cheat-hack-163774/

Rappel

Ceci est l'adaptation en partie du tuto de Thiesius de Elitepvp
Sur la creation d'un cheat sous forme de dll


Pour ce Tuto je continue d'utiliser Rumerstrike
(déjà utiliser pour la partie 1 et la recherche des offsets)

GO GO !!

Ce coup ci ,contrairement au cheat externe au jeux , on est déjà dans le processus
Donc pas besoin du mode debug , de l ouverture du PID ect....
En revanche nous sommes (au niveau de l adresse memoire ) dans la dll pas dans le module Romustrike.exe

Donc pour commencer il nous faut l adresse du module pour pouvoir calculer nos adresse .

Pas besoin de se prendre la tete ;)

Code:
GetModuleHandle("romustrike.exe")
cette commande suffit si on le "cast" en DWORD
(j’espère que je ne me trompe pas d'expression , j’apprends en meme temps lol )

ce qui donne dans le code :

Code:
Romustrike = (DWORD)GetModuleHandle("romustrike.exe"); // adresse du module romustrike.exe
pour continuer il me faut les offset qui m intéresse , a savoir , la vie et les balles de mon perso

pour trouver ces offset vous avez ce tuto http://www.cheat-gam3.com/tutoriel/tuto-creer-un-cheat-de-z-163096/
baser sur romustrike ;)

pour mon cheat j ai trouver ceux ci :

Code:
DWORD OffstePb01 	= 0x18B9C4 ; 
DWORD OffstePb02	= 0x743298 ;
DWORD OffsetVie		= 0x3b480 ;
DWORD OffsetBalles	= 0x26990 ;
les OffstePb01 et 02 c est pour trouver l’adresse base du joueur
vie et balles sont en fonction de l'adresse de base

Le gros du bordel !!!

J'ai créer deux commande ".Vie" et ".Setvie"

.Vie affiche les pv et les balles du perso
.Setvie modifie les pv avec la valeur choisi

LECTURE !!
.Vie

Variables
Code:
	DWORD  Romustrike = 0 ; // Pour l adresse du module
	DWORD  dwBuffer = 0 ; // Un tampon pour les transfère de memoire
	DWORD* pointeur = 0 ; // Un pointeur ;)
	DWORD playerBase = 0; // Mon adresse de base du joueur
	DWORD vie = 0 , balles =0; // La vie et les balles

dans le principe habituel on ferait

memoryread(module+OffstePb01,proc,dword)
ici ca donneras :

Code:
			Romustrike = (DWORD)GetModuleHandle("romustrike.exe"); // adresse du module romustrike.exe

			dwBuffer = Romustrike + OffstePb01 ; // calcule de la nouvelle adresse module+offset 1 romustrike.exe + 18B9C4
			pointeur = (DWORD*)dwBuffer ; // passe l adresse en pointeur
			dwBuffer = (DWORD)*pointeur ; // transfere ce qui est pointé dans le buffer = ptr1=memoryread(Romustrike + OffstePb01,dll,dword) 3330020

Voila a ce moment la le dwBuffer contient le resultat de la lecture

vous voyez un coup "pointeur = valeur"
et apres "dwbuffer =(dword)*pointeur"

quand vous avez l asterix devant c est pour dire
"lire la valeur qui se situe a l'adresse du pointeur "
sans l'asterix c est juste l'adresse qui est retourner
et donc la suite :

Code:
			dwBuffer = dwBuffer + OffstePb02 ; //  calcule de la nouvelle adresse ptr1+offset 2 3330020 + 0x743298
			pointeur = (DWORD*)dwBuffer ; // passe l adresse en pointeur
			dwBuffer = (DWORD)*pointeur ;// transfere ce qui est pointé dans le buffer = ptr2=memoryread(ptr1+ OffstePb02,dll,dword) 9ef3df8
			
										//  pas de calcule de la nouvelle adresse  ptr2+0
			pointeur = (DWORD*)dwBuffer ; // passe l adresse en pointeur
			dwBuffer = (DWORD)*pointeur ;// transfere ce qui est pointé dans le buffer = memoryread(ptr2,dll,dword) player base;
			playerBase = dwBuffer ;
			// lecture vie
			dwBuffer = playerBase + OffsetVie ; // calcule de l adresse
			pointeur = (DWORD*)dwBuffer ; // passe l adresse en pointeur
			vie = (DWORD)*pointeur ; // dwbuff = point de vie
			
			dwBuffer = playerBase + OffsetBalles ; // calcule de l adresse
			pointeur = (DWORD*)dwBuffer ; // passe l adresse en pointeur
			balles = (DWORD)*pointeur ; // dwbuff = Balles dans le chargeur
pour ce code je me suis écrit les commentaires au fur et a mesure sinon je ne comprenais plus
on pourrais faire une fonction pour éviter la lecture mémoire a répétition

Apres tout ceci mes variables Vie et Balles contiennent les bonnes valeurs !!


plus qu'a afficher avec le formatage

Code:
			printf_s("\nPoints de vie :  %d  \nBalles dans le chargeur %d ",vie,balles);
le %d sa stipule un format decimale de la variable


ECRITURE !!

Tous les calcules d adresses sont identique
juste on vas inverser la manipulation du pointeur

Pour les points de vie a changer je defini une variables
Code:
DWORD Setvie ;
une demande a l'utilisateur pour connaitre le nombre de pv

Code:
printf_s("\nNombre de Pts de vie : ");
scanf("%d", &Setvie);
et maintenant je doit coller cette valeur a l'adresse de la Vie

pour lire la vie on a fait

Code:
vie = (DWORD)*pointeur ; // dwbuff = point de vie
(ce qui se trouve a l'adresse du pointeur vas dans la variable vie)

la on inverse !
Code:
*pointeur = Setvie ;
(la valeur de "Setvie" est coller a l'adresse du pointeur )

!!
Par contre je ne sais pas encore sortir du jeux correctement
Quand je l arrête la console est figée....
Voila ;)


si joint le projet VS C++
 

Pièces jointes

TheHardButcher

Programmeur C/C++
Programmeur
V
IV
III
II
I
14 Déc. 2009
1,462
58
964
France
Nice, merci pour cette suite ;)

> Chez moi je n'ai pas le problème de sortie et de la console figée (WIN8.1) mais tu pourrais toujours essayer cette fois si de hook la fonction de sortie de la SDL (qui signifie surement la fin du programme) pour fermer ta console proprement
 

Misuki

Git Wizard en freelance
V
IV
III
II
Ancien staff
I
15 Juin 2012
2,304
66
774
Bon tuto ! Malgré tout il pourrait être amélioré, car ils y a certains point qui ne sont pas très très expliqué. Merci beaucoup, ça me donne envie de me mettre d'avantage au C++ !
 

Nayres

Membre Banni
15 Avr. 2012
3,431
0
341
Quelque part.
M

Membre supprimé 245833

Bon tuto, mais il aurait été, je pense, préférable que tu le mettes dans l'ancien sujet ^^'
 

casimir

V
IV
III
II
I
30 Mars 2011
1,014
1
944
In Your Ass
Bon tuto, mais il aurait été, je pense, préférable que tu le mettes dans l'ancien sujet ^^'
oui je me suis poser aussi la question mais le PAVE de l'autre sujet est deja bien lourd et concentré sur la creation et le fonctionnement de la DLL (les replys vont dans se sens ) alors je me suis dit un second ca peut etre plus "clair" ...... ou pas .....

ici c'est plus de la manipulation de memoire (enfin je trouve )

---------- Message ajouté à 08h28 ---------- Le message précédent était à 08h26 ----------

Bon tuto ! Malgré tout il pourrait être amélioré, car ils y a certains point qui ne sont pas très très expliqué. Merci beaucoup, ça me donne envie de me mettre d'avantage au C++ !
a ce jour 0 telechargement sur le projet ....
si tu veux comprendre essaye de regarder le projet fournis .....
 

davydavekk

V
IV
III
II
I
23 Mai 2013
508
0
322
'merica
Pour régler le bug avec la console, essaie d’appeler FreeConsole dans DLLMain. (plus précisément dans la condition " if(reason == DLL_PROCESS_DETACH)" )
 

casimir

V
IV
III
II
I
30 Mars 2011
1,014
1
944
In Your Ass
Effectivement au detachement , dans le code je libere la dll chargé , mais rien sur la console
je test ce soir !!

Code:
if (reason == DLL_PROCESS_ATTACH)
		{
......
hL = LoadLibrary("sdl_.dll");

.....
.....
if (reason == DLL_PROCESS_DETACH)
		{
		FreeLibrary(hL);
		}
 

Misuki

Git Wizard en freelance
V
IV
III
II
Ancien staff
I
15 Juin 2012
2,304
66
774
a ce jour 0 telechargement sur le projet ....
si tu veux comprendre essaye de regarder le projet fournis .....
Ne le prend pas mal, c'était une observation.

J'ai du relire plusieurs fois pour bien comprendre tous ce que tu voulais dire, c'est de ça que je parlais par "points noirs". Comme par exemple, dans la première partie, où tu nous raconte qu'il faut créer un thread avec la routine "CheatMain", il faut regarder les sources pour comprendre de quoi tu parles. Je pense que si tu voulais améliorer le tutoriel, tu pourrais réexpliquer pas mal de chose, cependant le tutoriel est très bon et je re-remercie pour l'avoir rédiger, c'est pas tous le temps qu'on croise des gens capable de rédiger un tel tutoriel :)