Bonjour à tous ! Avant toute chose, merci à Cadernis.fr pour son existence, il m'a beaucoup aidé à trouver des réponses à mes questions et à penser l'approche d'un projet Bot sous D2fus. Cela dit, concernant le MITM, parfois les sujets datent et après 2 semaines, je cède et je demande de l'aide à la communauté.
Mon objectif: Créer un "simple" (rien ne l'est) bot de combat, qui puisse lancé un combat en Kolizeum, spammer le même sort, avec un IA fuyarde. Un fois le combat gagner ou perdu, relancer la même opération. Mon bot est construit en C#
NOTE IMPORTANTE: Je ne suis pas développeur, simplement webdesigner (aïe ça m'aide très peu), j'ai fait tout un travail de recherche en amont pour comprendre les concepts. Même si tout n'est pas encore super clairs, je pense avoir trouvé une méthodologie.
#1 - trouver l'adresse IP du serveur Dofus, ainsi que son proxy.
J'ai utilisé Wireshark. J'arrive à capturer des paquets en ciblant le port --5555 ce qui m'a permis de trouver l'IP : 172.65.220.96. J'ai également fais la même chose pour trouver l'IP du Launcher : 162.159.133.234. J'ai lu ici qu'il n'était pas le même. Pour l'instant je ne sais pas comment l'exploiter mais j'en aurai besoin.
#2 - Installer l'environnement
Dans mon cas, j'utiliserai PacketDotNet et SharpPcap pour sniffer les paquets.
#3 - Démarrer le proxy MITM
Ici, mon code semble fonctionner, la console me renvoie bien "Proxy MITM en attente de connexions..."
#4 - Etablir la connexion avec le client D2fus.
Dans le code comme vous le voyez, je pensais que j'avais juste à exécuter mon script, le client D2fus par la suite (que fait-on du Launcher ?) et la console allait me renvoyer les paquets brut en hexadecimal comme le fait Whireshark. Or, rien ne semble se connecter.
Pour la suite des étapes je sais que je n'ai pour le moment implémenter aucune logique. J'ai bien décompiler le code source du jeu et j'ai lu a la lettre le Protocole ici dans ce forum. Je ne pense pas le maîtriser mais j'ai réalisé quelques exercices de conversion pour m'entrainer (ex: hexa vers binaire, identification du Hi-Header, Lenght etc), je pense pouvoir réussir par la suite. Cela dit, mon 1ER OBJECTIF, reste de sniffer les paquets bruts, établir la connexion et que ma console me renvoie enfin quelque chose de croustillant qui me redonnerait espoir !
Mes questions:
- Est-ce que mon code tient un peu la route et c'est carrément à côté de la plaque ?
- Est-ce que je suis bloqué (connexion au proxy MITM par le client) parce que précisément aucune logique n'est implémenter ?
- Ou bien parce que je ne tiens pas compte de l'Ankama Launcher ?
- Enfin, en décompilant le code source, j'ai failli avoir une demi-molle façon Mr Robot, c'était de courte durée quand j'ai vu tous les dossier et fichiers .AS. Je ne sais pas vraiment sur lesquels me concentrer pour réaliser mon objectif.
Bref, un grand merci à vous pour vos futures réponses. Et d'ailleurs, s'ils y en a, je propose d'épingler cette discussion et d'en faire un vrai Carnet de bord pour aider celles et ceux dans la détresse de la programmation.
Voici donc mon code (largement commenté pour suivre ma méthodologie)
using System;
using System.Net;
using System.Net.Sockets;
using PacketDotNet;
using SharpPcap;
public partial class Program
{
public static void Main(string[] args)
{
Bot bot = new Bot();
bot.Start();
}
}
public class Bot
{
private const string DofusServerIP = "172.65.220.96";
private const int DofusServerPort = 5555;
private const int ProxyPort = 5555;
private TcpListener listener = new TcpListener(IPAddress.Any, ProxyPort);
private TcpClient client = new TcpClient();
public void Start()
{
// Démarrer le proxy MITM
listener = new TcpListener(IPAddress.Any, ProxyPort);
listener.Start();
Console.WriteLine("Proxy MITM en attente de connexions...");
// Accepter une connexion du client Dofus
client = listener.AcceptTcpClient();
Console.WriteLine("Connexion établie avec le client Dofus.");
// Démarrer la boucle principale pour intercepter et manipuler les paquets
while (true)
{
// Lire les données du client Dofus
byte[] buffer = new byte[4096];
int bytesRead = client.GetStream().Read(buffer, 0, buffer.Length);
if (bytesRead == 0)
break;
// Traiter et manipuler les données du paquet
byte[] processedData = ProcessPacket(buffer, bytesRead);
// Envoyer les données traitées au serveur Dofus
SendToDofusServer(processedData);
}
// Fermer la connexion avec le client Dofus et arrêter le proxy MITM
client.Close();
listener.Stop();
}
private byte[] ProcessPacket(byte[] data, int length)
{
// Implémenter ici la logique pour analyser et manipuler les paquets Dofus
// en fonction des besoins du bot. Cela peut inclure la modification
// des données, l'envoi de commandes personnalisées, la lecture des informations
// du jeu, etc.
// Exemple : renvoyer les données telles quel sans les modifier
return data;
}
private void SendToDofusServer(byte[] data)
{
using (TcpClient server = new TcpClient(DofusServerIP, DofusServerPort))
{
server.GetStream().Write(data, 0, data.Length);
}
}
}