[Help] Connection Client Dofus

  • Auteur de la discussion Anonymous
  • Date de début
A

Anonymous

Invité
#1
Bonjour à tous!

Ceci est mon premier post sur le forum et j'espère que vous allez être bien gentil avec moi. J'ai vu des réponses sur d'autres posts... oulala...

Je vais commencer par présenter mon background de programmeur (j'exclus beaucoup de choses, cela sert simplement pour la suite) :
Avancé - Java, Python
Débutant - .NET, AS3

Mon but : Créer un bot de Dofus
Raison : Expérience que je peux y gagner
Langage : C++

Bon, vous pouvez déjà le voir, je suis assez casse-cou. Oui, j'ai décider de créer mon premier bot de Dofus en C++, qui est un nouveau langage pour moi. Attention avant de me traiter de fou, j'ai quand même suivi les tutoriels de OpenClassrooms. Je le fais simplement en C++ car c'est un langage que je veux très bien maîtriser (oui oui, je veux VRAIMENT gagner de l'expérience en faisant ce bot). J'ai déjà programmer beaucoup d'applications, des serveurs, des scripts, etc. Par contre, c'est mon premier bot.

Bon, j'ai lu beaucoup d'autres posts sur le forum, notamment le protocole D2 et comment s'en servir. J'ai aussi essayer d'analyser le code source du bot BlueSheep (https://github.com/Sadikk/BlueSheep), mais bon, analyser un code sans le connaître, c'est extrêmement difficile : j'ai donc échoué. Bon... J'ai pas trouvé nul part quelqu'un qui a refait la conversation du client/serveur, j'ai donc analyser moi-même les paquets. Mais alors des choses horribles se sont passés... Oui mes amis, des choses très bizarres et imprévues.

Pour mon analyse, j'ai utiliser le code source de dofus 2.26 (https://github.com/Emudofus/Dofus) et WireShark (https://www.wireshark.org/).

Bon, je vais vous expliquer ce que je veux dire par des choses horribles. Tout d'abord, voici la liste des "Messages" de dofus en ordre que je vois lors de ma connexion :

id = protocolId
lt = lengthType
lg = length

1. ProtocolRequired (id=1, lt=1, lg=8) --> Receive
2. AuthenticationTicketMessage (id=110, lt=1, lg=38) --> Send
3. BasicAckMessage (id=6362, lt=1, lg=2) --> Receive
4. RawDataMessage (id=6253, lt=3, lg=88017) --> Receive
5. CheckIntegrityMessage (id=6372, lt=2, lg=258) --> Send
6. BasicAckMessage (id=6362, lt=1, lg=3) --> Receive
7. AuthenticationTicketAcceptedMessage (id=111, lt=0) --> Receive
8. CharacterListRequestMessage (id=150, lt=0) --> Send
9. BasicAckMessage (id=6362, lt=1, lg=3) --> Receive
10. QueueStatusMessage (id=6100, lt=1, lg=4) --> Receive

Ok ... Je sais que c'est seulement une question par post, mais elles se rapportent tous a la connection. Maintenant, voici mes questions :

