Bonjour tout le monde,
Je débute dans l'écriture d'un bot socket pour la dernière version de D2.
Je m'attaque donc à l'authentification.
Si j'ai bien compris le serveur nous envoie dans le message "HelloConnectMessage" une clé crypté qu'il faut décrypter avec la fameuse clé connus :
Une fois cette clé décryptée, elle donne une clé au format X509 qu'il faut convertir au format PEM.
Cette clef décryptée permettra de crypter la concaténation du nom de l'utilisateur avec le mot de passe et le salt.
Cela donne le credentials a envoyer dans l'IndentificationMessage.
Pour le moment je suis en train d'essayer de lire manuellement le paquet HelloConnectMessage, mais je rencontre un petit soucis pour lire la clé cryptée.
Je me suis beaucoup aidé du code officiel du jeu :
Voici ce que j'ai commencé a faire (HelloConnectMessage parsé manuellement) :
Voici mon code permettant de simuler readVarInt pour ce paquet :
Ce code me retourne 49.
La clé a décrypter serait donc contenu dans les 49 prochains octets ?
Cela me paraît bizarre, j'ai dus me tromper quelque pars...
Si c'est bien 49 octets, a quoi correspondent les octets contenu dans le reste du message ?
Merci d'avance pour votre aide.
Je débute dans l'écriture d'un bot socket pour la dernière version de D2.
Je m'attaque donc à l'authentification.
Si j'ai bien compris le serveur nous envoie dans le message "HelloConnectMessage" une clé crypté qu'il faut décrypter avec la fameuse clé connus :
Code:
MIIBUzANBgkqhkiG9w0BAQEFAAOCAUAAMIIBOwKCATIAqpzRrvO3We7EMi9cWYqdfb3rbdinTay+hxQ6t3dOiJLY4NITxyeIuy97yZYOojOlXS2SuJ4cCHjCeLCQO1FwOz+nynQWcBWecz2QdbHD2Kz7mNLd2qtZyEDO76rd7LaDOxRvgs9DsH9sfnCuKLKbd725xTLc7wRfJzOH9v9rTTYVXssXe7JUpTx8nV8yKnTiq3WpzBeZT4C3ZCR18GBBCh3NmSTbze9i2KipgZnOwBvhskVlweuqZ1KNIKsQgipBFuyww68RGNYaAKofMVVio4amrGpCT5MM852jpHsgJJfOUHu6md1CnvdwDPbo/PKQUI0RLb0ezE5gsPmas39QBw+DiaibUkk1aCkBxTOFqpIbjfLM2/4qA6GPcWUJxP3vmGoeCTMBLNEiPfLqVm86QzUCAwEAAQ==
Cette clef décryptée permettra de crypter la concaténation du nom de l'utilisateur avec le mot de passe et le salt.
Cela donne le credentials a envoyer dans l'IndentificationMessage.
Pour le moment je suis en train d'essayer de lire manuellement le paquet HelloConnectMessage, mais je rencontre un petit soucis pour lire la clé cryptée.
Je me suis beaucoup aidé du code officiel du jeu :
Code:
public function deserializeAs_HelloConnectMessage(param1:ICustomDataInput) : void
{
var _loc4_:int = 0;
this._saltFunc(param1);
var _loc2_:uint = param1.readVarInt();
var _loc3_:uint = 0;
while(_loc3_ < _loc2_)
{
_loc4_ = param1.readByte();
this.key.push(_loc4_);
_loc3_++;
}
}
Voici ce que j'ai commencé a faire (HelloConnectMessage parsé manuellement) :
Code:
// ID du paquet et nombre d'octets de la taille du paquet (id = 3, nombre d'octets de la taille = 2)
00 0E
// Taille du paquet (sans l'en-tête) = 341
01 55
// Taille du salt (32 octets) :
00 20
// Salt :
6A 62 77 75 70 69 38 30 40 67 4E 4E 75 4A 3D 3D 22 61 65 79 39 4B 25 76 6A 5E 48 51 48 48 29 42
// Octets a fournir à la fonction readVarInt (49 octets) pour obtenir la taille de la clef.
B1 02 7B DF
// Clé a décrypter ?
5C B1 33 C8 74 CF 2C 51 8F 4F A0 9B 8C 6B B0 D5 81 55 F5 50 F3 41 42 67 A1 EC 1F 3E 24 CB 03 49 46 E7 85 06 DE E0 C3 C4 7E A8 DE B7 16 19 FA 68 F6
// ???
89 30 0F AB 42 2E D0 E3 66 5F D2 C1 42 DB D1 7E 74 6A AD 97 88 E7 07 55 99 0D 21 40 F5 85 A9 C5 BE F7 81 96 4B 64 09 70 9B 4A 64 5D 29 5D 02 24 8F 54 61 9C 3A 91 B4 0D 9A AF A2 E7 1B 05 3A 5C 72 1F F9 83 C0 F8 6F 7F 48 37 5B C2 78 BA D3 E3 D4 1B 10 E9 79 95 E4 1D D8 5C E6 42 47 A8 33 A9 86 AC F0 5E 40 9A 9B 1F D6 5F 4C 62 1D 83 B5 B0 42 30 40 0B DA 2E BA D2 4D 7C 67 AD 72 6B E1 BB BA 73 19 29 9F DA F9 87 14 85 23 4F B1 EC 6B 6A DB 6A B9 C8 4C 93 2D BC EF F9 FC 33 DF 87 58 0A F1 E1 6F 30 84 9C 21 CE F1 38 EF 3A CF 72 B5 86 E8 15 96 17 D7 ED 96 D7 10 69 8E 9A 07 E3 1D 78 B0 E1 16 9F A4 67 37 BD C5 64 94 AB A3 58 AB 6F 90 0A DA 61 86 02 72 61 05 F1 CF 3D 11 E5 23 56 F3 0D 63 14 7C 3D FA C7 7D 93 E5 46 37 FA B3 E8 33 52 DD BD 9D 14 4F B8 66 7C 17 04 A6 BE
C:
// gcc ./readVarInt.c -o ./readVarInt.out && ./readVarInt.out
#include <stdlib.h>
#include <stdio.h>
void main(void) {
unsigned char datas[4];
int i = 0;
datas[0] = 0xb1;
datas[1] = 0x02;
datas[2] = 0x7b;
datas[3] = 0xdf;
int b = 0;
int value = 0;
int offset = 0;
int hasNext = 0;
while (offset < 32) {
b = datas[i];
++i;
hasNext = ((b & 128) == 127);
if (offset > 0) {
value = (value + ((b & 127) << offset));
} else {
value = (value + (b & 127));
}
if (!hasNext) {
printf("taille=%d\n", value);
return;
}
}
}
La clé a décrypter serait donc contenu dans les 49 prochains octets ?
Cela me paraît bizarre, j'ai dus me tromper quelque pars...
Si c'est bien 49 octets, a quoi correspondent les octets contenu dans le reste du message ?
Merci d'avance pour votre aide.
Dernière édition: