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.