C# DofusMemory - Memory made easy

Inscrit
2 Juin 2009
Messages
49
Reactions
44
#1
Bonjour,

Je suis en train de réaliser un projet en C# nommé DofusMemory, c'est une librairie qui a pour but de faciliter l'accès à la mémoire de Dofus, en lecture et en écriture.

C'est une charge de travail assez importante car il faut que je trouve les pointeurs ainsi que les offsets des différents éléments à implémenter dans l'API.

Exemple de fonctions qui pourraient être disponibles via l'API :
- getXXX (XXX = characterName, characterLevel, currentPos, currentMapId etc...)
- setXXX
- DisableInactivityManager
- HavenBagUnlocker
- FreeAutopilot
- et plein d'autres

Sur ce sujet je vais répertorier l'adresse de base des clients ainsi que les offsets nécessaires pour lire/écrire les différentes données.
Je vais aussi essayer d'intégrer des fonctions permettant d’exécuter du code se trouvant en mémoire :D

Client 2.58.1.1 (Windows, 64 bits !!!) :
GAME_BASE : Adobe AIR.dll+0x0151E300
CELL_ID OFFSETS : {0x830, 0x380, 0x8, 0x18, 0x20, 0x5F0, 0x2C} -> int
MAP_ID OFFSETS : {} -> double

& plus à venir !

Bon pour l'instant ce sujet fait plus "PoC" mais je vais pouvoir vérifier demain si l'adresse de base et/ou les offsets changent :)
 
Dernière édition:
Inscrit
26 Janvier 2016
Messages
99
Reactions
34
#2
J'ai du mal à imaginer l’intérêt par rapport à un mitm , mais ça peux faire une belle API pour la commu !
je me demande comment ça se comporte en multi compte :teeth:
 
Inscrit
8 Aout 2020
Messages
4
Reactions
2
#3
Ciao, did you make any improvements?
 
Inscrit
1 Février 2017
Messages
24
Reactions
6
#4
Je suis curieux de l'avancement du projet également!
 

dampenfr31

Contributeur
Inscrit
2 Juin 2009
Messages
49
Reactions
44
#5
Hello,

Merci de votre intérêt pour le projet.

Au niveau de l'avancement sur les pointeurs, j'en ai trouvé plusieurs pointant des objets qui correspondent aux classes instanciées dans le jeu :inlove: (Player, Mount etc..)

Le problème que je rencontre actuellement est que dès que je redémarre mon PC, l'adresse GAME_BASE à l'air de changer ce qui n'est évidemment pas normal et pratique.
Je suis du coup en train de voir si il y a de l'ASLR

https://fr.wikipedia.org/wiki/Address_space_layout_randomization


@Brasvengeur Au niveau du multi-comptes je vais laisser l'utilisateur final gérer ses instances, je comptes pas implémenter un gestionnaire d'instances dans l'API.
J'ai déjà préparé une méthode pour récupérer le processus Dofus associé à un pseudonyme.
Cette méthode ne fonctionne uniquement quand un compte est connecté.

Dampen59
 
Inscrit
14 Decembre 2012
Messages
48
Reactions
2
#6
Je suis curieux de voir comment tu comptes faire pour le hooking/modification mémoire. J'avais essayé de patch la RDM y'a quelques mois mais j'y suis jamais arrivé (je modifiais bien avant le JIT, donc dans mon cas avant de me connecter). Peut-être que je m'y suis mal pris, au cas ou: https://cadernis.com/index.php?threads/patcher-le-rawdatamessage-en-runtime.2504
Je peux te donner un coup de main si tu veux, j'aime bien l'idée du projet ;)
 
Dernière édition:
Inscrit
14 Mai 2019
Messages
66
Reactions
22
#7
Intéressant comme projet, tu utilises cheat engine pour récupérer les adresses mémoires ?
 
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#9
Je suis pas du tout un expert dans le domaine mais je vais essayer d'apporter mon aide, @dampenfr31. Quand tu dis que l'adresse change à chaque fois que tu relances le processus, il me semble que c'est normal. Quand je voulais modifier la mémoire, je scannais le processus à partir d'une suite Hexadécimal pour récupérer l'adresse.
 
Inscrit
2 Juin 2009
Messages
49
Reactions
44
#10
@Brizze Merci ;)
Oui c'est tout à fait normal que les adresses changent, mais normalement avec un pointeur statique ça ne devrait pas être un problème.

La technique à laquelle tu fais référence est une recherche par pattern, elle est fonctionnelle également mais est plus longue à l'exécution car nécessite de scanner toute la mémoire.

C'est uniquement après un redémarrage de mon ordinateur que mes pointeurs ne pointent plus sur les bonnes adresses.
Je suspecte mon pointeur GAME_BASE de changer mais il faut encore que je vérifie, Ankama effectuant une mise à jour du jeu demain, j'en profiterais pour vérifier les offsets des pointeurs que j'ai déjà.

Si de l'ASLR est présente dans tous les cas ça peut être contourné j'ai lu quelques articles sur Internet, il y a plusieurs méthodes pour contourner l'ASLR dans les environnements AIR
 
Inscrit
30 Octobre 2020
Messages
2
Reactions
1
#11
@dampenfr31 , ajoute moi sur discord : MathieuDev56#9510, je fais la même chôse , faut que tu saches que Flash fonctionne bisarement au niveau de ça mémoire, la plus part des pointeurs tu dois faire des scripts à partir d'opcodes pour pouvoir le garder ,j'ai fait un script recupérant tous t'es métiers qui s'auto initialise dans une list lorsque tu ouvres une fois le panel des métiers dans le jeu, j'ai aussi un opcode qui contient Entitys : Base + 3C = Pos.X "4bytes", 40 = Pos.Y "4bytes", 28 = Size.X "double", 34=Size.Y "double", j'ai aussi une Api MemoryReadWrite bien moddifier par moi permettant d'injecter des Mnemonics (x86 - x64) ect ect :)

PS: je suis sous 32bits donc ont pourra faire une API 32bits et 64bits, je code en c# aussi
 
Dernière édition:
Inscrit
30 Octobre 2020
Messages
2
Reactions
1
#12
@amlostudio56 Si le pointer change c'est que t'as pas trouvé le bon base pointer. Sinon il est aussi possible qu'il y ai des allocations différentes et ou se déroulant pas dans le même ordre à chaque fois, du coup les valeurs se retrouvent en décalage.

L'autre solution c'est l'AOB scan, suffit de trouver les instructions qui accèdent à l'adresse (ça se fait facilement étant donné que Dofus n'a pas d'anti-debugger) puis trouver un pattern qui servira à retrouver celle-ci.

Personnellement j'ai jamais essayé de m'intéresser à la mémoire du jeu, parce que j'ai un peu de mal à voir ce qu'on pourrait réellement en tirer. Les autres alternatives sont meilleures je trouve.
Oui, mais dofus est compliquer par rapport au PointerScan, même par rapport à l'AOB Scan , perso le mieux c'est l'opcode en lui même + comparer les structures de ses addresses quand il y en à plusieurs pour récupéré les bonnes, et il faut savoir que les pointers changes très souvent après chaque mises à jour
 
Inscrit
12 Juin 2017
Messages
11
Reactions
10
#13
Yo, je suis curieux de l'avancée du projet. J'avais moi même essayé de faire la même chose lorsque j'essayais de récupérer le nom (sans sniffer le réseau) du personnage connecté dans la version 32 bits de Dofus (où le nom n'est pas affiché en haut de la fenêtre à cause des limitations flash)
 
Haut Bas