1.29 MITM sur dofus retro

Inscrit
18 Avril 2020
Messages
2
Reactions
0
#1
Bonjour à tous,

Je me présente rapidement, je suis un joueur de dofus Retro ayant repris le jeu après plusieurs années d'arrêt (Avant l'arrivée de dofus 2)
J'ai quelques connaissances en programmation, mais surtout à base d’autodidacte sur du code existant.
J'ai découvert ce forum par hasard et je vous avoue que je suis impressionné par la mine d'informations disponible et les compétences de certains des membres.

J'ai développé un petit programme d'aide au jeu en python3 qui permet de switch de compte par raccourci clavier, de reproduire un clic sur toutes les fenêtres de jeu ou encore de connecter automatiquement plusieurs comptes.
Ce programme se base principalement sur la librairie win32 pour contrôler les fenêtres Windows et le contrôle de la souris/clavier.
J'ai récemment à partir de vos explications sur le forum réussi à y ajouter un sniffer de paquet pour décoder différentes trames pour fluidifier les actions de mon programme.

Je vous écris aujourd'hui car je souhaite aller plus loin et réaliser une vrai interaction entre le jeu et mon programme via un MITM, en commençant tout d'abord par intercepter les paquets et réaliser une vraie connexion automatique (Aujourd'hui à base de tabulation pour choisir le perso...)
Je vous avoue avoir beaucoup chercher sur le forum et avoir essayé différentes approches mais je me perds dans les informations. Beaucoup de post traite de D2 et j'ai cru comprendre que son protocole est différent. De plus, il y a une grande variété de langages mais relativement moins sur du python.
Je m’excuse si les informations que je demande auraient déjà été expliquées sur un autre post.

Après beaucoup de blabla, voici ou je suis bloqué : Je ne comprends pas ou placer le MITM.

D'après Wireshark, la trame complète d'ouverture du jeu (sans launcher) jusqu'à la connexion est la suivante :
- Requete UDP à dofusretro.cdn.ankama.com puis SYN / SYN, ACK / ACK sur l'ip 13.225.31.113:54030
- Requete TCP GET /lang/version
- Requete TCP GET /dynamic/game_actions
- Requete UDP à gamedata.ankama-games.com: 104.17.71.89:54031
- Requete TCP GET /dofus/login/xml/fr_alert.xml
- Requete TCP GET /dofus/dynamic/rss/rss.game.fr.xml
- Requete UDP à www.ankama-games.com: 104.17.71.89:54033
- Requete TCP GET / HTTP/1.1 (2 fois ?)
- Requete UDP à www.ankama.com: 104.18.149.107:54035
- Client Hello + Server Hello puis un échange de clé
- Requete UDP à account.ankama.com
- Client Hello + Server Hello puis un échange de clé
- Requete UDP à dofus-co-retro-.................-amazonaws.com

Ensuite, je retrouve les échanges de paquets sur le port 5555 comme expliqué sur le Diagramme_des_packets_Dofus (HC, Af, Af, Ad, Ac0 etc....)

J'ai donc dans un premier temps cherché à reproduire les requêtes avec Scapy. J'ai fais les premiers UDP, SYN, ACK mais je suis tombé sur un post expliquant que le MITM permettait d’éviter toute cette connexion car il est sensé laisser le client le faire. Je ne souhaite pas non plus un bot full socket sans la fenêtre de jeu.

Concernant le MITM, j'ai compris qu'il y a deux façon de le mettre en place :
Soit via le fichier config.xml en ajoutant la ligne <connserver name="prox" ip="127.0.0.1" port="8080" />
Soit via un logiciel comme Frida qui modifie le connect()

j'avais d'abord commencé par Frida à l'aide des exemples de LaBot en python qui propose un script.js sur son Github (Très instructif au passage un grand merci à toi) mais le résultat ne m'avais pas l'air concluant. Je pense que ce script ne s'applique qu'à D2 et je ne comprends pas grand chose au JS pour le modifier, ou alors je l'ai mal utilisé. De plus, avec quelques essais du module Frida, j'ai l'impression que connect() est appelé deux fois (Au lancement du jeu + à la connexion du compte) et du coup je ne sais pas comment gérer cela.

Deuxième option, le fichier config.xml (Bien que je trouve cela moins propre de modifier un fichier du jeu). J'ai tenté de mettre en place une passerelle entre le client et le serveur à l'aide du script suivant : https://gist.github.com/WangYihang/e7d36b744557e4673d2157499f6c6b5e
D'après les logs, la connexion réussie mais cependant rien ne se passe :
py port-forwarding.py 127.0.0.1 8080 13.225.31.113 80
[+] Server started [127.0.0.1:8080]
[+] Connect to [127.0.0.1:8080] to get the content of [13.225.31.113:80]
[+] Detect connection from [127.0.0.1:54692]
[+] Trying to connect the REMOTE server [13.225.31.113:80]
[+] Tunnel connected! Tranfering data...
[-] No data received! Breaking...
[+] Closing connecions! [127.0.0.1:8080]

En regardant sous Wireshark, je retrouve la trame SYN, SYN/ACK, ACK des deux cotés du tunnel mais le client n'envoie pas la suite (Requete TCP GET /lang/version) et rien ne se passe sur le jeu.

Si quelqu'un pourrait me dire si je vais dans la bonne direction et aurait une idée d'ou je bloque ?

En vous remerciant par avance.
Un simple joueur bricoleur.
 
Dernière édition:
Inscrit
22 Juillet 2018
Messages
81
Reactions
12
#2
Salut,

Tout ce qui est UDP, oublie - c'est à proprement parler du DNS, osef. Idem tout ce qui est HTTP/TCP (GET etc.)

On peut en effet hook avec Frida (ou consort), mais Frida c'est cool si t'as une base en python (même si le script de détournement est en JS)

Ton MITM se place au moment du connect() : tu crées une passerelle, qui trace (comme le ferait wireshark) les paquets entre le client (toi) et le serveur (chez ankama), ca peut se faire facilement directement dans frida (API Socket) ou dans Python (idem API socket, Python3 propose tout ce qu'il faut)

Je devais faire une appli pour consumer Dofus depuis n'importe où, j'avoue que c'était très orienté D2 et que je n'ai pas commencé. Est-ce que ca intéresserait pour D1? Ca ne sera que de la lecture, l'écriture restera à la charge de l'utilisateur.

PS: Modifier un fichier, c'est s'exposer à des vérifications faciles à faire par Ankama et qui pourront conduire à un bannissement
 
Inscrit
18 Avril 2020
Messages
2
Reactions
0
#3
Salut,

Je te remercie pour ton retour.
Du coup comme conseillé j'ai repris la piste de Frida plutôt que le fichier config.

Je suis parvenu à réaliser le hook mais pour le moment je n'arrive pas à basculer du serveur de connexion au serveur de jeu. Je vais continuer mes recherches.

Qu'entends tu par consumer Dofus ?

A+
 
Inscrit
18 Novembre 2020
Messages
1
Reactions
0
#4
Hello Eldeiss,

Pourrais tu stp me dire ce que tu as modifié dans le script de LaBot pour qu'il fonctionne avec dofus retro ? Il semble fonctionner comme il faut avec D2 mais impossible d'intercepter la fonction connect avec retro. J'ai un null & NOT SANDBOXED :

Code:
PS C:\Users\<user>\Fridajs\frida> node .\app.js
PID : 11348

(electron) The default value of app.allowRendererProcessReuse is deprecated, it is currently "false".  It will change to be "true" in Electron 9.  For more information please check https://github.com/electron/electron/issues/18397
null

NOT SANDBOXED
 
Haut Bas