Python InstanceID labot

Inscrit
19 Mai 2020
Messages
15
Reactions
2
#1
Bonjour, je dev un bot python avec fritm en me basant sur les exemples de labot.
J'ai un problème de calcul de l'instance id.
Voici mon raisonnement :
- L'instance id démarre a 0 (cf NetworkMessage.as)
- La variable d'instance id s'incrémente de 1 a chaque nouvelle instance de NetworkMessage.

Autrement dit l'instance id s'incrémente de 1 a chaque paquets reçu ou envoyé.

Voici mon code :
Python:
INSTANCE_ID = 0
def dumb_callback(soClient, soServer):
    """Forwards all the traffic between the two sockets
    """
    global INSTANCE_ID

    conns = [soClient, soServer]
    other = {soClient: soServer, soServer: soClient}
    active = True
    try:
        while active:
            rlist, wlist, xlist = select.select(conns, [], conns)
            if xlist or not rlist:
                break
            for r in rlist:
                data = r.recv(8192)
                packet_gestion(data)
                if not data:
                    active = False
                    break
                other[r].sendall(data)
                INSTANCE_ID += 1

               
    finally:
        for c in conns:
            c.close()
J'ai remarqué que mon instance id calculé (le mien) est toujours inférieur ou égal a la valeur du vrai instance id.
Sur les exemples de labot je n'ai pas trouvé la gestion de l'instance id d'ou ma demande sur le forum.

Merci pour votre lecture.
 
Inscrit
26 Janvier 2016
Messages
76
Reactions
13
#2
Il me semblait que tu avais eu ta réponse sur le discord , anyway : l'instance id ne s'incrémente qu'à l'envoi d'un NetworkMessage
 
Inscrit
19 Mai 2020
Messages
15
Reactions
2
#3
Il me semblait que tu avais eu ta réponse sur le discord , anyway : l'instance id ne s'incrémente qu'à l'envoi d'un NetworkMessage
Oui en effet mais pour pas surcharger le discord j'ai refais un post ici pour que d'autre gens est la réponse aussi.
Je note ce que tu viens de me dire mais la dans mon code j'incrémente a l'envoie et a la réception et c'est déjà inférieur a l'instance id que je suis dois avoir donc si je l'incrémente juste quand j'envoie des données au serveur je ne vais pas être bon non plus.
 
Inscrit
26 Janvier 2016
Messages
76
Reactions
13
#4
Dans ce cas si tu n'en as pas assez c est surement que tu comptes les paquets TCP et non pas les frames NetworkMessage
 
Inscrit
19 Mai 2020
Messages
15
Reactions
2
#5
Dans ce cas si tu n'en as pas assez c est surement que tu comptes les paquets TCP et non pas les frames NetworkMessage
Oui c'est le cas je compte les paquets tcp quel idiot ... Maintenant il va falloir essayé de dev un truc pour compter les paquets NetworkMessage quelqu'un la déjà fais ?
 
Inscrit
26 Janvier 2016
Messages
76
Reactions
13
#6
tout ceux qui font des bots/sniffer j'imagine ^^'
Il va falloir que tu arrives a séparer les frames dofus des paquets tcp pour la suite de ton mitm donc c est ta prochaine étape !
 
Inscrit
19 Mai 2020
Messages
15
Reactions
2
#7
tout ceux qui font des bots/sniffer j'imagine ^^'
Il va falloir que tu arrives a séparer les frames dofus des paquets tcp pour la suite de ton mitm donc c est ta prochaine étape !
Ok merci j'ai déjà commencer une class pour lire proprement les packets tcp et ainsi n'en louper aucun.
 
Inscrit
19 Mai 2020
Messages
15
Reactions
2
#8
Bon j'ai bossé sur le truc la voici avec quelque commentaire :
Python:
import sys  
sys.path.append("C:\\Users\\33781\\Desktop\\DofusBot\\bot") 
import binaryread as br