1. Je comprends le principe du bot socket, qui imite le client, mais j'ai aucune idée qu'est-ce qu'un bot MITM peut bien venir faire de plus... Est-ce seulement pour pouvoir voir le client (du jeu) en même temps? Si oui, si on fait un "émulateur de position et de map" avec un bot socket, est-ce que ça revient au même?
2. Parfois, le serveur envoie plus d'informations qu'il dit envoyer explicitement... Par exemple, dans le premier (ProtocolRequired), il dit avoir 8 bytes de taille, ce qui correspond effectivement aux deux paramètres requiredVersion et currentVersion. Par contre, il reste 2 autres bytes qui trainent derrières... Pourquoi !? Meh.. un nouveau truc qui est dans la 2.29 mais pas dans la 2.26 ? La même chose arrive à 7 et 10.
3. Bon, excluant le handshake TCP du début, le client/serveur envoie des paquets vide a peu près à tous les 2-3 échanges... Est-ce seulement pour dire : Hey, je suis encore vivant, continue à envoyer ? Que signifie ces paquets vides.
4. Si on suit le schéma, le serveur envoie toujours un BasicAwkMessage avant d'envoyer ses trucs bizarres. Qu'est-ce que ça signifie? En plus, la taille varie entre chaques.
5. Un ticket doit être envoyé à l'étape 2... on le trouve où ce truc... La langue je peux comprendre que c'est FR, mais le ticket, qui change à chaque fois, c'est quoi?
6. Les messages 7 et 8 ont tous les deux un lt de 0. J'imagine que c'est normal vu que c'est juste un OK et une requête. Par contre, il y a énormément plus de bytes qui sont envoyés dans le TicketAccepted? (question 2).
7. Hem... Parfois lors de la réception du RawData, celui-ci est compressé.. Et d'autres fois non? Ils sont gelés les créateur de Dofus? C'est quoi la logique de réception du RawData et ça sert a quoi ce gros RawData.
8. En gros, il se passe quoi la-dedans!?
En gros, j'aimerais avoir de l'aide sur comment se passe les échanges. Si quelqu'un qui s'y connait plus serait assez gentil pour m'aider dans ces échanges bizarres ce serait vraiment super... Je suis disponible sur TeamSpeak, Skype et sur le forum. Évidemment, si on parle sur TS ou Skype, les réponses seront consignés ici.

Voici un résumé des questions :

1. Bot socket vs MITM?
2. Plus d'informations? (2.26 vs 2.29) ?
3. Paquets TCP vides?
4. BasicAwkMessage?
5. Ticket?
6. Pas de taille de message?
7. RawData
8. Explanation PLZ?

PS: Désolé si vous trouvez mon formattage bizarre, je teste des trucs haha.
 
Inscrit
19 Aout 2014
Messages
16
Reactions
0
#2
Bonjour !

1. Le mitm est le full socket diffèrent surtout par leur mode de fonctionnement.
Dans le socket, tu ouvres ta socket et tu communiques avec le serveur. Simple, rapide, MAIS tu dois tout gérer toi-même.
Dans le mitm tu ouvres un serveur en localhost (port 5555) et tu fais connecter le client de jeu (officiel) dessus. En parallèle, t'ouvres une socket avec le serveur dof. Et ensuite tu fais la passerelle. Ce qui t'es envoyé par le serveur sur la socket 2, tu l'envoies au client offi par ta socket 1, et ce que le client envoie sur ta socket 1, tu l'envoies au serveur sur ta socket 2. Bien sur t'es au milieu donc tu peux altérer les packets avant de les transférer, et pour faire des actions tu fais comme sur le fullsocket à partir de ta socket 2. (En gros)

2. Les messages changent entre les mises à jour, regarde plutot les sources de la 2.29 plutot que celles de la 2.26...
4. BasicAck*-> acknowledgment.
5. regardes le packet 42 :)
7. Il s'pass dé truks pa bo du tt :( Le raw data message contient en fait un swf qui est ensuite executé par le client. Celui-ci est obfusqué. Ce qu'il y a à l'intérieur sert à contrer les bots. Bref, ce sera ton premier "gros" morceau :roll:
 
Inscrit
1 Mars 2014
Messages
120
Reactions
0
#3
3. Les paquets TCP vides sont propres au protocole TCP/IP n'y prête pas attention

Le tutoriel c++ du sdz est à chié ^^ lis celui de gbdivers

PS: tu utilise un framework cpp ou juste la stl ?
 

Sorrow

Membre Actif
Inscrit
5 Mai 2012
Messages
376
Reactions
26
#4
2 - Il peut d'agir de paquet vide tout simplement, s'il y à seulement 2 octets c'est que le message na pas de données, donc pas de taille, seulement le header.

3 - S'agit t'il d'un packet Dofus ? Si tu regarde avec wireshark, fait gaffe a te concentrer uniquement sur le champ "Data", le mieux est de faire clic droit "Follow TCP Stream" sur l'un des paquet pour avoir une meilleur vision de ce que tu envoi et reçois.

