Autoit Reception et identification des paquets D2

Inscrit
12 Octobre 2012
Messages
21
Reactions
0
#1
Bonjour a tous !

Je suis actuellement en train de developper un bot pixel en utilisant FastFind.dll ( un grand merci a FastFrench )

Pour eviter de gerer un trop grand nombre de pixels ( eviter les bugs ), je souhaite utiliser la reception des paquets envoyés par D2 via WinPcap. J'ai créé un fichier .ini contenant les id des classes que j'utiliserais ( pour le debut d'une recolte, la fin de la recolte, le debut d'un combat, le debut de mon tour, la fin de mon tour, etc )
Mon probleme est le suivant : Pour gerer certaines arrivees de paquets cela pose probleme car les id ne suffisent pas.

Exemples: - Inventaire plein : id 780 = Message d'information ( c'est cool mais il peut y en avoir de toutes sortes des messages d'info ) - Debut d'une recolte ( et fin ) : id xxx = InteractiveUseRequestMessage, InteractiveUsedEndedMessage ( pareil c'est bien mais mais il y en aussi de toute sorte des messages de cet id )

Conclusion : Il n'y a que pour certains id que cela fonctionne GameFightStartMessage, GameFightTurn***, LifePointRegenStarted, LifePointsRegenEnded, etc..

En gros je m'etais penché sur la creation d'un MITM en autoit et par manque de connaissances j'ai abandonné. Du coup, je vous demande de m'aider sur l'identification entiere d'un paquet et pas seulement son Id ( j'ai deja créé une fonction qui chope l'Id d'un paquet ), ainsi que sur sa traduction entiere ( meme via WPE, ce qui me permettra de comprendre le systeme et ainsi de creer des fonctions capables de les identifier entierement ) ou alors de me proposer des idées qui m'aideront a surmonter ce probleme

J'ai fait les recherches necessaires sur OG, CG, et cadernis, j'en ai seulement tiré l'identification de l'Id d'un paquet.

Merci d'avance , Cdlt, Zyko.
 
A

Anonymous

Invité
#2
Ne cherche pas a faire du socket en autoit, c'est du temps de perdu.
 
A

Anonymous

Invité
#3
Pour obtenir l'id d'un paquet faut déjà fait un parsing et en autoit bonne chance. L'autoit ne gere pas le multi thread.
 
Inscrit
12 Octobre 2012
Messages
21
Reactions
0
#4
Deja merci de ta reponse :)

Et ensuite j'utilise WinPcap pour la reception de paquets, ca fonctionne tres bien.
Pour obtenir l'id d'un paquet voila comment j'opere ( merci a maxilia pour son tuto via Wpe ) :
- Je recupere le paquet via winpcap
- Je garde seulement les quatres premiers caracteres hexadecimaux de celui ci
- Je converti tout ca en binaire
- Je garde le nombre binaire sauf les deux derniers chiffres ( la taille )
- Je reconverti le tout en decimal et j'ai mon id

Tout ca fonctionne tres bien. Et je ne cherche pas a faire de sockets en autoit ( j'ai lu des dizaines de posts la dessus et je sais que c'est un plan galere x) ) juste un bot pixel monocompte se servant des paquets entrant. La seule chose qui me manque c'est comment proceder pour lire un paquet entier ( de facon theorique ), l'id c'est bon mais le reste qu'est-ce que c'est? :/
 
A

Anonymous

Invité
#5
Ah bah bien joue alors, le reste que tu obtien tu dois le parser. Va voir la source de overedge en VB.NET, va falloir que tu traduise. Mais sa va etre hyperd dure en autoit. Apres tu traduit la classe et tu deserialize le paquet.

Bonne chance pour ton projet
 