class Flux_Tcp_Client: #Flux TCP en direction du client
    
    #But de la classe : A chaque flux tcp reçu elle prend les données du premier paquets surtout la taille.
    #elle lit les bits jusqu'a temps qu'il n'y et plus de rapport avec le paquet sois a la fin du datalen.
    #Ensuite elle envoie les datas dans une instance de NetworkMessage puis redémarre a 0 avec la suite du flux tcp

    #datalen static
    #data static
    datalen = 0
    data = 0
    def __init__(self, data):
        packet = br.Data(data) #Pour lire les data qui sont arrivée

        if Flux_Tcp_Client.datalen == 0:
            NetworkMessage(Flux_Tcp_Client.data) #Notre packet est devenu un objet NetworkMessage propre
            Flux_Tcp_Client.data = 0 #On retire les datas de l'ancien paquets
            Flux_Tcp_Client.datalen = 0
            self.reading_data(packet) #On relance la lecture du packet header etc ..

        while Flux_Tcp_Client.datalen > 0 and len(packet) >= packet.pos + 1: #Si il reste des choses a lire ET si il reste des bytes au paquet que on lit
            Flux_Tcp_Client.data += packet.readByte()
            Flux_Tcp_Client.datalen -= 1



    def reading_data(self, packet):
        #Header : 2 bytes (id + lentype), 1-2-3 bytes (en fonction de lentype)
        (packetid, lentype) = br.header_info(packet)

        Flux_Tcp_Client.datalen = self.lendata(lentype, packet) + 2 + lentype #On ajoute le header avec les +
        packet.reset_pos()


        #Header : 2 bytes (id + lentype), 4 bytes (unsigned int = instanceid), 1-2-3 bytes (en fonction de lentype)
        # if self.cible == "server":
        #     (packetid, lentype) = br.header_info(packet)
            
        #     self.instance_id = packet.readUnsignedInt()
        #     self.datalen = self.lendata(lentype, packet)



    def lendata(self, lentype, packet):
        if lentype == 1:
            taille = packet.readByte()
        elif lentype == 2:
            taille = packet.readShort()
        elif lentype == 3:
            high = packet.readByte()
            low = packet.readShort()
            high = high << 16
            taille = high | low
        else:
            taille = 0

        return taille
            

class Flux_Tcp_Server:#Flux TCP en direction du Server
    #But de la classe : A chaque flux tcp reçu elle prend les données du premier paquets surtout la taille.
    #elle lit les bits jusqu'a temps qu'il n'y et plus de rapport avec le paquet sois a la fin du datalen.
    #Ensuite elle envoie les datas dans une instance de NetworkMessage puis redémarre a 0 avec la suite du flux tcp

    #datalen static
    #data static
    datalen = 0
    data = 0

    def __init__(self, data):
        packet = br.Data(data) #Pour lire les data qui sont arrivée

        if Flux_Tcp_Server.datalen == 0:
            NetworkMessage(Flux_Tcp_Server.data) #Notre packet est devenu un objet NetworkMessage propre
            Flux_Tcp_Server.data = 0 #On retire les datas de l'ancien paquets
            self.reading_data(packet) #On relance la lecture du packet header etc ..

        while Flux_Tcp_Server.datalen > 0 and len(packet) >= packet.pos + 1: #Si il reste des choses a lire ET si il reste des bytes au paquet que on lit
            Flux_Tcp_Server.data += packet.readByte()
            Flux_Tcp_Server.datalen -= 1

    def reading_data(self, packet):
        # Header : 2 bytes (id + lentype), 4 bytes (unsigned int = instanceid), 1-2-3 bytes (en fonction de lentype)
        (packetid, lentype) = br.header_info(packet)
            
        self.instance_id = packet.readUnsignedInt()
        Flux_Tcp_Server.datalen = self.lendata(lentype, packet) + 2 + 4 + lentype #id et lentype + instanceid + lendata
        packet.reset_pos()

    def lendata(self, lentype, packet):
        if lentype == 1:
            taille = packet.readByte()
        elif lentype == 2:
            taille = packet.readShort()
        elif lentype == 3:
            high = packet.readByte()
            low = packet.readShort()
            high = high << 16
            taille = high | low
        else:
            taille = 0

        return taille

