[C#]Memory editing

    Publicités

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

May 23, 2013
508
0
322
'merica
Bonjour,

J'ai récemment codé une classe pour faciliter le memory editing, alors en plus de la partager j'écrit un petit loooong tuto.

Memory editing, qu'est ce que c'est ?

C'est tout simplement éditer la mémoire (là où sont stockées les variables [oui je sais que c'est pas vraiment vrai, mais c'est destiné au débutants]) d'un programme, comme on peut le faire avec Cheat Engine.

Prérequis​
-Un IDE, comme Visual C# 20xx express, ou encore Visual Studio 20xx.
-Connaître les différences entre les différent types de variables.
-Savoir ce qu'est l'Héxadécimal. (Google)
-Un minimum d'expérience en programmation.
-Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!
-Cheat Engine
-Compréhension de l'anglais.

Background
Les programmes que vous utilisez tout les jours, sont placés, quand vous les lancez, dans la RAM (Random Access Memory) de votre ordinateur.

Cette RAM, elle est bien organisée (pour nous faciliter le travail ? ;) ).

Il y à ce qu'on appelle des adresses(représentées par un nombre Héxadécimal) . Ces adresses (qui sont les trucs du genre "0008ED7C", qu'on peut voir dans Cheat Engine), contiennent 1 byte ( 8 bits) de donnée(instruction ASM, variable).

Un nombre de type Integer (par exemple, 1293), occupe 4 bytes (32 bits), il sera donc étalé sur 4 adresse.

Code:
int32 var1 = 12; // le type int32 est égal au type int (ou Integer en VB)
int16 var2 = 2; // le type int16 est égal au type short

Supposons que notre var1 est placée à l'adress 0003841, étant donné que sa taille est de 4 bytes, elle occupera les adresses :

0003841
0003842
0003843
0003844