Inscrit
12 Octobre 2012
Messages
21
Reactions
0
#6
Merci :)
Ouais j'ai deja vu tous ces termes vite fait, mais ca me parle pas tellement, enfin l'ideal aurait été qu'il y'ai une suite au tuto de Maxilia sur l'identification et la traduction des paquets avec Wpe Pro ou meme de facon theorique avec un exemple de paquet complet ( comme un mp : analyse du contenu du message, du destinataire ). Mais bon je suis pas sur que ca aie sa place ici. Si il n'y a pas d'autres solutions, j'etudierais le VB.net et le code de Overedge :)
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#7
Salut , on va voir avec le tout 1er paquet , qui correspond a la 2ieme image de ce post : -connexion-au-serveur-d2-en-socket.605/]https://cadernis.fr/index.php?threads/[c++]-connexion-au-serveur-d2-en-socket.605/ , donc tu arrives a trouver son ID (1) avec 00 05 = 1 01 en binaire , et la longueur de la taille (le - Je garde le nombre binaire sauf les deux derniers chiffres ( la taille )) , donc cette longueur de taille est de 01 , il faut donc lire encore 1 octet (2 caracteres) pour connaitre la taille complete du message , cet octet est 08 , donc la taille du message est de 8 octets (plus ce qu'on a lu avant soit 3 octets)



Maintenant si on recoit plusieurs messages dans le meme paquet on peu les separrer car on sait comment connaitre la taille de chacun des messages de chaque paquet.

on reprend notre 1er message (avec ses 8 octets) , on regarde dans les source du swf decompilé quel fichier contient ID=1 (doit avoir un tuto de maxilia , peu etre celui que tu as lu ou de 4RTY pour trouver le bon fichier)