class NetworkMessage:

    instance_id = 0
    def __init__(self, data): #Pour le moment on gère juste l'instance id

        NetworkMessage.instance_id += 1
Voici le lieu ou je l'appelle :
Python:
def dumb_callback(soClient, soServer):
    """Forwards all the traffic between the two sockets
    """

    conns = [soClient, soServer]
    other = {soClient: soServer, soServer: soClient}
    active = True
    try:
        while active:
            rlist, wlist, xlist = select.select(conns, [], conns)
            if xlist or not rlist:
                break
            for r in rlist:
                data = r.recv(8192)

                if other[r] == soServer: #Envoie des datas en fonction de qui l'envoie dans les classes spécifique au traitement de l'instance id
                    nm.Flux_Tcp_Server(data)
                elif other[r] == soClient:
                    nm.Flux_Tcp_Client(data)

                packet_gestion(data) #Gestion du packet en fonction de la data


                if not data:
                    active = False
                    break
                other[r].sendall(data) #On send les données a other[r]


                
    finally:
        for c in conns:
            c.close()
Bon sa fait beaucoup de code a lire pour vous la j'espère que le résumé va vous permettre de comprendre plus vite ;)

Voilà le problème que je rencontre :
Evidemment l'instance id n'est toujours pas bon et je remarque que mon instance id semble augmenté uniquement quand j'envoie des informations au server. L'instance id augmente réellement quand je n'envoie rien au serveur (aucune action avec la fenetre dofus quelque seconde et l'instance id a augmenter map solo juste des messages dans le tchat). Alors que l'instance id que je calcule n'a augmenté que quand j'ai envoyé un message dans le tchat ou un déplacement sur la carte etc ...

Si quelqu'un vois une petite erreur bien évidement je continu a cherche de mon côté et alimenterai le sujet si je fais une découverte.

Bonne soirée au plus motivé d'entre vous :)
 
Inscrit
26 Janvier 2016
Messages
76
Reactions
13
#9
Evidemment l'instance id n'est toujours pas bon et je remarque que mon instance id semble augmenté uniquement quand j'envoie des informations au server. L'instance id augmente réellement quand je n'envoie rien au serveur (aucune action avec la fenetre dofus quelque seconde et l'instance id a augmenter map solo juste des messages dans le tchat). Alors que l'instance id que je calcule n'a augmenté que quand j'ai envoyé un message dans le tchat ou un déplacement sur la carte etc ...

Hum refait cette partie en donnant un nom pour qu'on différencie ce que TU fais et ce que tu vois pacque là jai du mal à comprendre
 
Inscrit
19 Mai 2020
Messages
15
Reactions
2
#10
Oui pardon c'est mal expliqué.
Pour récupéré le réel instance_id j'envoie un message dans le tchat.
Quand je reçoit un paquet d'id 861 (envoie de message client->server) sur le proxy mitm (je sais pas si proxy est le bon terme)
J'affiche la valeur de mon instance_id (celui de MA class NetworkMessage)
Puis j'affiche le paquet envoyé au serveur et je trouve le réel instance id.

Cela ta t'il éclairé ? ;)
 
Inscrit
23 Février 2020
Messages
10
Reactions
2
#11
Il me semblait que tu avais eu ta réponse sur le discord , anyway : l'instance id ne s'incrémente qu'à l'envoi d'un NetworkMessage
tu es sur? l'instanceID est incremente pour chaque instance de NetworkMessage et donc : recu / envoi de packet.
 
Inscrit
23 Février 2020
Messages
10
Reactions
2
#13
Inscrit
26 Janvier 2016
Messages
76
Reactions
13
#14
merci cela me rassure :D

tu as regarder ce thread? : https://cadernis.fr/index.php?threads/comment-trouver-le-instanceid.2440/#post-25229

sinon pour ma part : le compte d'instanceId que fais mon mitm et que le client fais sont les memes au debut jusq'un moment ou ya un decalage, j'ai tjrs pas consacre du temps pour ce prob.
Ah bah on est pas les seuls ahah , vient sur le discord on investigue sur le soucis !
Ton mitm fonctionne avec ce décalage (pas de ban ?) ?
 
Haut Bas