D1Proxy - Sniffer et s'amuser

Inscrit
16 Septembre 2016
Messages
7
Reactions
0
#1
Bonjour,
Voici une petite présentation de D1Proxy (désolé je suis mauvais pour présenter les projets) :

D1Proxy est un proxy TCP permettant à la fois d'être utile (sniffer) mais rajoute également des fonctions communautaires et utiles (.all, commande pour passer son tour automatiquement utile sur une mule...).
Et la crème de la crème : C'est open source et ça tourne sous Java 11.

Il faut savoir que ce projet n'est pas seulement un repo Github, D1Proxy tourne actuellement de manière officielle par moi même et je fournis une config.xml pour s'y connecter.

Sans plus attendre voici le Github: https://github.com/Aquazus/D1Proxy
Ainsi que le Discord en rapport avec mes projets: TC2AeJOY83hK6jINUIVHxUEpc5N
Vous trouverez ici la config.xml permettant de choisir entre Ankama et D1Proxy: https://transfer.sh/jpsbg/config.xml

Pour ceux qui ont pas compris : C'est une sorte de passerelle à la EratzGW qui permet à la fois de sniffer ce dont on a besoin (des maps, des cellules de combat, des quêtes, ...) mais également de rajouter des commandes facilitant le jeu et le multicompte. Ce n'est PAS un bot. Le code est la simplement pour aider les développeurs souhaitant lire le protocole du jeu et/ou continuer à proposer les fonctionnalités de la passerelle si je venais à disparaître.


N'hésitez pas à contribuer au code, venir sur Discord, me proposer de nouvelles fonctionnalités ou me rapporter des bugs.
Dofusiennement, Aqua.
 
Inscrit
14 Decembre 2012
Messages
48
Reactions
2
#2
Je trouve l'idée géniale, vraiment. Mais je comprends pas pourquoi vouloir faire passer les connections via ton serveur?
Je préférai largement un serveur en local (et uniquement ça), tu garantis une certaine protection des données et ça rend le tool complètement indépendant. Aussi dans l'idée il serait intéressant de fournir un baseline pour les plugins, et d'en faire le coeur du projet. Un peu comme l'IDE VCS, très simple dans son contenu mais un serivce de plugins qui ajoute une expérience unique modifiable. J'ai envie de me remettre au dev, je vais travailler sur ton code et je te tiendrai à jour =)
 
Dernière édition:
Inscrit
12 Avril 2014
Messages
22
Reactions
5
#3
Joli travail sur le code.
Par contre on peut bien dire que c'est un bot même si l'automatisation est faible.

@Ashlanfox Aucune connexion ne passe par son serveur si je ne m'abuse. L'intercepteur est ouvert sur 127.0.0.1:4444 (localhost), le client se connecte dessus et D1Proxy relaie les paquets au serveur de jeu. En fait il appelle ça "proxy" mais c'est un bon vieux MITM :p
 
Inscrit
16 Septembre 2016
Messages
7
Reactions
0
#4
Bonsoir,
Le projet est utilisable 100% en local et le but de la version online c'est de contribuer au sniffing de tout ce qui est nécessaire pour mon projet d'émulateur.

Nayde a raison sur le fonctionnement de l'intercepteur ;)
 
Inscrit
14 Decembre 2012
Messages
48
Reactions
2
#5
J'ai eu un peu plus de temps et je parcours un peu ton code (j'ai en effet remarqué que tu proposais le serveur local).

J'ai du mal à comprendre une partie de cette fonction, pourquoi ne pas tout simplement faire ceci :
Java:
Packet.builder().putBytes(packet.getBytes(StandardCharsets.UTF_8)).writeAndFlush(destination);
Tu saurais éclairer ma lanterne? :)

