Coucou les gens!
Je suis en train de travailler sur un MITM sur 2.0 et j'ai commence a definir les fonctions de serialization / deserialization pour chaque message. J'arrive donc au message IdentificationMessage (5833) tranquillement mais apres plusieurs heures de debug, j'avoue etre perdu. Voici le fichier as de ce message:
https://pastebin.com/SirPq9hh
Comme on peut le voir, le message est constitue d'un boolean qui va servir a initialiser autoconnect, useCertificate et useLoginToken.
Ensuite on arrive sur une objet "Version" contenant 3 bytes (major, minor, code) suivis d'un int (build) puis un dernier byte (buildType).
Une chaine "lang".
Un vector<Int> credentials.
Un short serveur id.
Un varLong sessionOptionalSalt.
Et enfin un vector<Uint> failedAttempts.
Mon paquet ressemble au suivant:
5b26 nous donne 1011011001001 10 soit ID 5833 et len_type 2 (ce qui est correct).
Le 0000 0003 est le counter (c'est envoye depuis le client).
Taille du message: 0114 => 276. Voila pour le header.
01 est le premier boolean.
La version est encode sur 8 bytes: 02 39 0a 00 00 00 0f 00
La langue : 00026672 ("fr")
Et la, c'est le drame...
J'essai de lire mon vector<Int> mais j'ai pas l'impression que ca fonctionne... Je lis d'abord le varint encode sur 2 bytes: 8002 (256), puis je lis 256 bytes. Il ne me reste donc plus que 5 octets dans mon message cense encore contenir un short, un varlong et un vector<int>, soit minimum 12 octets (5 de moins que la taille total du message). Je n'ai pourtant fais que suivre pas a pas le fichier as correspondant:
J'arrive bel et bien a lang = fr, et le varint (8002), apres reverification en ligne fait bien 256. Je vois vraiment pas ou j'ai pu me tromper :/
Des idees ?
Je suis en train de travailler sur un MITM sur 2.0 et j'ai commence a definir les fonctions de serialization / deserialization pour chaque message. J'arrive donc au message IdentificationMessage (5833) tranquillement mais apres plusieurs heures de debug, j'avoue etre perdu. Voici le fichier as de ce message:
https://pastebin.com/SirPq9hh
Comme on peut le voir, le message est constitue d'un boolean qui va servir a initialiser autoconnect, useCertificate et useLoginToken.
Ensuite on arrive sur une objet "Version" contenant 3 bytes (major, minor, code) suivis d'un int (build) puis un dernier byte (buildType).
Une chaine "lang".
Un vector<Int> credentials.
Un short serveur id.
Un varLong sessionOptionalSalt.
Et enfin un vector<Uint> failedAttempts.
Mon paquet ressemble au suivant:
5b260000000301140102390a0000000f000002667280029a61b853c158875197ad5900b46b1278e566c43cbdd3b0d72b1156c648241f78c579d496ce2b3b919286c0e3f5c44c3fb21ad46ab2fd243b33cb8a0c036a6ecc9b7956fdf531cd1ef7ccc5450520cce6a39b21032cd7a4870c098dceb404f4cf772338319c766264442373d266e81ec19b293d49c3db1cbe3301fe9d4eecb035993ee0502c64ba7ff65f10350763ace75df049e77925645c6cdaca999629a1b78bed05e54c8a53b9dc457fb42c2d7f73c433ca2ea5012fde9e82102fe582869c3af9b32efa94488fac900ffc47c80e42c8762e846e4736c7c9566e7758bb66ed66523b881a2fd84257187d127d3734f1c542a5a537899271bf5eb9a0d54a1c010000000000
5b26 nous donne 1011011001001 10 soit ID 5833 et len_type 2 (ce qui est correct).
Le 0000 0003 est le counter (c'est envoye depuis le client).
Taille du message: 0114 => 276. Voila pour le header.
01 est le premier boolean.
La version est encode sur 8 bytes: 02 39 0a 00 00 00 0f 00
La langue : 00026672 ("fr")
Et la, c'est le drame...
J'essai de lire mon vector<Int> mais j'ai pas l'impression que ca fonctionne... Je lis d'abord le varint encode sur 2 bytes: 8002 (256), puis je lis 256 bytes. Il ne me reste donc plus que 5 octets dans mon message cense encore contenir un short, un varlong et un vector<int>, soit minimum 12 octets (5 de moins que la taille total du message). Je n'ai pourtant fais que suivre pas a pas le fichier as correspondant:
Code:
public function deserializeAs_IdentificationMessage(input:ICustomDataInput) : void
{
var _val3:int = 0;
var _val9:uint = 0;
this.deserializeByteBoxes(input);
this.version = new Version();
this.version.deserialize(input);
this._langFunc(input);
var _credentialsLen:uint = input.readVarInt();
for(var _i3:uint = 0; _i3 < _credentialsLen; _i3++)
{
_val3 = input.readByte();
this.credentials.push(_val3);
}
this._serverIdFunc(input);
this._sessionOptionalSaltFunc(input);
var _failedAttemptsLen:uint = input.readUnsignedShort();
for(var _i9:uint = 0; _i9 < _failedAttemptsLen; _i9++)
{
_val9 = input.readVarUhShort();
if(_val9 < 0)
{
throw new Error("Forbidden value (" + _val9 + ") on elements of failedAttempts.");
}
this.failedAttempts.push(_val9);
}
}
Des idees ?
Dernière édition: