Probleme d'analyse manuelle

Inscrit
13 Février 2020
Messages
4
Reactions
0
#1
Bonjour a tous! Je suis nouveau sur ce forum et j'y ai appris plein de chose donc je vous en remercie.
Apres avoir lu je pense tous les tutos en lien avec mon problème je doit surement passer a coté de quelque chose.

Avec wireshark j'ai récupéré le message contenant les informations de la map sur laquelle j'arrive (lors d'un changement de map).

23 ce 02 7c ad 01 41 a6 b8 14 00 00 00 00 00 00 00 04 0b da 42 5b c0 a0 80 34 40 00 0b cf 00 fc 00 01 00 05 5a

pour le debut biensur 23 ce signifie 100011110011 = 2291 et 10 = 2. la taille du message est donc 02 7c = 636

voila le debut du deserialize associé:
Code:
public function deserializeAs_MapComplementaryInformationsDataMessage(input:ICustomDataInput) : void

      {

         var _id3:uint = 0;

         var _item3:HouseInformations = null;

         var _id4:uint = 0;

         var _item4:GameRolePlayActorInformations = null;

         var _id5:uint = 0;

         var _item5:InteractiveElement = null;

         var _item6:StatedElement = null;

         var _item7:MapObstacle = null;

         var _item8:FightCommonInformations = null;

         this._subAreaIdFunc(input);

         this._mapIdFunc(input);

         var _housesLen:uint = input.readUnsignedShort();

         for(var _i3:uint = 0; _i3 < _housesLen; _i3++)

         {

            _id3 = input.readUnsignedShort();

            _item3 = ProtocolTypeManager.getInstance(HouseInformations,_id3);

            _item3.deserialize(input);

            this.houses.push(_item3);

         }

         var _actorsLen:uint = input.readUnsignedShort();

         for(var _i4:uint = 0; _i4 < _actorsLen; _i4++)

         {

            _id4 = input.readUnsignedShort();

            _item4 = ProtocolTypeManager.getInstance(GameRolePlayActorInformations,_id4);

            _item4.deserialize(input);

            this.actors.push(_item4);

         }
donc subAreaId = 60 41 = 24641
MapId = 41 a6 b8 14 00 00 00 00
Houseslen = 00 00 = 0
actorslen = 00 04 = 4
et id3 = 0b da = 3034

apres je deserialize GameRolePlayActorInformations

Code:
public class GameRolePlayActorInformations extends GameContextActorInformations implements INetworkType{

public function deserializeAs_GameRolePlayActorInformations(input:ICustomDataInput) : void
      {
         super.deserialize(input);
      }
}
donc je deserialize GameContextActorInformations

Code:
public class GameContextActorInformations extends GameContextActorPositionInformations implements INetworkType
   {
    public function deserializeAs_GameContextActorInformations(input:ICustomDataInput) : void
      {
         super.deserialize(input);
         this.look = new EntityLook();
         this.look.deserialize(input);
      }
    }
Donc je deserialize en premier GameContextActorPositionInformations et ensuite EntityLook

Code:
public function deserializeAs_GameContextActorPositionInformations(input:ICustomDataInput) : void
      {
         this._contextualIdFunc(input);
         var _id2:uint = input.readUnsignedShort();
         this.disposition = ProtocolTypeManager.getInstance(EntityDispositionInformations,_id2);
         this.disposition.deserialize(input);
      }
      
private function _contextualIdFunc(input:ICustomDataInput) : void
      {
         this.contextualId = input.readDouble();
         if(this.contextualId < -9007199254740990 || this.contextualId > 9007199254740990)
         {
            throw new Error("Forbidden value (" + this.contextualId + ") on element of GameContextActorPositionInformations.contextualId.");
         }
      }
donc contextualid = 42 5b c0 a0 80 34 40 00
puis on a un short: 0b cf
ensuite je deserialize EntityDispositionInformations

Code:
public function deserializeAs_EntityDispositionInformations(input:ICustomDataInput) : void
      {
         this._cellIdFunc(input);
         this._directionFunc(input);
      }
      
private function _cellIdFunc(input:ICustomDataInput) : void
      {
         this.cellId = input.readShort();
         if(this.cellId < -1 || this.cellId > 559)
         {
            throw new Error("Forbidden value (" + this.cellId + ") on element of EntityDispositionInformations.cellId.");
         }
      }
      
      private function _directionFunc(input:ICustomDataInput) : void
      {
         this.direction = input.readByte();
         if(this.direction < 0)
         {
            throw new Error("Forbidden value (" + this.direction + ") on element of EntityDispositionInformations.direction.");
         }
      }
et donc cellid = 00 fc
et direction = 00

et pour EntityLook

Code:
public function deserializeAs_EntityLook(input:ICustomDataInput) : void
      {
         var _val2:uint = 0;
         var _val3:int = 0;
         var _val4:int = 0;
         var _item5:SubEntity = null;
         this._bonesIdFunc(input);
         var _skinsLen:uint = input.readUnsignedShort();
         for(var _i2:uint = 0; _i2 < _skinsLen; _i2++)
         {
            _val2 = input.readVarUhShort();
            if(_val2 < 0)
            {
               throw new Error("Forbidden value (" + _val2 + ") on elements of skins.");
            }
            this.skins.push(_val2);
         }
         ...
Donc BonesID = 01 00
et c'est la que je trouve un probleme:
skinslen = 05 5a = 1370 ce qui fait plus que le nombre d'octet dans le paquet
Est-ce que quelqu'un arrive a voir ou est l'erreur ou simplement est capable de me dire ou se trouve vraiment le short skinslen?
Merci d'avance
 
Dernière édition:
Inscrit
20 Juillet 2019
Messages
5
Reactions
2
#2
Quand tu vois une ligne du type
Code:
_id4 = input.readUnsignedShort();
_item4 = ProtocolTypeManager.getInstance(GameRolePlayActorInformations,_id4);
_item4.deserialize(input);
La fonction ProtocolTypeManager.getInstance va te renvoyer un object de type d'id _id4. Dans ton cas _id4 = 3034 donc un GameRolePlayCharacterInformations.
Donc il va falloir que tu deserialise la suite de ton paquet comme un GameRolePlayCharacterInformations et non comme un
GameRolePlayActorInformations. (à noté que GameRolePlayCharacterInformations hérite de GameRolePlayActorInformations)

je te met un topic qui parle de se sujet: https://cadernis.com/index.php?threads/inventorycontentmessage-désérialiser.912/
 
Inscrit
13 Février 2020
Messages
4
Reactions
0
#3
Merci beaucoup ca va m'être très utile pour la suite! Ca ne règle pas mon problème mais ca m'a aidé à le préciser.
Voila la partie du paquet incriminé qui commence par le double ContextId et termine pas le nom de mon perso:

42 51 4f db 80 34 80 00 0b cf 01 bf 04 01 00 02 5b e4 10 00 05 01 e6 cb bb 02 0d 4c a8 03 5c 9a f4 04 09 34 74 05 45 74 b9 00 01 87 01 00 00 00 06 57 61 6c 74 69 61

je vais le lire a l'envers pour que vous compreniez le problème
Voila le deserialize de EntityLook:

Code:
public function deserialize(input:ICustomDataInput) : void
      {
         this.deserializeAs_EntityLook(input);
      }
      
      public function deserializeAs_EntityLook(input:ICustomDataInput) : void
      {
         var _val2:uint = 0;
         var _val3:int = 0;
         var _val4:int = 0;
         var _item5:SubEntity = null;
         this._bonesIdFunc(input);
         var _skinsLen:uint = input.readUnsignedShort();
         for(var _i2:uint = 0; _i2 < _skinsLen; _i2++)
         {
            _val2 = input.readVarUhShort();
            if(_val2 < 0)
            {
               throw new Error("Forbidden value (" + _val2 + ") on elements of skins.");
            }
            this.skins.push(_val2);
         }
         var _indexedColorsLen:uint = input.readUnsignedShort();
         for(var _i3:uint = 0; _i3 < _indexedColorsLen; _i3++)
         {
            _val3 = input.readInt();
            this.indexedColors.push(_val3);
         }
         var _scalesLen:uint = input.readUnsignedShort();
         for(var _i4:uint = 0; _i4 < _scalesLen; _i4++)
         {
            _val4 = input.readVarShort();
            this.scales.push(_val4);
         }
         var _subentitiesLen:uint = input.readUnsignedShort();
         for(var _i5:uint = 0; _i5 < _subentitiesLen; _i5++)
         {
            _item5 = new SubEntity();
            _item5.deserialize(input);
            this.subentities.push(_item5);
         }
      }
private function _bonesIdFunc(input:ICustomDataInput) : void
      {
         this.bonesId = input.readVarUhShort();
         if(this.bonesId < 0)
         {
            throw new Error("Forbidden value (" + this.bonesId + ") on element of EntityLook.bonesId.");
         }
      }
Une fois que EntityLook a lu toutes les valeurs qu'il devait lire il lit le nom de mon perso: Waldia =00 06 57 61 6C 74 69 61

Donc en remontant on trouve que:
subentitiesLen = 0000
42 51 4f db 80 34 80 00 0b cf 01 bf 04 01 00 02 5b e4 10 00 05 01 e6 cb bb 02 0d 4c a8 03 5c 9a f4 04 09 34 74 05 45 74 b9 00 01 87 01 00 00 00 06 57 61 6c 74 69 61
puis scalesLen = 0001
42 51 4f db 80 34 80 00 0b cf 01 bf 04 01 00 02 5b e4 10 00 05 01 e6 cb bb 02 0d 4c a8 03 5c 9a f4 04 09 34 74 05 45 74 b9 00 01 87 01 00 00 00 06 57 61 6c 74 69 61
indexedColorsLen = 0005
42 51 4f db 80 34 80 00 0b cf 01 bf 04 01 00 02 5b e4 10 00 05 01 e6 cb bb 02 0d 4c a8 03 5c 9a f4 04 09 34 74 05 45 74 b9 00 01 87 01 00 00 00 06 57 61 6c 74 69 61

Je pense que la valeur de skinslen est 0002 :
42 51 4f db 80 34 80 00 0b cf 01 bf 04 01 00 02 5b e4 10 00 05 01 e6 cb bb 02 0d 4c a8 03 5c 9a f4 04 09 34 74 05 45 74 b9 00 01 87 01 00 00 00 06 57 61 6c 74 69 61

Mais deux problemes se posent:
1. Entre skinslen et indexedColorsLen il n'y a que 3 octets alors que les skins sont des shorts
2. si je désérialise normalement le 8 premiers octets sont pour le double contextId les2 suivant pour _id2 les 2 d'apres pour cellId et un pour direction et enfin 2 pour bonesId et tout semble décalé d'un octet.
42 51 4f db 80 34 80 00 0b cf 01 bf 04 01 00 02 5b e4 10 00 05 01 e6 cb bb 02 0d 4c a8 03 5c 9a f4 04 09 34 74 05 45 74 b9 00 01 87 01 00 00 00 06 57 61 6c 74 69 61
 
Inscrit
20 Juillet 2019
Messages
5
Reactions
2
#4
Les skins sont des VarShort. Un var short est lu/écrit différemment d'un Short. La taille d'un varShort varie de 1 à 3. (un varInt de 1 à 5 et un varLong de 1 à 9). Je te laisses chercher l'algorithme d'écriture / lecture de ces variables.

J'ai désérialisé ton paquet comme ça (en gras c'est les bytes de ton paquet):

23ce => id = 2291, llen = 2
027c => len = 636
[MapComplementaryInformationsDataMessage]
[varShort] ad01 => subAreaId
[double] 41a6b81400000000 => mapId
[short] 0000 => houses.length = 0
[short] 0004 => actors.length = 4
[short] 0bda => typeID = 3034 == GameRolePlayCharacterInformations
[GameRolePlayCharacterInformations]
[GameRolePlayHumanoidInformations]
[GameRolePlayNamedActorInformations]
[GameRolePlayActorInformations]
[GameContextActorInformations]
[GameContextActorPositionInformations]
[double] 42514fdb80348000 => contextualId
[short] 0bcf => typeID = 3023 == EntityDispositionInformations
[EntityDispositionInformations]
[short] 01bf => cellId = 447
[byte] 04 => direction = 4

look [EntityLook]
[varshort] 01 => bonesId = 1
[short] 0002 => skin.length = 2
[ [varShort] 5b => 91, [varShort] e410 => 2148 ]
[short] 0005 => indexedColors.length = 5
[ [int] 01e6cbbb, [int] 020d4ca8, [int] 035c9af4, [int] 04093474, [int] 054574b9 ]
[short] 0001 => scales.length = 1
[ [varShort] 8701 => scale[0] = 135 ]
[short] 0000 => subentities.length = 0
[UTF] 0006 57616c746961 => 'Waldia'
 
Dernière édition:
Inscrit
13 Février 2020
Messages
4
Reactions
0
#5
Merci beaucoup pour toutes ces réponses! tout fonctionne parfaitement maintenant!
 
Inscrit
13 Février 2020
Messages
4
Reactions
0
#6
J'aurais une dernière question, lorsque je lis ce paquet (avec python) je trouve un nombre de ressource supérieur au nombre de ressources sur la map. Je pense qu'il s'agit des ressources des maps adjacentes mais je ne vois pas comment les différencier des autres ressources. Y a t-il une variable dans un paquet qui m'indique leur présence ou non sur la map? J'ai pensé a onCurrentMap mais cette variable renvoie toujours True. J'ai vue une discussion (qui date un peu) sur le sujet mais je n'y ai pas trouvé de solution (en tout cas pas que je comprenne). Si quelqu'un a une petite idée
 
Haut Bas