Problème analyse packet

Inscrit
28 Janvier 2020
Messages
3
Reactions
0
#1
Bonjour à tous,

Je me suis recemment lancé dans le developpement d'un bot MITM. Grâce aux nombreux tutos présents sur le forum, je suis en mesure de récuperer les informations suivantes à travers les packets :

- id (951 par exemple)
- libellé de l'id (GameMapMouvement par exemple)
- taille de l'id

Désormais je voudrais pouvoir analyser les informations relatives au packet, c'est-a-dire : pour l'id 951 par exemple, j'aimerai récuperer KeyMovement, ForcedDirection et ActorId. D'après ce que j'ai trouvé sur le forum, il faudrait que je deseralise le packet. Auriez-vous une piste pour m'aider à faire cela ?

Je vous remercie par avance.

Ps : Je dev en python, je récupere les packets avec Scapy.

Merci,
Om
 
Inscrit
26 Janvier 2016
Messages
99
Reactions
34
#2
Hello ,
Tu réussis a avoir l id c est que tu fais deja de la deserialisation !
Il faut que tu regardes dans les sources comment les données sont deserialisé et que tu fasses de même
 
Inscrit
28 Janvier 2020
Messages
3
Reactions
0
#3
Merci pour ta réponse.

Je suis allé voir dans les sources comme tu suggères. Toujours pour l'id 951, voici les méthodes de déserialisation :

Code:
      public function deserialize(input:ICustomDataInput) : void
      {
         this.deserializeAs_GameMapMovementMessage(input);
      }
      
      public function deserializeAs_GameMapMovementMessage(input:ICustomDataInput) : void
      {
         var _val1:uint = 0;
         var _keyMovementsLen:uint = input.readUnsignedShort();
         for(var _i1:uint = 0; _i1 < _keyMovementsLen; _i1++)
         {
            _val1 = input.readShort();
            if(_val1 < 0)
            {
               throw new Error("Forbidden value (" + _val1 + ") on elements of keyMovements.");
            }
            this.keyMovements.push(_val1);
         }
         this._forcedDirectionFunc(input);
         this._actorIdFunc(input);
      }
      
      public function deserializeAsync(tree:FuncTree) : void
      {
         this.deserializeAsyncAs_GameMapMovementMessage(tree);
      }
      
      public function deserializeAsyncAs_GameMapMovementMessage(tree:FuncTree) : void
      {
         this._keyMovementstree = tree.addChild(this._keyMovementstreeFunc);
         tree.addChild(this._forcedDirectionFunc);
         tree.addChild(this._actorIdFunc);
      }
      
      private function _keyMovementstreeFunc(input:ICustomDataInput) : void
      {
         var length:uint = input.readUnsignedShort();
         for(var i:uint = 0; i < length; i++)
         {
            this._keyMovementstree.addChild(this._keyMovementsFunc);
         }
      }
      
      private function _keyMovementsFunc(input:ICustomDataInput) : void
      {
         var _val:uint = input.readShort();
         if(_val < 0)
         {
            throw new Error("Forbidden value (" + _val + ") on elements of keyMovements.");
         }
         this.keyMovements.push(_val);
      }
      
      private function _forcedDirectionFunc(input:ICustomDataInput) : void
      {
         this.forcedDirection = input.readShort();
      }
      
      private function _actorIdFunc(input:ICustomDataInput) : void
      {
         this.actorId = input.readDouble();
         if(this.actorId < -9007199254740990 || this.actorId > 9007199254740990)
         {
            throw new Error("Forbidden value (" + this.actorId + ") on element of GameMapMovementMessage.actorId.");
         }
      }
En effet, on voit bien les fonctions permettant de récuperer KeyMovement, ForcedDirection et ActorId.
Finalement dans tree, on met toutes les informations qui nous interesse.

Ma question est la suivante : Quelles informations du packet doit-on analyser pour récuperer KeyMovement, ForcedDirection et ActorId ?

Désolé si ce n'est pas clair ><

Merci d'avance pour ton aide.
 
Inscrit
26 Janvier 2016
Messages
99
Reactions
34
#4
var _keyMovementsLen:uint = input.readUnsignedShort();
Donc ici un unsignedShort

Et ensuite tu vois le for qui boucle sur _keyMovementsLen , donc tu fais de même .
et
this.keyMovements.push(_val1);
un push donc c'est une "liste" que tu remplis avec des "_val1" qui pour chaque valeur est égale à :
_val1 = input.readShort();
Donc un Short

ect ...

En esperant que ça te mettes sur la voie pour la suite ! :)
 
Inscrit
2 Janvier 2016
Messages
13
Reactions
1
#5
Salut, comme l'explique Brasvengeur le point important est de bien comprendre comment la désérialisation est effectuée pour ton paquet reçu.

Pour résumer la désérialisation :
  1. Réception d'un paquet ( des bytes )
  2. Lecture de l'en tête, récupérer l'ID, taille des données
  3. Vérifier pour l'ID, quel est le Network Message en question
  4. Etudier la méthode de désérialisation ( étape ou tu est actuellement )
  5. Reproduire dans ton environnement, le méthode de ddésérialisation précédente ( ce que tu cherche à faire )
Je précise que j'ai omis certains détails pour simplifier au mieux l'explication ( Comme par exemple le fait que tu puisse recevoir deux Messages en un seul paquet )

Pour reprendre ton cas, on s'intéresse donc à cette méthode : deserializeAs_GameMapMovementMessage

Code:
public function deserializeAs_GameMapMovementMessage(input:ICustomDataInput) : void
      {
         var _val1:uint = 0;
         var _keyMovementsLen:uint = input.readUnsignedShort();
         for(var _i1:uint = 0; _i1 < _keyMovementsLen; _i1++)
         {
            _val1 = input.readShort();
            if(_val1 < 0)
            {
               throw new Error("Forbidden value (" + _val1 + ") on elements of keyMovements.");
            }
            this.keyMovements.push(_val1);
         }
         this._forcedDirectionFunc(input);
         this._actorIdFunc(input);
      }
Tu reçois donc un CustomDataInput en paramètre, pour améliorer au mieux ta compréhension du code de Dofus je te conseils d'étudier également cet interface.
Pour simplifier, vois ce paramètre comme une surcouche d'un ByteArray (Action Script).

D'après le déroulement de la méthode, on procède donc de cette manière:
  1. Lecture de la taille keyMovementsLen, cela la taille des données keyMovements contenu dans la partie "data" du paquet
  2. Ou boucle jusqu'à atteindre la taille lu précédement, en récupérant des short ( à l'aide de la méthode readShort ), on ajout les valeurs lu au tableau this.keyMovements
  3. on appelle la méthode _forcedDirectionFunc en passant input (notre ByteArray ) en paramètre, pour qu'il continue la lecture
  4. De même pour _actorIdFunc
J'ai volontairement décris l'étape 3 & 4 de manière assez vague pour que tu essaie de toi même.

[Doc]
ByteArray: https://help.adobe.com/fr_FR/FlashPlatform/reference/actionscript/3/flash/utils/ByteArray.html
 
Dernière édition:
Inscrit
28 Janvier 2020
Messages
3
Reactions
0
#6
Hello Gijutsu,

Je te remercie pour cette explication très complète. Je reviens vers vous quand j'ai du nouveau !

Bonne soirée,
Om
 
Haut Bas