Le but est de trouver dans la mémoire du jeu les données que tu souhaites modifier, tu as deux options pour les trouver :
- Utilisation d'un pointeur, qui va te permettre en gros de retrouver la bonne adresse mémoire à coup sur (perso Cheat Engine galère à scanner les pointeurs). Ce pointeur peut changer lors d'une MàJ du client.
Avantages : rapidité, pas besoin de scanner toute la mémoire puisqu'avec la BASE_ADDRESS de Dofus et le pointeur tu retrouves ta valeur.
Point noir : pour trouver un pointeur il faut faire des pointermaps, ça peut prendre des heures / jours.
- Utilisation d'un pattern, exemple si tu sais que le constructeur d'une classe fait :
maVariable = 14; // type int
isEnabled = UneFonctionRandom(); // type bool
monAutreVariable = 5478924; // type double, double précision
Et bien tu peux construire un pattern de cette manière :
00 00 00 0E ?? 41 54 E6 83 00 00 00 00
Une librairie peut prendre ce pattern en paramètres d'une fonction et te retourner les résultats qu'elle aura trouvé dans la mémoire d'un processus.
00 00 00 0E représente la valeur 14, type int donc 4 octets
?? représente une valeur inconnue mais on sait qu'elle est sur un octet car c'est un bool
41 54 E6 83 00 00 00 00 représente la valeur 5478924 en type double, double précision soit 64 bits / 8 = 8 octets
Attention à l'endianess
Les octets doivent alors êtres inversés
41 54 E6 83 00 00 00 00 devient alors 00 00 00 00 83 E6 54 41
00 00 00 0E devient alors 0E 00 00 00
Avantages d'un pattern :
Pas besoin de mise à jour sauf si les propriétés de ton objet changent : tu devras adapter ton pattern.
Point noir du pattern :
Il faut en trouver un solide et qui marche à coup sur et de bien tomber sur la bonne "case" mémoire
![img]()
MapID est de type Number donc double double précision cf doc ActionScript 3
MapID en hexa = 41 89 D4 E9 48 00 00 00
MapID en mémoire
![img]()
Donc attention au sens :)