[C#]Memory editing

  • Partenaires

Utilisateurs qui regardent le poste (Total: 0, Members: 0, Invité: 0)

davydavekk

davydavekk

Level 5
Level 4
Level 3
Level 2
Level 1
23 Mai 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.
-
-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à.
 
Dernière édition:
casimir

casimir

Level 5
Level 4
Level 3
Level 2
Level 1
30 Mars 2011
1,013
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 ;)
 
Dernière édition:
davydavekk

davydavekk

Level 5
Level 4
Level 3
Level 2
Level 1
23 Mai 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:
 
Dernière édition:
Ben

Ben

Master Chief
Level 5
Level 4
Level 3
Level 2
Ancien staff
Level 1
3 Mars 2011
4,060
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

Nociif

2b || !2b
Level 5
Level 4
Level 3
Level 2
Level 1
23 Sept. 2011
2,604
5
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
 
davydavekk

davydavekk

Level 5
Level 4
Level 3
Level 2
Level 1
23 Mai 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

Evaelis

La Voix de la Sagesse
Level 5
Level 4
Level 3
Level 2
Ancien staff
Level 1
28 Avr. 2010
22,929
465
1,699
Valhalla
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.
Alt Shift ?
 
Xxsasuke

Xxsasuke

Membre Banni
2 Nov. 2012
78
0
211
30
Oo je vais éviter de me balader dans cette section si je tien à mon cerveau --'
 
[S]hin

[S]hin

Level 5
Level 4
Level 3
Level 2
Level 1
18 Janv. 2014
1,589
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
 
davydavekk

davydavekk

Level 5
Level 4
Level 3
Level 2
Level 1
23 Mai 2013
508
0
322
'merica
Pourrais-tu reformuler cette question ? Je ne comprend pas ce que tu essaies de dire.
 
[S]hin

[S]hin

Level 5
Level 4
Level 3
Level 2
Level 1
18 Janv. 2014
1,589
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.
 
davydavekk

davydavekk

Level 5
Level 4
Level 3
Level 2
Level 1
23 Mai 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

[S]hin

Level 5
Level 4
Level 3
Level 2
Level 1
18 Janv. 2014
1,589
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 ?
 
davydavekk

davydavekk

Level 5
Level 4
Level 3
Level 2
Level 1
23 Mai 2013
508
0
322
'merica
Qu'est-ce que tu veut dire par "custom game" ? On peut créer une partie personnalisée sans hack.
 
[S]hin

[S]hin

Level 5
Level 4
Level 3
Level 2
Level 1
18 Janv. 2014
1,589
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
 
P

Patak

Level 3
Level 2
Level 1
30 Oct. 2012
63
0
572
Très belle Class davydavekk !
Structurée & propre :)

Je serai enchanté que DaMemory paraisse sur !

Catégorie si ton avis est favorable :)

J'attends ta décision :noel:
 
Dernière édition:
davydavekk

davydavekk

Level 5
Level 4
Level 3
Level 2
Level 1
23 Mai 2013
508
0
322
'merica
Si tu veut bien prendre le temps de la poster, aucun problème. (la version a jour est )
 
Ben

Ben

Master Chief
Level 5
Level 4
Level 3
Level 2
Ancien staff
Level 1
3 Mars 2011
4,060
3
944
Un peut partout.
même si ça merdouille de temps en temps, go envoyer des tuto à fond mon ptit ça fait un moment qu'on t'a pas vue !
 
Misuki

Misuki

Git Wizard en freelance
Level 5
Level 4
Level 3
Level 2
Ancien staff
Level 1
15 Juin 2012
2,299
66
954
Miss you davy ♥
 
davydavekk

davydavekk

Level 5
Level 4
Level 3
Level 2
Level 1
23 Mai 2013
508
0
322
'merica
J'en ai quelques autres en stock, mais je ne sais pas si ça intéresse les gens de ce forum
 
Misuki

Misuki

Git Wizard en freelance
Level 5
Level 4
Level 3
Level 2
Ancien staff
Level 1
15 Juin 2012
2,299
66
954