[PYTHON] Probleme lors de la reception

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#1
Bonjour&Bonsoir,

En ce moment je commence gentillement la progrmmation d'un bot D2 en python en effectuant quelques tests.
mon problème est que j'ai un thread avec une boucle infinie qui est en écoute sur un serveur du jeu et qui stock tout ca dans un buffer.
Or, je suis moi même connécté en jeu et lorsque je simule des actions (deplacement de cellule, msg privé) de sorte a générer des paquets, je ne vois rien qui passe dans mon script python alors que sous wireshark je vois bien une communication entre moi et l'ip du serveur D2. Voici donc mon code:
Code:
import sys
import socket
import threading
import struct

class listenningThread(threading.Thread):   #Je définit mon thread d'ecoute
    def __init__(self, socket):
        threading.Thread.__init__(self)
        self.socket = socket
        self.receiveBuffer = bytearray()      #buffer 
        self.finalBuffer = bytearray()
        self.bufferSize = 0

    def run(self):
        while 1:    #Boucle infinie 
            self.receiveBuffer = bytearray(100)
            self.bufferSize = 0
            self.bufferSize = self.socket.recv_into(self.receiveBuffer)     #On écoute 
            if self.bufferSize:
                print "Packets received... %i bytes" % (self.bufferSize)
                
            self.finalBuffer = bytearray(self.bufferSize)    #On définit la taille du buffer en fonction du nombre d'octets recu
            self.finalBuffer[:] = self.receiveBuffer   #On copie receiveBuffer dans finalBuffer

            for i in range (0, self.bufferSize):    #On affiche ce qui a été recu
                print (self.finalBuffer[i]),

            if (self.bufferSize==0):
                print "No packets received"
                
#Lancement du programme  
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    

try:
    socket.connect(('213.248.126.89', 5555))   #Connection au serveur
except socket.error:
    print "Could not reach D2 servers"
    sys.exit()

print "Connection established"
listen = listenningThread(socket)
listen.start()     #On lance le thread

Merci d'avance pour toutes vos réponses
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#2
Bonsoir,

j'ai un peu de mal à comprendre votre problème. Si j'ai bien compris, vous êtes connectés en jeu (c'est à dire authentifié, personnage et serveur sélectionné, map chargé), votre bot envoi des paquets et en reçois mais l'échange entre le bot et le serveur ne s'affiche or sur wireshark les échanges s'affichent. C'est bien cela ?
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#3
Salut,

oui c'est presque ca sauf que je n'envoie aucun paquets via mon bot je génère des paquets en effectuant des actions IG
et j'espère pouvoir les choper avec mon thread sauf que il ne capte rien

PS: je pense que on peut se tutoyer ?
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#4
Bonsoir,

oui pas de problème, en fait tu veux faire un MITM ?
Si c'est le cas, cela ne fonctionne pas du tout comme cela.
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#5
Chaque connexion socket est unique. Quand tu te connectes au serveur avec ton client D. et ton programme Python, ce sont 2 sockets différents. Normal que tu ne reçoives rien sur ton socket créé par ton programme Python ^^.
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#6

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#7
Un mitm, c'est un programme qui redirige le client dofus en local et se charge de réceptionner et envoyer des paquets.
D0fus <-> MITM <-> Serveur

Or toi tu ne peux pas en créant un socket récupérer le socket de dofus.
Il faut faire un mitm. Sinon tu dois gérer toute la connexion sans dofus.
 

Shornaal

Membre Actif
Inscrit
17 Février 2011
Messages
194
Reactions
0
#8
MITM désigne un type d'attaque dans le domaine du hacking, à savoir l'attaque de l'homme du milieu (Man in the middle) qui intercepte la communication entre deux parties soit en l’occurrence les serveurs d'Ankama et le client Dofus. Pour cela il faut bien une socket en écoute qui attends la connexion du client et instancie ensuite une nouvelle connexion vers les serveurs d'authentification. C'est une approche très intéressante cependant pour l'utiliser tu dois donc rediriger la connexion de ton client. Si tu tentes de changer l'adresse de connexion dans app/config.xml, il en résultera une belle erreur à cause d'une sécurité mise en place par Ankama. Il faut donc que tu utilises un injecteur de DLL pour injecter la No.Ankama.DLL de Sorrow téléchargeable sur Cadernis.

L'autre solution consiste à faire ton bot en connexion direct (souvent qualifié d'approche full socket) et dans ce cas, ton approche semble bonne mais ce n'est pas ton client qui va générer les packets. C'est bel est bien le serveur qui va t'envoyer les message dans un ordre pré-défini, en tout cas lors de la connexion. Quand tu sniffes avec Wireshark tu devrais enregistrer tes captures et développer un logiciel permettant de les convertir pour pouvoir les lire. C'est à dire récupérer les ID et en déduire le nom des messages qui ont été échangés.
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#9
Salut,
Merci pour vos réponses. D'aprèsvos description du MITM, je pense plutot m'orienter vers un bot
full socket. En revanche comme tu dis Shornaal:
C'est bel est bien le serveur qui va t'envoyer les message dans un ordre pré-défini, en tout cas lors de la connexion. Quand tu sniffes avec Wireshark tu devrais enregistrer tes captures et développer un logiciel permettant de les convertir pour pouvoir les lire. C'est à dire récupérer les ID et en déduire le nom des messages qui ont été échangés.
donc pourquoi alors quand je génère des paquets en effectuant des actions IG je ne capte juste que un
paquet lors de l'etablissement de la connexion puis plus rien après alors que sous wireshark je me fait bombarder de
paquets?...

