Des bytes après le ClientKeyMessage

nowis13

Contributeur
Inscrit
11 Janvier 2015
Messages
22
Reactions
1
#1
J'étais en train de regarder ce que mon client envoie à la connexion et mon parser a bloqué sur le ClientKeyMessage (id: 5607).

Ce message est envoyé entre la selection du personnage et l'arrivée en jeu, juste avant le GameContextCreateRequestMessage.
Il contient uniquement la ClientKey de 21 bytes sérialisés grâce à un writeUTF().

Seulement voilà, le paquet que je sniff (avec wireshark ou mon sniffer) est le suivant:

Code:
b'W\x9dG\x00\x15_ma_clef_ici______#01\xf1U;;5\xd4\xad|\xd9\xff\xdc\xcfD\xe9G\xcb\x90\x13\xe7\xda\xc1\x14^c\x98v\xc4C\xe76\x0e\x11s9\xa0\x010\xfa\x14)\xb4w\xfb\x98\x1e\x1f\xdd\t'
Le ClientKeyMessage se finit donc au #01 (car c'est le seul compte connecté sur la machine) et ensuite j'ai 48 bytes qui traînent.
Je sais pas ce qu'ils font là. Ca ressemble pas à un paquet. Pire encore, quand je relance le client, j'ai toujours 48 bytes mais DIFFÉRENTS !

Code:
b'W\x9dG\x00\x15_ma_clef_ici______#01I\x96%\x16n\xfa\xa4\x92\x15\xadb\xca\x105RZ\xf5\x91\xb1\xabA\xc4\xd6\xfaW\xcf\xf6\t#\xa7\xce!OG#\xee\xf1\xa7\x94\xce\rR\xef\x0b\x87,|\xf9'
b'W\x9dG\x00\x15_ma_clef_ici______#01\xf0\x1f@d\x9a\\I?\x97\x166\xfb\x97\x00\xb7\xc7^\xbbXi\x8e\x9f\xde\xb7\xb1\x16\x9c\x97\xd4\xb6\x15\x9f\r\xb8t\xdf\xb3\xf58j\xb3\xd3\xfdG\xdd\xbd\x84\xa4'
Dans le client, je trouve rien qui pourrait être a l'origine des ces bytes et il envoie bien le GameContextCreateRequestMessage juste après.
Pour moi ça ressemble à un bug du client qui leak de la mémoire.

Quelqu'un a plus d'info sur le sujet ? C'est un problème qui arrive souvent ?
 
Dernière édition:
Inscrit
13 Avril 2016
Messages
72
Reactions
0
#2
J'ai regardé dans le code du ClientKeyMessage.as
Voilà ce que j'obtiens:
Code:
package com.ankamagames.dofus.network.messages.security
{
   import com.ankamagames.jerakine.network.CustomDataWrapper;
   import com.ankamagames.jerakine.network.ICustomDataInput;
   import com.ankamagames.jerakine.network.ICustomDataOutput;
   import com.ankamagames.jerakine.network.INetworkMessage;
   import com.ankamagames.jerakine.network.NetworkMessage;
   import com.ankamagames.jerakine.network.utils.FuncTree;
   import flash.utils.ByteArray;
   
   [Trusted]
   public class ClientKeyMessage extends NetworkMessage implements INetworkMessage
   {
     
      public static const protocolId:uint = 5607;
       
     
      private var _isInitialized:Boolean = false;
     
      public var key:String = "";
     
      public function ClientKeyMessage()
      {
         super();
      }
     
      override public function get isInitialized() : Boolean
      {
         return this._isInitialized;
      }
     
      override public function getMessageId() : uint
      {
         return 5607;
      }
     
      public function initClientKeyMessage(param1:String = "") : ClientKeyMessage
      {
         this.key = param1;
         this._isInitialized = true;
         return this;
      }
     
      override public function reset() : void
      {
         this.key = "";
         this._isInitialized = false;
      }
     
      override public function pack(param1:ICustomDataOutput) : void
      {
         var _loc2_:ByteArray = new ByteArray();
         this.serialize(new CustomDataWrapper(_loc2_));
         if(HASH_FUNCTION != null)
         {
            HASH_FUNCTION(_loc2_);
         }
         writePacket(param1,this.getMessageId(),_loc2_);
      }
     
      override public function unpack(param1:ICustomDataInput, param2:uint) : void
      {
         this.deserialize(param1);
      }
     
      override public function unpackAsync(param1:ICustomDataInput, param2:uint) : FuncTree
      {
         var _loc3_:FuncTree = new FuncTree();
         _loc3_.setRoot(param1);
         this.deserializeAsync(_loc3_);
         return _loc3_;
      }
     
      public function serialize(param1:ICustomDataOutput) : void
      {
         this.serializeAs_ClientKeyMessage(param1);
      }
     
      public function serializeAs_ClientKeyMessage(param1:ICustomDataOutput) : void
      {
         param1.writeUTF(this.key);
      }
     
      public function deserialize(param1:ICustomDataInput) : void
      {
         this.deserializeAs_ClientKeyMessage(param1);
      }
     
      public function deserializeAs_ClientKeyMessage(param1:ICustomDataInput) : void
      {
         this._keyFunc(param1);
      }
     
      public function deserializeAsync(param1:FuncTree) : void
      {
         this.deserializeAsyncAs_ClientKeyMessage(param1);
      }
     
      public function deserializeAsyncAs_ClientKeyMessage(param1:FuncTree) : void
      {
         param1.addChild(this._keyFunc);
      }
     
      private function _keyFunc(param1:ICustomDataInput) : void
      {
         this.key = param1.readUTF();
      }
   }
}
Je pense que le:
Code:
if(HASH_FUNCTION != null)
         {
            HASH_FUNCTION(_loc2_);
         }
         writePacket(param1,this.getMessageId(),_loc2_);