Dans ce fichier il y a une fonction "deserialise" , si on regarde dedans on voit qu'il y'a 2 entiers a lire (un entier c'est 4 octets , ca tombe bien on a 2x4 octets = 8 octets)
la 1ere variable (le 1er entier a lire) aura la valeur des 4 1ers octets (dans l'image 00 00 05 A4 = 1444 mais ca a changé depuis ca a une autre valeur) , la seconde variable aura pour valeur les 4 derniers octets (dans l'image c'est aussi 00 00 05 A4 mais ca peu etre different , par contre au moins egale ou superieur a la 1ere variable)

pas oublier de lire le reste du paquet (c'est un autre message ou le debut d'un autre message) ici dans l'image de l'exemple 00 0E = 11 10 en binaire donc ID=3 et 2 octets de longueur de taille , donc une taille de 01 4A = 330 octets
 
Inscrit
12 Octobre 2012
Messages
21
Reactions
0
#8
Un grand Merci Toons, c'est exactement ce que j'attendais comme explication, donc maintenant je suis capable de lire l'id d'un paquet, lire sur combien d'octets est indiquée sa taille et ainsi lire sa taille. Et du coup je sais ou arreter la lecture de mon message. Du coup ce qui suit ( si quelque chose suit ) sera l'id+la taille repartis sur deux octets? Et ainsi de suite pour la lecture suivante? Si oui j'aurais compris :p

Neanmoins le message qui suit l'id et la taille je ne sais pas comment l'interpreter ni le traduire :/

Encore merci pour cette reponse extremement complete :) !
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#9
Zyko a dit:
Du coup ce qui suit ( si quelque chose suit ) sera l'id+la taille repartis sur deux octets? Et ainsi de suite pour la lecture suivante? Si oui j'aurais compris :p
oui c'est ca

pour interpreter "le corps" du message il faut commencer par trouver le fichier .as qui correspond a l'id , maxilia explique comment faire ici -identifier-les-packets.143/]viewtopic.php?f=41&t=330 dans le III°) Trouver le fichier .as correspondant

on va essayer avec encore le 1er paquet , on trouve le bon fichier .as : d'apres le tuto ca donne ProtocolRequired.as
on l'ouvre avec bloc note ou n'importe quoi , on chercher la fonction deserialize :
public function deserialize(param1:IDataInput) : void
{
this.deserializeAs_ProtocolRequired(param1);
return;
}// end function
elle renvoit a une autre fonction : deserializeAs_ProtocolRequired , bon ok on y va :
public function deserializeAs_ProtocolRequired(param1:IDataInput) : void
{
this.requiredVersion = param1.readInt();
if (this.requiredVersion < 0)
{
throw new Error("Forbidden value (" + this.requiredVersion + ") on element of ProtocolRequired.requiredVersion.");
}
this.currentVersion = param1.readInt();
if (this.currentVersion < 0)
{
throw new Error("Forbidden value (" + this.currentVersion + ") on element of ProtocolRequired.currentVersion.");
}
return;
}// end function
ce qui est interressant pour nous c'est juste les lignes avec "param1." , on en a 2 dans ce fichier :
this.requiredVersion = param1.readInt();
this.currentVersion = param1.readInt();
donc 2 variables : requiredVersion et currentVersion
il faut toujours les lire dans l'ordre donc on commence par requiredVersion , on peu voir grace a readInt qu'il faut lire un integer (un entier) donc 4 octets (un entier est sur 4 octets)
ce qui donne : requiredVersion = 00 00 05 A4 = 1444

on passe a currentVersion , pareil readint donc un entier donc 4 octets (bon la c'est les memes octets) :
currentVersion = 00 00 05 A4 = 1444
----------------------------------------------------------------------------------------------------------------------------------------------
(a partir d'ici je me base sur une ancienne version pour coller a l'image mais le principe restera toujours le meme)
Voila , on peu passer au message suivant qui a on a vu ID=3 taille = 330 , on trouve le fichier .as : HelloConnectMessage
Code:
public function deserializeAs_HelloConnectMessage(param1:IDataInput) : void
        {
            var _loc_4:int = 0;
            this.salt = param1.readUTF();
            var _loc_2:* = param1.readUnsignedShort();
            var _loc_3:uint = 0;
            while (_loc_3 < _loc_2)
            {
                
                _loc_4 = param1.readByte();
                this.key.push(_loc_4);
                _loc_3 = _loc_3 + 1;
            }
            return;
        }// end function

this.salt = param1.readUTF();
var _loc_2:* = param1.readUnsignedShort();
_loc_4 = param1.readByte();


salt est un UTF , on lit un UTF (une chaine de caracteres) en regardant les 2 1er octets , 00 20 , la chaine contiendra 00 20 caracteres (32 caracteres) , on lit alors 32 octets
salt = ces 32 octets

_loc_2 est un UnsignedShort (c'est 2 octets) , comme j'ai la flemme de compter les 32 octets precedent de memoire ca fait 294 (bon ca c'est a verifier)

on arrive dans la boucle :
Code:
while (_loc_3 < _loc_2)
            {
                
                _loc_4 = param1.readByte();
                this.key.push(_loc_4);
                _loc_3 = _loc_3 + 1;
            }
donc on lira loc_4 (un byte donc un octet) 294 fois ca qui donnera un tableau "key" de 294 octets
 
Inscrit
12 Octobre 2012
Messages
21
Reactions
0
#10
Aaaaaah ok, donc en gros:
this.requiredVersion = les 4 octets apres l'id + la taille ( octets 5-9 )
this.currentVersion = les 4 octets encore apres

Maintenant param1 c'est tout le paquet j'imagine?
Et encore une chose je comprend pas bien ce que cette fonction fait finalement, car elle ne retourne rien, elle verifie juste si les deux entiers sont superieurs a 0.
Sauf si ce que tu voulais me montrer etait le fait que deux entiers suivent l'id et la taille?
Et que signifient au final, cette version actuelle et cette version requise?

Merci de me consacrer autant de temps ! :)
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#11
en fait oui ce paquet pour nous est totalement inutile ca sert juste a dire au jeu "hey ho t'es pas a jour mon coco" , c'etait juste pour expliquer avec une exemple pas trop compliqué , juste 2 variables a lire

oui param1 c'est tout le paquet

par contre :
Zyko a dit:
Aaaaaah ok, donc en gros:
this.requiredVersion = les 4 octets apres l'id + la taille ( octets 5-9 )
this.currentVersion = les 4 octets encore apres
this.requiredVersion = les 4 octets apres l'id + la taille ( octets 4 a 7 ) car ID 2 octets , taille 1 octet , donc le corps commence apres le 3ieme -> au 4ieme (dans l'image 0x n'est pas un octet , c'est pour dire que c'est de l'hexa)
 
Inscrit
12 Octobre 2012
Messages
21
Reactions
0
#12
0x ca je sais bien :p
Et ouais au temps pour moi je me suis embrouillé mais c'est direct plus claire maintenant, merci :)
Ah et j'ai pas d'ordi sous la main la mais en gros ca sera la meme chose pour tous les autres id avec une deserialize differente chaque fois evidemment.
Je suis curieux de voir ce qu'il se passe avec l'id 780 InformationMessage ( qqch comme ca ), pour plus tard traiter ce que me dit ce message d'info, inventaire plein recolte perdue, dans mon cas.
Penses tu en revanche que je puisse faire des fonctions assez rapide en autoit pour traiter les paquets recus et faire reagir mon bot en consequence? ( retour a la banque lors d'un fullPods par exemple ) ?
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#13
Code:
public function deserializeAs_TextInformationMessage(param1:IDataInput) : void
        {
            var _loc_4:String = null;
            this.msgType = param1.readByte();
            if (this.msgType < 0)
            {
                throw new Error("Forbidden value (" + this.msgType + ") on element of TextInformationMessage.msgType.");
            }
            this.msgId = param1.readShort();
            if (this.msgId < 0)
            {
                throw new Error("Forbidden value (" + this.msgId + ") on element of TextInformationMessage.msgId.");
            }
            var _loc_2:* = param1.readUnsignedShort();
            var _loc_3:uint = 0;
            while (_loc_3 < _loc_2)
            {
                
                _loc_4 = param1.readUTF();
                this.parameters.push(_loc_4);
                _loc_3 = _loc_3 + 1;
            }
            return;
        }// end function
donc avec msgId tu dois pouvoir identifier le message de full pod (bon par contre quand t'es full pod c'est deja trop tard pour marcher) , apres pour se deplacer suffit de faire comme tout les bots pixels
 
Inscrit
12 Octobre 2012
Messages
21
Reactions
0
#14
Aaaah parfait enfin presque, je comprend de mieux en mieux..

Donc la mon msgId sera stocké sur le 5e et 6e octet de mon paquet?
Et comment je peux traduire cette portion du paquet?

Ah et "la recolte est perdue", ce message apparait a la fin d'une recolte lorsque celle ci ne peut pas etre prise en compte donc fatalement le nombre de pods est egal a celui d'avant le debut de la recolte, donc on peut encore se deplacer.
Je voulais passer par la car je sais pas du tout comment m'y prendre pour obtenir les pods ( vie, caracteristiques,kamas,etc.. ) vu qu'aucun paquet contenant ces infos n'est envoyé de base par le serveur me semble-t-il. ( Et que je ne souhaite pas faire de MITM )
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#15
oui ca sera 5 et 6 , te suffira de snifer quand tu arrives en full pod et noter 5 et 6 puis ensuite comparer ce que tu as noté quand tu recois un 780 , il y'a bien un paquet pour les pod , vie , kamas , cara mais ca va beaucoup compliquer , l'idée du 780 est pas mal en fait c'est vrai que maintenant on ne peu plus etre overpods en recoltant
 
Inscrit
12 Octobre 2012
Messages
21
Reactions
0
#16
Ah bah cette fois je crois avoir tout ce qu'il me faut !
Donc je n'ai pas besoin de traduire le msgId, d'ailleurs je ne saurais meme pas comment m'y prendre..
Et y'a pas de moyens dans le meme genre pour obtenir les données sur sa vie, ses kamas, sans passer par une connexion par socket ou in MITM?
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#17
tu peux regarder du coté deja du paquet 500 , apres j'ai plus en tete mais il y'a tout ca qui passe quelque part , en sniffant tu trouveras
 
A

Anonymous

Invité
#20
J'espere que ton projet va aboutir, c'est tres interessant. Moi qui n'aime pas du tout l'autoit, ce projet de bot sort de la norme et j'apprecie beaucoup cette facon de faire. Cela pourrait peut etre meme rivaliser avec un autentique MITM ?
 
Haut Bas