Java Lire les paquets du jeu et en extraire les données

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

Anonymous

Invité
#1
Salut,

Je me suis inspiré du wiki d'OpenDofus ainsi que les codes en C# de BiM pour faire un programme qui lit les paquets du jeu et dans un premier temps afficher leur ID. J'utilise jpcap pour la capture des paquets.

Je n'arrive cependant pas à lire ne serait-ce que l'ID des paquets, même avec le code fourni par BiM que j'ai retranscrit en Java (provient de LittleEndianReader) :

Code:
public short readShort()
    {
        int position = this.position;
        this.position += 2;
        byte pbyte = buffer[position];
        return (short)((pbyte) | (buffer[position+1] << 8)) ; 
    }

public int readInt()
    {
        int position = this.position;
        this.position += 4;
        byte pbyte = buffer[position];
        
        return ( pbyte ) | ( buffer[position+1] << 8 ) | ( buffer[position+2] << 16 ) | ( buffer[position+3] << 24 );
        
    }
Je lis l'ID du paquet comme suit (data est un byte[] comportant les données du paquet récupéré par jpcap) :

Code:
                LittleEndianReader reader = new LittleEndianReader(data);
		int header = reader.readInt();
		int packetId = header >> 2;
Sauf que pour tous les packets du jeu j'obtiens un ID de... -1708. Donc ce n'est pas ça.

Qu'est-ce que je fais mal ? Pourriez vous m'aider ?

Merci !
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#2
Bonsoir,

Je vois que tu utilises ma classe LittleEndian mais j'aimerai comprendre pourquoi tu essayes de lire le header et le packetId avec.

De la même manière que certains langages humains s'écrivent de gauche à droite, et d'autres s'écrivent de droite à gauche, il existe une alternative majeure à l'organisation des octets représentant une donnée : l'orientation big-endian et l'orientation little-endian. Ces expressions sont parfois traduites par gros-boutiste et petit-boutiste ou par grand-boutien et petit-boutien. Les expressions byte order, ordre des octets, ou byte sex, sont également utilisées (bien qu’ordre des octets fasse référence à l'unité d’une base numérale précise sur 8 bits, que les autres termes plus généraux ne traduisent pas).

Le littleEndian lit les données avec l'octet de poids le plus faible en premier alors que le BigEndian lit les données avec l'octet de poids le plus fort en premier.
Tu dois donc utiliser la classe BigEndianReader.

Sinon le header se lit avec un ReadShort(); et pour l'ID tu as bon, il suffit de faire un décalage vers la droite.
 
A

Anonymous

Invité
#3
Et bien dans la présentation de ta classe tu insinues que Dofus utilise le LittleEndian, alors je l'ai utilisé. Si Dofus utilise le BigEndian, pourquoi avoir créé une classe pour lire le little (et inversement :p) ?

J'ai vu que ta classe pour lire le BigEndian utilise des classes spécifiques au C#, du coup j'ai utilisé le DataInputStream du Java qui est en big endian, et je trouve 5177 pour tous les packets...

Voilà le code :

Code:
                DataInputStream stream = new DataInputStream(new ByteArrayInputStream(data));
		int header = stream.readShort();
		int packetId = header >> 2;
Merci pour ton aide en tout cas ^^
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#4
C'est exact, dofus utilise parfois le LittleEndian, mais que dans certains cas qui sont rares, d'ou mon partage.

Je ne peux pas t'aider à traduire la classe en java, je n'ai pas les compétences pour.
 
A

Anonymous

Invité
#5
Si je t'envoie la valeur du "byte[] data", tu pourrais me dire si c'est un paquet valide ? Parce que je ne sais pas si jpcap me donne des données correctes...

Sinon j'aurai bien utilisé BiM seulement je n'ai pas réussi à le faire tourner =/
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#6
Donnes moi simplement la taille des bytes que tu reçois.

Beaucoup de maj sont nécessaires pour pouvoir executer BiM, rediriger le client en local, beaucoup de paquets ont changés et il doit être exécuté en x86.
 
A

Anonymous

Invité
#7
J'ai des paquets de taille 67, 68 et 73 bytes, 96 quand je parle dans le chat
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#8
C'est pas très précis. Donnes moi la taille de tes tout premiers paquets de connexion.
 
A

Anonymous

Invité
#9
Le tout premier paquet que je reçois fait 66 bytes, et le deuxième 65. Celui d'après en revanche fait 399 bytes. Avec l'affichage hexa/ascii de Wireshark je peux voir mon identifiant en clair ainsi que ma question secrète (wtf ?)... ça me semble cohérent
 

Sorrow

Membre Actif
Inscrit
5 Mai 2012
Messages
376
Reactions
26
#10
je peux voir mon identifiant en clair ainsi que ma question secrète (wtf ?)
C'est la réponse qui est secrète ("la question à la réponse secrète"). Elle te permet de supprimer t'es personnages, c'est pour cela que le serveur te l'envoi.
 
Haut Bas