Pose problème, car tu reçois le HashFunction dans le RDM il me semble.
Et dans le code, la méthode pour deserialize est
Code:
this.key = param1.readUTF();
Donc j'en déduis que les 48 bytes sont du HashFunction ;)
 

nowis13

Contributeur
Inscrit
11 Janvier 2015
Messages
22
Reactions
1
#3
Haaa mais oui j'avais oublié cette méthode pack. *-*

Maintenant que tu le dis, ça semble logique qu'il y ait une sécurité pour éviter de forger/modifier le paquet.
Merci d'avoir pris du temps sur mon problème, je me suis pas encore intéressé au RDM.

Je mets ici une liste des messages possiblement concernés en 2.41 pour la fonction recherche:
  • GameActionFightCastRequestMessage
  • BasicLatencyStatsMessage
  • ChatClientMultiMessage
  • ChatClientMultiWithObjectMessage
  • ChatClientPrivateMessage
  • ChatClientPrivateWithObjectMessage
  • GameCautiousMapMovementRequestMessage
  • GameMapMovementRequestMessage
  • GameRolePlayArenaSwitchToFightServerMessage
  • GameRolePlayPlayerFightRequestMessage
  • NpcGenericActionRequestMessage
  • InteractiveUseRequestMessage
  • InteractiveUseWithParamRequestMessage
  • ExchangePlayerMultiCraftRequestMessage
  • ExchangePlayerRequestMessage
  • ClientKeyMessage
 
Inscrit
13 Avril 2016
Messages
72
Reactions
0
#4
En décompilant le RDM(horrible), voici la ligne pour assigner le HASH_FUNCTION au NetworkMessage:
Code:
getDefinitionByName(§_a_-_---§.§_a_--_--§(-1820302786))["HASH_FUNCTION"] = this.addCryptedHash;
Et le addCryptedHash
Code:
public function addCryptedHash(param1:ByteArray) : void
      {
         var _loc5_:Object = null;
         var _loc6_:ByteArray = null;
         if(!this._hashKey)
         {
            _loc5_ = getDefinitionByName(§_a_-_---§.§_a_--_--§(-1820302810));
            _loc6_ = new ByteArray();
            _loc7_["writeUTF"](!!_loc5_["getInstance"]()["gameServerTicket"]?_loc5_["getInstance"]()["gameServerTicket"]:"");
            this._hashKey = HumanCheck["hash"](_loc6_);
         }
         var _loc2_:ByteArray = new ByteArray();
         _loc2_["writeBytes"](HumanCheck["hash"](param1));
         _loc2_["position"] = 0;
         var _loc3_:_SDEDEOIEOML = new _SDEDEOIEOML();
         var _loc4_:_SMOHLXWELH = new _SMOHLXWELH(new _SEWLWDOGGEI(new _SEXGEGLIGWO(this._hashKey),_loc3_));
         _loc3_["setBlockSize"](_loc4_["getBlockSize"]());
         _loc4_["encrypt"](_loc2_);
         param1["position"] = param1["length"];
         param1["writeBytes"](_loc2_);
      }
Bien-sûr, dit comme ça on ne comprend pas grand chose.
Mais le ClientKeyMessage tu le reçois après le RDM ?
 

nowis13

Contributeur
Inscrit
11 Janvier 2015
Messages
22
Reactions
1
#5
Oui oui, il n'y a que le AuthenticationTicketMessage qui est envoyé par le client (au world server) sans avoir reçu le RDM.

Je met ça de coté pour l'instant, je vais juste ignorer ces bytes je pense.
 
Haut Bas