Analyser un packet

  • Auteur de la discussion Anonymous
  • Date de début
A

Anonymous

Invité
#1
Salut à tous :)

Voilà, après une année sur la touche, je décide de reprendre un petit peu mon bot, et j'avoue avoir quelques difficulté sur certains points.
J'aimerai savoir ce que le serveur me demande d'envoyer pour la connexion. Pour cela je jete un coup d'oeil sur WPEpro, il me dit d'envoyer l'id 4. Un petit tour sur les sources, je trouves l'id, et je dois envoyer les informations suivante :
Code:
        public var version:Version;
        public var lang:String = "";
        public var login:String = "";
        public var credentials:Vector.<int>;
        public var serverId:int = 0;
        public var autoconnect:Boolean = false;
        public var useCertificate:Boolean = false;
        public var useLoginToken:Boolean = false;
        public static const protocolId:uint = 4;
Je regarde le packet que je reçois, mais j'ai du mal à l'identifier a partir des ces infos :/
Je prends les 5 premiers bytes par exemple.
[00 12 01 1C 01]
Je décortique le header, je trouve ca :
ID : 4.
Taille de taille : 2.
Taille : 01 1C => 284.

Du coup, je ne vois pas ce à quoi correspond le 01 :/
Ensuite la version, normal : [02 06 04 E5 8D 01 00]
Ensuite, [00 02 66 72] pour la langue avec la taille sur 2 octets et 66 pour "f" et 72 pour "r". Puis la taille du pseudo + pseudo, normal. Après viens le "crédentials"... x)
Je suppose que les deux premiers octets suivants le pseudo représente la taille du crédenmachin x) donc codé sur 256 octets chez moi. Ensuite, 256 octets plus lui, je dois avoir le serveur sur 4 octets (malheureusement non x)) donc et les trois booleen qui représente autoconnect (je suppose que c'est la case coché dans le client), mais le deux suivants, je ne sais pas :/

Donc au final, sur ce packet, je me pose 4 question :
-> Qu'est ce que le crédential (apparemment le mdp crypté, mais de quel maniere ? :x) ?
-> Qu'est ce que useCertificate ?
-> Qu'est ce que useLoginToken ?
-> Sur les trois booléens, étant donnée qu'un seul = 1 bit, comment sont ils écrit exactement dans le packet ?

Merci =)

Edit : après une petite recherche, j'ai remarqué que le packet 3 nous donne des infos sur un "salt" (systeme de hash) et une clé RSA. Après, je ne vois pas du tout comment encrypter le mdp avec ces infos.
PS : je travaille en C / C++
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#2
01 1C c'est la taille totale du message = 284

pour le boolean dans un byte : un byte c'est 8 booleans : 0 0 0 0 0 0 0 0 , dans les sources tu as un chiffre qui indique la position et la valeur du boolean dans le byte , par exemple 2,1 ca donne 0 0 0 0 0 1 0 0 (1 en position 2 , on commence a compter de la droite et de 0) ca donne donc un byte avec 4 en valeur
ou utiliser le booleanByteWrapper

pour les autres questions je sais pas
 
A

Anonymous

Invité
#3
La taille j'avais compris mais je parle du 01 après le 1C ^^'
Et par rapport au booléen :
UseCertificate doit être en rapport avec le certificat je pense ( :lol: ).
autoconnect doit être la case coché connexion rapide.
useLoginToken doit être le login enregistré ou non.

Pour la pos :
_loc_2 = BooleanByteWrapper.setFlag(_loc_2, 0, this.autoconnect);
_loc_2 = BooleanByteWrapper.setFlag(_loc_2, 1, this.useCertificate);
_loc_2 = BooleanByteWrapper.setFlag(_loc_2, 2, this.useLoginToken);
Donc chez moi qui ait coché connexion rapide, qui est le certificat ainsi que login enregistré, pas de prises de tete : 111 => 7, que je ne retrouve malheureusement nul part dans le packet x)
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#4
ah le 01 apres le 1C c'est justement le byte qui contient les 3 booleans (le 07 que tu cherches)
public function deserializeAs_IdentificationMessage(param1:IDataInput) : void
{
var _loc_5:int = 0;
var _loc_2:* = param1.readByte(); // le 1er byte sans compter le header (donc ton 01 ou si tu preferes ton 07)
this.autoconnect = BooleanByteWrapper.getFlag(_loc_2, 0);
this.useCertificate = BooleanByteWrapper.getFlag(_loc_2, 1);
this.useLoginToken = BooleanByteWrapper.getFlag(_loc_2, 2);
this.version = new Version();
this.version.deserialize(param1);
this.lang = param1.readUTF();
this.login = param1.readUTF();
var _loc_3:* = param1.readUnsignedShort();
var _loc_4:uint = 0;
while (_loc_4 < _loc_3)
{

_loc_5 = param1.readByte();
this.credentials.push(_loc_5);
_loc_4 = _loc_4 + 1;
}
this.serverId = param1.readShort();
return;
-> 01 = 00000001 donc seul le boolean 0 est a 1 et le boolean 0 c'est (_loc_2, 0, this.autoconnect)
ca donne :
this.autoconnect = 1
this.useCertificate = 0 (pas d'utilisation de certificat , ca servait aux anciennes versions)
this.useLoginToken = 0

ca repond aux 3 dernieres questions : useCertificate = osef , useLoginToken = osef
 
A

Anonymous

Invité
#5
Ok merci ^^
Après, pour le cryptage, je crois qu'il faut encrypter *le salt concaténer au mdp* avec comme clé la key reçu. Je vais essayer et je vais voir =)
 
A

Anonymous

Invité
#7
Je me suis pas mal référer au code en dotnet posté sur le forum mais sur le code de Maxou, je pense pas pouvoir refaire la même, mais au vu de l'utilisation, c'est bien une simple concaténation + key, je trouverai la fonction de RSA sur internet et je devrais être pas mal, je te tiens au courant, merci de ton aide =)
 
Haut Bas