4 - Le serveur demande au client s'il est toujours là, s'il a bien traiter les données.

5 - Le ticket, codé sur 32 octets permet de t'identifier lors de passage vers un serveur de jeu (auth -> world), ce n'est pas une simple chaîne de caractère mais du binaire (a vérifié)

7 - Sécurité anti-bot, c'est là que le MITM devient plus facile que les bot full socket. Un RawDataMessage (RDM) est un fichier flash (CWS) avec une signature (AKSF) devant pour vérifié sa provenance. Ce SWF sera exécuter par le client et effectueras certaines opération pour déterminé si tu est un bot ou non. Si la réponse renvoyer au serveur est invalide -> kick. Le bot full socket doit trouver une parade à cela, je te laisse chercher.

6 - Voir 2, pour AuthenticationTicketAcceptedMessage, le message ne contient pas de données, donc ce que tu reçois après est potentiellement un autre message.
https://github.com/Emudofus/Dofus/blob/ ... Message.as

8 - Récupère le SWF (débutant par le magic header "CWS"), puis ouvre le avec JPEXS ou AS3 Sorcerer, bonne courage pour remettre au claire à la main, c'est assez bien obfusqué.
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#5
Les tutos de developpez.com sont toujours très bien sinon. Et en plus ils sont finis ;)
 
A

Anonymous

Invité
#6
Wééé ! Je m'attendais pas à autant de réponse mais ça fait plaisir :)

Pour les tutos de C++ j'irai probablement regarder ceux que vous m'avez conseillé Labo et DeepSiderZ pour être sur de bien le maîtriser! Et oui je comptais utiliser la stl seule, mais si je me rends compte que c'est beaucoup trop, je vais peut-être utiliser une librarie... Qt? Haha aucune idée.

Donc je suis aller me chercher JPEXS pour avoir les sources de la 2.29, cela va problablement être plus précis pour analyser les paquets.

Ensuite, Sadikk (wouah le créateur de BlueSheep x)) et Sorrow, ça veut dire que le bot MITM "évite" ce problème car il ne fait que le refiler au client? Je vais quand même tenter d'analyser ce dernier pour voir ce que je peux faire pour le contrer.

Je suis tanant avec mes questions mais ça m'amène d'autres questions tout ça (avec des lettres pour faire changement) :

A. Que conseillez-vous, socket ou MITM ?
B. Est-ce qu'il faut parfois interragir avec le content de Dofus? Par exemple, si on reprend le cas du Ticket sur 32 octets, est-ce qu'il faut que j'aille le générer en passant par Dofus ou je dois le faire moi-même? (J'ai l'impression que la réponse aura rapport encore une fois avec le socket vs. MITM).
C. D'ailleurs, Saddik, si je ne vois pas le paquet 42 (SelectedServerDataMessage), est-ce parce que mon client va directement au choix de personnages?
D. Connaissez-vous un chemin un peu plus rapide haha... Je veux même pas faire les calculs mais je suis très loin de pouvoir seulement me connecter...

Et merci encore pour toutes vos réponses :D
 
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#7
Pour la question C : il me semble d'apres ce qu'on m'a dit qu'il y a 2 paquets, et le selectedServerDataMessage est celui qui propose le choix du serveur tandis que son "enfant" SelectedServerDataExtendedMessage est celui que tu utilises qui se co direct au personnage
Pour la question A (je fais dans le désordre) : Pour débuter un bot il est préférable de débuter par le MITM, surtout pour les sécurités.Voilà, je ne vais pas trop en dire car je suis qu'un débutant comme toi.
 
Inscrit
15 Mai 2015
Messages
41
Reactions
0
#8
Salut,
pour le cas du ticket de 32 octets tu ne le génères pas. Le serveur te l'envoi mais crypté. Tu peux très bien gérer cette partie toi même ou utiliser Dofus.
 
Haut Bas