Puis à 0003845 et 0003846, on aura var2( 2 bytes).
On peut aussi dire que var2 est placée à var1 + 0x4 (+0x4 est ce qu'on appelle un offset, à retenir)

Pour ceux qui se demandent à quoi correspond le 0x devant le 4, c'est tout simplement pour montrer qu'il s'agit d'un nombre héxadécimal.(En VB c'est &H)

12d = 0xC
0x12 = 18d

(le d signifie décimal, mais pas besoin de l'ajouter à chaque fois)

Voilà pour le background, j'espère que vous avez tout compris (n'hésitez pas à le relire).



Assez de blabla !

Passons au sujet principal du tutoriel

-Ouvrez Cheat Engine
-Ouvrez Cheat Engine tutorial (situé dans le dossier d'installation)
-Ouvrez votre IDE

Créez un nouveau projet (Console application), puis ajoutez cliquez sur "Ajouter un élément existant", et sélectionnez DaMemory.cs, fraîchement téléchargée.

Instanciation de la classe + sélection du processus auquel on veut modifier la mémoire.

Code:
DaMemory m = new DaMemory();
m.FindProcess("Tutorial-i386"); // Vous pouvez aussi faire un check avec une variable bool, pour voir si le processus a bien été trouvé.

Pour le step 1 du tutoriel, il nous demande de mettre la vie à 1000.
On cherche donc l'adresse qui contient la vie (type integer (4 bytes)).
Moi j'ai trouvé 0x8BE58(les adresses sont toujours en héxadecimal).
On peut donc utiliser la fonction WriteInteger, comme ceci :
Code:
m.WriteInteger(0x8BE58,1000);
Puis voir si l'écriture s'est bien déroulée :
Code:
Console.WriteLine(m.ReadInteger(0x8BE58)); // Lit 4 bytes à l'adresse 0x8BE58
On oublie pas de "libérer" le process après la lecture :
Code:
m.Detach();
Console.ReadKey(); // Crée une pause pour qu'on ai le temps de lire
Si la console vous affiche "1000", c'est que ça a bien marché :)

Vous pouvez vous entraîner sur les autres step du Cheat Engine tutorial.
NOTE : Pour le step 6, utilisez la fonction "Read1lvlPointer"
Voilà, vous maîtrisez les bases du memory editing :)
Avancé
(Allez jusqu'au step 8 du Cheat Engine Tutorial)

Partie avancée du tutoriel, ici on voir comment faire quand le jeu utilise des Multi Level Pointers.

Qu'est ce qu'un pointer ? Un type de variable qui contient ce qui est placé dans une autre variable ! (Oui c'est assez dur à comprendre pour les débutant, mais ça viendra ;) )

Pour commencer, trouver l'adresse de la valeur. (NE CLIQUEZ SURTOUT PAS SUR CHANGE POINTER, CA RUINERAIT TOUT)

Moi je trouve : 0x60008, je clique droit, puis "Find out what accesses this address". Après avoir cliqué sur "change value", je voit : "mov [esi+18],eax" et "The value of the pointer needed to find this address is probably 0x5FFF0" (Ces valeurs ne seront surement pas les mêmes chez vous).

Je lance donc un scan hexadécimal pour 5FFF0, je trouve l'adresse 5FFB0.
Vous vous souvenez du "mov [esi+18],eax" (rappel : 18 est notre offset) ? Eh ben ouvrez la calculatrice windows (mode programmeur). Entrez "5FFF0 + 18" (enfin, l'adresse que vous avez trouvez), et bim, le résultat c'est l'adresse qui contient notre valeur !
Vous comprenez l'utilité des offsets maintenant ?

Clic droit et "Find out what accesses this address" sur 0x5FFB0, et répétez ce qu'on a fait au dessus, jusqu'à trouver une adresse verte (static) (N'oubliez pas de noter les offsets, même si ils sont nulls(=0) !)

Ce que j'ai trouvé de mon côté :
(la base devrait être la même pour vous)
Code:
Base (static) : (adresse)0x631390 :  (value)0x10CA18 : Offset +C

On fait donc 10CA18 + C, ce qui donne 10CA24.
Code:
0x10CA24 : 0xC8428 : Offset : +14
(C8428+C) 0xC843C : 0x5FFB0 : Offset : +0
0x5FFB0 : 0x5FFF0 : Offset +18
(5FFF0 + 18)  0x60008 : (valeur)

Pour mieux comprendre tout ça, cliquez sur "add address manually", et cochez la checkbox "pointer".
Entrez 631390 comme adresse. Puis cliquez sur "add offset" jusqu'à avoir 4 textbox.

(de bas en haut) Entrez les offsets : C, 14,0,18.
Puis OK.
CheatEngine fait le travail pour vous, et trouve l'adresse où est stockée la valeur.
Maintenant vous pouvez cliquer sur "Change pointer".
Toute les autres adresses on des 0 (ou des valeurs bizarres), sauf le pointer qu'on vient de faire, qui pointe toujours à la bonne valeur !


Assez de CE, passons au C# !

Comme d'habitude :

Code:
DaMemory m = new DaMemory();
m.FindProcess("Tutorial-i386");
Et maintenant, on va déclarer un tableau, pour stocker nos offsets :
Code:
int[] offsets = {0xC,0x14,0x0,0x18}; //Dans l'ordre, et on ajoute même l'offset 0.

Puis on utilise la fonction ReadFromPTR, avec en arguments l'adresse statique qu'on a trouvé et le tableau d'offset.
Code:
 Console.WriteLine(m.ReadFromPTR(0x631390, offsets));
m.Detach(); // ne pas oublier !
Console.ReadKey(); //pause

La console devrais vous afficher la valeur du pointer que vous voyez dans CE.
Utilisez la fonction WriteToPTR, avec les mêmes arguments (+ la nouvelle valeur que vous voulez mettre).

End​

Voilà, vous savez maintenant faire du memory editing, j'espère que vous avez compris le tutoriel (n'hésitez pas à relire plusieurs fois), et que ça vous servira pour la suite :)

N'hésitez pas à poser des questions sur ce topic, j’essaierais d'y répondre dans les plus brefs délais.


Cordialement,

Davy.W (davydavekk)


PS : J'ai pris pas mal de temps pour écrire tout ça, les remerciements ne sont pas de refus :noel:

Flemme de me relire maintenant, soyez indulgent pour les fautes d'orthographe :>
Désolé aussi pour la mise en page de merde, mais j'suis vraiment pas doué à ces trucs là.
 
Last edited:
Mar 30, 2011
1,014
1
944
In Your Ass
j ai lu que le debut mais ca merdouille un peu la :

Un nombre de type Integer (par exemple, 1293), occupe 4 bytes (32 bits), il sera donc étalé sur 4 adresse.

il auras la taille que le programmeur lui donneras 16,32 ou 64 bits pour 1293....

Integer ou Entier defini le type mais pas la taille
Code:

int64 var1 = 12; // le type int64 est égal au type int (ou Integer en VB)
int32 var2 = 2; // le type int32 est égal au type short

Supposons que notre var1 est placée à l'adress 0003841, étant donné que sa taille est de 4 bytes, elle occupera les adresses :

0003841
0003842
0003843
0003844

Puis à 0003845 et 0003845, on aura var2( 2 bytes).
On peut aussi dire que var2 est placée à var1 + 0x4 (+0x4 est ce qu'on appelle un offset, à retenir)

int64 c est un entier de 64 bits donc 8 octets et pas 4
int32 c est un entier de 32 bits donc 4 octets et pas 2, donc pas un short qui correspond a un 16 bits

et de 0003845 a 0003845 ... ca fait 1 byte pas 2 ;)
 
Last edited:
May 23, 2013
508
0
322
'merica
Je corrige ça de suite.

Et non c'est pas du google trad, mais bien écrit de mes mains.

J'avais pas vu ton édit :
il auras la taille que le programmeur lui donneras 16,32 ou 64 bits pour 1293....

Integer ou Entier defini le type mais pas la taille
Une variable de type int fait toujours 32 bits, faut différencier entre le type en programmation et le mot anglais, "integer".



Je ferais peut être un autre tuto "expert" pour expliquer comment la classe fonctionne en interne, ça intéresse des gens ? o:
 
Last edited:

Ben

Master Chief
V
Ancien staff
Mar 3, 2011
4,069
3
944
Un peut partout.
C'est intéressant oui mais bon sur ce forum il n'y a pas grand monde qui s’intéresse à ça (une dizaine de personnes et encore je compte très large)
Ici c'est plus du genre "jé cré un hack dofus chui tro for" alors que c'est juste du copier d'un code déjà fait.
 

Nociif

2b || !2b
V
Sep 23, 2011
2,607
4
944
push location
Discord
Nociif#5969
Très intéressant, Ben il y a pas mal de gens qui aimeraient comprendre un peut plus ce qu'ils font en faisant un "hack" et ce genre de tutoriel explicatif est utile pour ceux qui veulent faire ceci. Et qui sait, peut être qu'un jour les mentalités changeront :rêve:

Personnellement je ne vais pas m'opposer à ce changement: très bon tuto
 
May 23, 2013
508
0
322
'merica
Je suis content que ça plaise a quelques personnes :)

@Ben : Oui, malheureusement. Je vais quand même continuer a écrire quelques tuto pour essayer d'apprendre a ceux qui cherchent a comprendre un minimum.(je vais en faire un sur l'utilisation du DLLImport, ASAP)

PS: Je suis sur qwerty, désolé pour le manque d'accents.
 

Evaelis

La Voix de la Sagesse
V
Ancien staff
Apr 28, 2010
22,949
468
1,699
Valhalla

Xxsasuke

Membre Banni
Nov 2, 2012
78
0
211
28
Oo je vais éviter de me balader dans cette section si je tien à mon cerveau --'
 

[S]hin

V
Jan 18, 2014
1,595
0
161
Tahia Dz.
Je t'autorise ton facepalm d'avance davy, memory editing, exemple: S4L, un rapport ? car pour mon projet sur LoL sa pourrais m'être utile
 

[S]hin

V
Jan 18, 2014
1,595
0
161
Tahia Dz.
Quand tu parle du memory editing, est-ce qu'S4L est un exemple potable, car memory editing = éditer la mémoire donc pour faire par exemple un cheat, car j'ai un projet sur LoL, et sa pourrais me servir je pense.
 
May 23, 2013
508
0
322
'merica
Sur S4League c'est très utiliser uniquement car le jeu sauvegarde beaucoup de données coté client. Sur LoL, presque tout passe par le serveur donc si tu édite la mémoire de ton client, les autres joueurs ne seront pas affecter.
 

[S]hin

V
Jan 18, 2014
1,595
0
161
Tahia Dz.
Ah /: donc faut être balaise pour attaquer les serveurs, et vu comment Riot est haut placé, j'éviterai, mais genre on peux faire du custom game avec du memory editing ?
 

[S]hin

V
Jan 18, 2014
1,595
0
161
Tahia Dz.
custom game c'est quand tu modifie ton client, mais oui il n'y à pas besoin de hack pour sa, mais je voulais savoir si avec du memory editing on peux aussi modifier son client