Java:
private void splitAndFlush(String packet, Client destination) {
        try {
            StringReader reader = new StringReader(packet);
            ByteArrayOutputStream buffer = new ByteArrayOutputStream(2048);
            OutputStreamWriter writer = new OutputStreamWriter(buffer, StandardCharsets.UTF_8);
            char[] cbuf = new char[1024];
            byte[] tempBuf;
            int len;
            while ((len = reader.read(cbuf, 0, cbuf.length)) > 0) {
                writer.write(cbuf, 0, len);
                writer.flush();
                if (buffer.size() >= 1024) {
                    tempBuf = buffer.toByteArray();
                    Packet.builder().putBytes(buffer.toByteArray()).writeAndFlush(destination);
                    buffer.reset();
                    if (tempBuf.length > 1024) {
                        buffer.write(tempBuf, 1024, tempBuf.length - 1024);
                    }
                }
            }
            if (buffer.size() >= 1024) {
                Packet.builder().putBytes(buffer.toByteArray()).writeAndFlush(destination);
                Packet.builder().putByte(0).writeAndFlush(destination);
            } else {
                Packet.builder().putBytes(buffer.toByteArray()).putByte(0).writeAndFlush(destination);
            }

        } catch (Exception ex) {
            log.error("An error occurred while splitting a packet", ex);
        }
    }
 
Inscrit
16 Septembre 2016
Messages
7
Reactions
0
#6
J'ai eu un peu plus de temps et je parcours un peu ton code (j'ai en effet remarqué que tu proposais le serveur local).

J'ai du mal à comprendre une partie de cette fonction, pourquoi ne pas tout simplement faire ceci :
Java:
Packet.builder().putBytes(packet.getBytes(StandardCharsets.UTF_8)).writeAndFlush(destination);
Tu saurais éclairer ma lanterne? :)

Java:
private void splitAndFlush(String packet, Client destination) {
        try {
            StringReader reader = new StringReader(packet);
            ByteArrayOutputStream buffer = new ByteArrayOutputStream(2048);
            OutputStreamWriter writer = new OutputStreamWriter(buffer, StandardCharsets.UTF_8);
            char[] cbuf = new char[1024];
            byte[] tempBuf;
            int len;
            while ((len = reader.read(cbuf, 0, cbuf.length)) > 0) {
                writer.write(cbuf, 0, len);
                writer.flush();
                if (buffer.size() >= 1024) {
                    tempBuf = buffer.toByteArray();
                    Packet.builder().putBytes(buffer.toByteArray()).writeAndFlush(destination);
                    buffer.reset();
                    if (tempBuf.length > 1024) {
                        buffer.write(tempBuf, 1024, tempBuf.length - 1024);
                    }
                }
            }
            if (buffer.size() >= 1024) {
                Packet.builder().putBytes(buffer.toByteArray()).writeAndFlush(destination);
                Packet.builder().putByte(0).writeAndFlush(destination);
            } else {
                Packet.builder().putBytes(buffer.toByteArray()).putByte(0).writeAndFlush(destination);
            }

        } catch (Exception ex) {
            log.error("An error occurred while splitting a packet", ex);
        }
    }
Tout simplement car c'est pas conventionnel d'envoyer un packet d'une taille indéterminée, on utilise des buffer en TCP et c'est pas pour rien, tu va pas mettre le buffer a 999999 juste car certains joueurs ont une grosse banque... On split le packet par blocs de X bytes afin de respecter ce que fais le serveur officiel de base.
Après ce code de splitting est pas à jour, j'utilise un code sur mon émulateur qui est bien plus léger et rapide, je metterai à jour plus tard
 
Inscrit
14 Decembre 2012
Messages
48
Reactions
2
#7
Tout simplement car c'est pas conventionnel d'envoyer un packet d'une taille indéterminée, on utilise des buffer en TCP et c'est pas pour rien, tu va pas mettre le buffer a 999999 juste car certains joueurs ont une grosse banque... On split le packet par blocs de X bytes afin de respecter ce que fais le serveur officiel de base.
Après ce code de splitting est pas à jour, j'utilise un code sur mon émulateur qui est bien plus léger et rapide, je metterai à jour plus tard
D'acc' merci pour la réponse rapide :)
 
Haut Bas