Skip to main content
  1. Projects/
  2. Reverse-Engineering de Dofus 2/

Dofus RE - Introduction

6 mins· 0 · 0 ·
dev Projects Reverse-Engineering
Table of Contents
Qu’est-ce que Dofus>

Qu’est-ce que Dofus #

Dofus est un MMORPG sorti en 2004 et écrit en Flash, qui était un langage très populaire à cette époque, surtout pour des jeux comme Dofus qui est un jeu en 2D isométrique ne nécessitant pas de moteur graphique poussé. Malheureusement encore aujourd’hui en 2023, Dofus est écrit en Flash (bien qu’une réécriture en passant par le moteur Unity (Dofus 3) est en cours pour améliorer grandement les performances et possibilités du jeu).

Communication client-serveur>

Communication client-serveur #

La communication entre le client et le serveur de Dofus est une simple connexion TCP. Les communications sont dans la majorité des cas non chiffrés bien que certaines trames peuvent l’être dans des cas particuliers (cas particulier dont nous reparleront plus tard) ce qui nous facilite la tâche de reverse et d’analyse dynamique.

L’IP du serveur dépend du serveur de jeu auquel nous somme connecté, un serveur distinct existe aussi pour la partie authentification et choix du serveur de jeu.

Le but ici sera donc de s’intercaler entre les serveurs et le client pour pouvoir lire et traiter toutes les requêtes passant entre les deux. Pour celà j’ai décidé de faire un programme go capturant le traffic sur l’interface réseau pour le reverse.

Protocole>

Protocole #

Pour comprendre le protocole utilisé entre le client et le serveur Dofus, on va commencer par se mettre entre les deux pour analyser les trames, ici je vais utiliser Wireshark dans un premier temps pour faciliter une première analyse rapide puis développer un programme en Go pour automatiser le traitement et le reverse des requêtes.

En regardant un peu dans Wireshark ou sur Google, on trouve que le port utilisé par Dofus pour les communications est le port TCP 5555.

Le fait de voir des données en clair dans les requêtes nous confirme donc la faisabilité du parsing des requêtes juste via du sniffing.

Analyse d’une première trame simple : Message dans le chat>

Analyse d’une première trame simple : Message dans le chat #

Une bonne manière de tester de comprendre le protocole est d’envoyer un message au serveur avec des données qu’on maitrise, de cette manière on va pouvoir tenter de comprendre les différents champs d’un message.

Le plus simple pour cela est le système de messagerie instantanée in-game, on maitrise une grande partie des données, le contenu du message, l’auteur (moi), la date, le channel, etc.

On voit ici par exemple deux des données les plus facilement identifiables :

  • Le nom de l’utilisateur : “Acnoh”
  • Le contenu du message : “achete dofus vulbis + ivoire + abyssal me mp !”.

Après un certains nombres de message j’ai pu découper la requête en plusieurs champs notables :

Les champs grisés sont des valeurs dont l’utilité ou la signification n’ont pas pu être trouvées juste à l’œil avec si peu de données de test, cependant on retrouve parfois des schémas répétitifs dans ces valeurs aussi, que ce soit des octets toujours a zéro, des valeurs incrémentales au fur et à mesure de chaque message, des valeurs avec une très forte entropie (potentiellement des checksum par exemple).

Bien que cette méthode puisse être efficace lorsque l’on a des données contrôlées, elle est peu efficace et demande beaucoup de temps et un peu d’expérience pour permettre d’identifier les données. De plus la fiabilité est approximative, car il reste généralement des données inconnues qui pourraient être d’intérêt.

Une méthode bien plus efficace est fiable est la rétro-ingénierie, c’est-à-dire analyser le code source ou le code machine du jeu pour en comprendre le fonctionnement réel sans supposition ni approximation.

Premier pas dans la rétro-ingénierie de Dofus>

Premier pas dans la rétro-ingénierie de Dofus #

Au début de cet article, j’ai donné l’information que le jeu est codé en utilisant Adobe Flash, ce qui veut dire que le langage utilisé est l’Adobe ActionScript 3.

ActionScript est un langage de programmation orienté objets utilisé pour gérer le côté interactif des programmes Flash, il était beaucoup utilisé dans le début des années 2000 pour des sites web et le développement de programmes. Il s’agit d’un langage compilé mais dont la décompilation est un processus connu et maitrisé.

Pour la rétro-ingénierie du jeu, le choix d’ActionScript est très avantageux, car nous n’auront pas à passer par du code machine, ou du moins beaucoup moins que pour la plupart des autres jeux (on y reviendra).

1. Récupération du code source du jeu>

1. Récupération du code source du jeu #

Pour la décompilation, nous allons utiliser JPEXS, un vieux décompilateur pour ActionScript mais malgré tout très efficace. On va pouvoir y charger le fichier DofusInvoker.swf qui se trouve a la racine du répertoire de Dofus.

Pour éviter de passer trop de temps sur l’interface de JPEXS qui est loin d’être ergonomique et que je ne maitrise personnellement pas, on peut extraire l’intégralité des fichiers dans un répertoire.

On a maintenant le code source de Dofus, décompilé, accessible depuis n’importe quel éditeur de code !

2. Identifications de la structure du code>

2. Identifications de la structure du code #

Pour débuter l’identification des briques que nous venons d’extraire on a la chance que la racine soit plutôt bien rangée, ici seuls les dossiers scripts et binaryData nous seront utiles, le reste étant des données graphiques.

Le dossier binaryData contient quelques fichiers compilés semblant comporter du Lua au vu du nom des fichiers.

On notera que LuaAlchemy est un portage du langage de programmation Lua pour ActionScript et que ce portage n’est plus maintenu depuis 12 ans. Rassurant non ? 🤡 Ne criez pas maintenant devant votre écran, attendez qu’on parle de la librairie utilisée pour le chiffrement.

Le dossier scripts quant à lui contient beaucoup plus de fichier et d’informations intéressantes.

Le premier et principal fichier est DofusClientMain.as, ça peut être une première piste pour débuter la rétro-ingénierie du jeu sans savoir vers où partir. Pour la partie réseau de Dofus, on peut partir vers le sous-dossier com/ankamagames/dofus/network/ dans lequel on aura tous les scripts liés à la partie réseau du jeu.

Fun Fact : Petite joie pour le reverse… Certains fichiers ont plus de 800 imports ce qui rend le suivi des dépendances horrible à réaliser en plus de rendre les fichiers illisibles. Mesure anti reverse ou mauvaise pratique de code, je vous laisse en juger.

La suite>

La suite #

Nous avons appris comment Dofus fonctionnait sur la partie réseau, décodé un premier évènement manuellement, décompilé le code source du jeu et localisés les fichiers les plus intéressant. On va pouvoir dans la prochaine partie commencer à vraiment parser le protocole réseau et développer un sniffer et parseur réseau.

Références>

Références #

Cadernis
JPEXS-Decompiler