Merci d'avance pour vos réponses
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#10
gohu a dit:
donc pourquoi alors quand je génère des paquets en effectuant des actions IG je ne capte juste que un
paquet lors de l'etablissement de la connexion puis plus rien après alors que sous wireshark je me fait bombarder de
paquets?...
Parce qu'il attend que tu lui répondes.
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#11
Ok ok donc mon truc marche alors?
Génial
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#12
Ça affiche quoi dans l'interpréteur ?
Logiquement tu reçois le paquet 1 et 3 et il attend que tu lui envoies le paquet 4.
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#13
Voila ce que je vois dans l'interpréteur. Ensuite ya "No packet received" qui boucle car je
ne recois plus rien sauf ce paquet là.
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#14
Tu as un problème dans ton code car tu dois recevoir un second paquet contenant la clé publique.
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#15
Mais c'est bien le paquet 1 qui est affiché ?

EDIT: Petite faut de frappe sur l'ip du serveur '213.248.126.89' au lieu de '213.248.126.39'
j'ai donc maintenant ceci:
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#16
C'est mieux ;)
Mais ton second paquet est découpé en morceaux de 100 bytes, augmente la taille de ton buffer. ToOnS m'a dit que le plus gros paquet ferait 8192 bytes (2^13).
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#17
Et voila le rendu:
dernière petite question, les paquets je vais envoyer doivent etre parser en binaire ou en hexa ou en decimal sous forme d'octets (comme ce que je print dans l'interpreteur python)?

Bien le merci!
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#18
Ça ne change rien. Binaire, décimal et hexadécimal ne sont que des écritures. Ce qui compte, c'est le codage. Par exemple, si tu veux envoyer un paquet, il devra être sous la forme d'un tableau de bytes. Et pour former un tableau de bytes, on utilise un tableau de caractères car un caractère est codé sur un byte. Si on utilise un tableau d'entier, ça ne peut pas marcher car un entier est codé sur 4 bytes.
 

Gohu

Membre Actif
Inscrit
16 Novembre 2013
Messages
222
Reactions
2
#19
Pourquoi ne pas utiliser un tableau de bytes directement comme je le fais avec mon script python ?
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#20
Oui bien sûr, je ne connais que les bases du Python, je ne savais pas qu'il existait un objet bytearray. Mais en C, vu qu'il n'existe pas, on utilise un tableau de char.
 
Haut Bas