Bonjour tout le monde,
Je suis nouveau sur le forum.
Je viens la programmation d'un bot socket D2 grâce a des informations que j'ai trouvé sur ce site.
Je pense avoir compris le système de récupération des messages envoyé par le serveur dofus.
Pour le moment, mon code réceptionne le message 3 pour récupérer le public key et le salt UTF-8 afin d'envoyer le message 4.
Je voulais qu'on me confirme que mon code fonctionne bien, le voici :
import java.net.InetAddress;
import java.io.IOException;
import java.net.UnknownHostException;
import java.net.Socket;
import java.io.*;
import java.net.*;
/*
COMPILATION:
javac ./socket.java && java socket
*/
public class socket {
private static String IP = "213.248.126.40";
private static int port = 443;
private static String salt;
private static byte[] publicKeyInBytes;
private static String privateKey = "MIIBUzANBgkqhkiG9w0BAQEFAAOCAUAAMIIBOwKCATIAqpzRrvO3We7EMi9cWYqdfb3rbdinTay+" +
"hxQ6t3dOiJLY4NITxyeIuy97yZYOojOlXS2SuJ4cCHjCeLCQO1FwOz+nynQWcBWecz2QdbHD2Kz7" +
"mNLd2qtZyEDO76rd7LaDOxRvgs9DsH9sfnCuKLKbd725xTLc7wRfJzOH9v9rTTYVXssXe7JUpTx8" +
"nV8yKnTiq3WpzBeZT4C3ZCR18GBBCh3NmSTbze9i2KipgZnOwBvhskVlweuqZ1KNIKsQgipBFuyw" +
"w68RGNYaAKofMVVio4amrGpCT5MM852jpHsgJJfOUHu6md1CnvdwDPbo/PKQUI0RLb0ezE5gsPma" +
"s39QBw+DiaibUkk1aCkBxTOFqpIbjfLM2/4qA6GPcWUJxP3vmGoeCTMBLNEiPfLqVm86QzUCAwEA" +
"AQ==";
public static void interpreteMessage(short idMessage, byte[] datas){
switch (idMessage){
case 1:
System.out.println(" Message (Hexadecimal/integer): " + bytesToString(datas, "%X", true));
break;
case 3:
int sizeSalt = bytesToInt(0, 2, datas);
byte[] saltInBytes = subTabBytes(2, sizeSalt, datas);
try{
salt = new String(saltInBytes, "UTF-8");
}
catch(UnsupportedEncodingException e){
e.printStackTrace();
}
int sizePublicKey = bytesToInt(sizeSalt+2, 2, datas);
publicKeyInBytes = subTabBytes(sizeSalt+4, sizePublicKey, datas);
System.out.println(" Taille du salt: " + sizeSalt);
System.out.println(" Salt (Hexadecimal/integer): " + bytesToString(saltInBytes, "%X", true));
System.out.println(" Salt (UTF-8): " + salt);
System.out.println(" Taille de la public key: " + sizePublicKey);
System.out.println(" Public key (Hexadecimal/integer): " + bytesToString(publicKeyInBytes, "%X", true));
break;
}
}
public static int bytesToInt(int posStart, int nbBytes, byte[] datas){
int result = 0;
for(int i=posStart; i < nbBytes + posStart; i++){
if(i < nbBytes + posStart - 1)
result += datas * 256;
else
result += datas;
}
return result;
}
public static byte[] subTabBytes(int indexStart, int length, byte[] datas){
byte[] result = new byte[length];
for(int i=0; i < length; i++)
result = datas[i+indexStart];
return result;
}
public static void readPaquet(byte[] datas, int pos) {
ByteArrayInputStream datasIS = new ByteArrayInputStream(datas);
short idMessage = (short)((datas[pos] * 256 + datas[pos+1]) >> 2);
short lengthType = (short)((datas[pos] * 256 + datas[pos+1]) & 3);
int posLenght = pos+2, posDatasMessage = lengthType+posLenght;
int length = bytesToInt(posLenght, lengthType, datas);
byte[] subDatas = subTabBytes(posDatasMessage, length, datas);
System.out.println("TYPE MESSAGE: " + idMessage);
System.out.println(" lengthType: " + lengthType);
System.out.println(" Taille du message: " + length);
interpreteMessage(idMessage, subDatas);
System.out.println("");
if(length+posDatasMessage < datas.length)
readPaquet(datas, length+posDatasMessage);
}
public static String bytesToString(byte[] bytes, String format, boolean spacer) {
StringBuilder sb = new StringBuilder(bytes.length*2);
for (byte b : bytes) {
sb.append(String.format(format, b));
if(spacer)
sb.append(" ");
}
return sb.toString();
}
public static void main(String[] zero) {
Socket socket;
try {
socket = new Socket(IP, port);
while(!socket.isClosed())
{
InputStream data = socket.getInputStream();
int available = data.available();
byte[] b = new byte[available];
int readCount = available;
if(readCount > 0){
data.read(b, 0, readCount);
readPaquet(b, 0);
}
}
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Voici les paquet que je réceptionne avec Wireshark :
Loading Image
Et voici ce que mon application Java récupère pour ce même paquet :
Loading Image
En théorie sa devrait être bon.
Maintenant j'ai :
Une public key récupéré dans le message 3Un Salt en UTF-8Une autre clé fixé en dur dans mon code que j'ai trouvé sur ce forum
D’après ce que j'ai compris en lisant plusieurs messages sur ce forum, je devrais maintenant être capable d'envoyer le message 4 au serveur pour m'authentifier. Le problème est que je ne vois pas trop comment faire.
J'ai encore un peu de mal a lire les sources Dofus.
J'ai lus ce tuto : https://cadernis.com/d/162-[tutoriel-débuter-dans-le-développement-socket-d2-(complet)
Mais il semble ne plus être d’actualité.
Merci d'avance pour votre aide,