C# CommunityTools sniffer

Inscrit
20 Octobre 2021
Messages
49
Reactions
41
#1
Bonjour à tous !

J'ai pour habitude de créer des outils d'assistance ouvert à tous surtout aux joueurs lambdas, qui ne produit généralement aucune action mais qui permet quand même d'être un outil efficace pour un joueur.

Je vous proposes mon outil avec les sources, j'utilise le package SharPcap pour accéder aux paquets envoyé par le serveur sans jamais les intercepter directement, cela me permet d'avoir un logiciel 100% invisible et sans strictement aucun risque de bannissement.
Cette méthode peut également permettre l'envoie des paquets à conditions de reproduire un envoie TCP complet (besoin d'un certains niveau en réseau)

J'ai publié cela sur mon GitHub: https://github.com/Thomas-Anonymous/CommunityTools

Pour le moment l'outil n'a qu'une version 1.X qui sera dédié à rétro et aura une version 2.X pour D2 qui n'est pour le moment pas prévu.

Le logiciel à subit une grosse mise à jour lors du passage à la 1.1, il à complètement été refait !
Visuellement, niveau programmation et certaines pratiques plus sécurisés.

Voici les options prévus à ce jour:

• Récupération des items inventaire et leurs stats (en partie présent sur la 1.0)
• Récupération de la banque (présent sur la 1.0)
• Analyse du FM et assistance
• Avertissement spawn d'un mob
• Auto mise à jours des items (quand un item est manquant dans la BDD) Fini !
• Liste des crafts faisable avec les ressources inventaire & banque (présent sur la 1.0)
• Calcul le coût de craft, la vente HDV ou la vente à un PNJ des items (présent sur la 1.0)
• Récupère les prix des HDV lors de la visite d'un item (présent sur la 1.0)

Aperçu visuel :

index[1].png
 
Dernière édition:

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#2
Sympa, merci du partage :D
 
Inscrit
20 Octobre 2021
Messages
49
Reactions
41
#3
Sympa, merci du partage :D
Ce sera encore plus sympa quand je trouverais le moyens de chercher les crafts disponibles par rapport au total des ressources disponible, là tout de suite de tête je vois pas trop comment je vais pouvoir géré tout cela ... Je sens que je vais pas finir tout de suite finalement, je vais au moins finir la liste des ressources présente, faire des tests avec des stuffs, je suis en train de géré la liste des crafts & des items actuellement, pour déjà tout préparer.
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#4
@JeBotPas Alors avec les D2O tu peux récupérer les liste des items et des recettes :)
Une recette est une list de integer dont chaque élément représente le GID d'une ressource.
 
Inscrit
20 Octobre 2021
Messages
49
Reactions
41
#5
@JeBotPas Alors avec les D2O tu peux récupérer les liste des items et des recettes :)
Une recette est une list de integer dont chaque élément représente le GID d'une ressource.
C'est pour rétro j'ai récupérer la liste des SWF comme partager ici:
https://cadernis.com/index.php?threads/données-du-jeu-sorts-items-monstres.2713/#post-26637

J'ai donc la liste des recettes et des items, mais c'est plus comment je vais dire que je peux crafté ceci et cela ... Je pense devoir faire toute la liste des 2241 crafts et vérifier les ressources par rapport aux miennes, on verra pour optimiser plus tard :)
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#6
@JeBotPas Plutot que de passer en revu les xxxxx milliers d'items, tu fais un dictionnaire avec comme key le GID.
Comme ca quand tu as une recette et que tu souhaites savoir si ton item est présent dans ton inventaire, tu as juste à appeler le dictionnaire à l'élément GID.
Donc tu n'as qu'une seule boucle, c'est celle des 2241 recipes, je pense que tu ne peux pas faire mieux.
 
Inscrit
20 Octobre 2021
Messages
49
Reactions
41
#7
@JeBotPas Plutot que de passer en revu les xxxxx milliers d'items, tu fais un dictionnaire avec comme key le GID.
Comme ca quand tu as une recette et que tu souhaites savoir si ton item est présent dans ton inventaire, tu as juste à appeler le dictionnaire à l'élément GID.
Donc tu n'as qu'une seule boucle, c'est celle des 2241 recipes, je pense que tu ne peux pas faire mieux.
J'utilise des List de class custom pour les recettes et la fonction Find de List pour chercher à l'intérieur, cela peut me permettre de boucler les 2241 recettes et de vérifié que j'ai tel,tel,tel et tel item dans ma banque en tel,tel,tel et tel quantité.

Je viens d'actualiser le code source j'en suis à ce niveau là:
test.png

test.png

Après il n'y à que 9746 items maximum et généralement dans la banque on en à 500/1000 quoi ... Déjà j'en est presque 500 ce sera un bon test ^^

Edit: Bon ben j'ai finalement "fini" le logiciel. Plus qu'à tout mettre au propre et peut être à optimisé, je pense que j'aurais la flemme d'optimisé, je vais juste corriger le thread avec les invokes, faire une option pour sortir en .txt, il manquera à faire l'aide fm et avertisseur et voilà :) je boss sur ça demain ^^
 
Dernière édition:
Inscrit
20 Octobre 2021
Messages
49
Reactions
41
#8
Pour informations, je vais travailler sur une version capable de voir exactement les groupes de packet au lieux de faire manuellement, on à déjà packet par packet bien défini bien propre avec cette méthode au lieux de bytes qu'on doit couper nous même, mais j'ai vu qu'il y à des histoires de segment et après avoir vu sur wireshark (utilisant la même DLL je crois) il y à écrit par exemple "1/2 segment" car c'est envoyer sur 2 packets le premier atteignant les 15XX bytes.

Ensuite je vais voir comment on sait quel est quel compte, actuellement tout est lu, donc que ce soit X ou Y comptes, vous ouvrez 8 fois la banque avec 8 comptes seul le dernier sera pris en compte etc etc...

J'ai bien commencer à décoder les stuff aussi (assez simple on va pas ce le cacher), intéressant à savoir que les items possède un ID unique en plus de l'ID lié à l'item en lui même et d'autres caractéristiques. Je vais devoir lire les stuff à la connexion pour ensuite savoir quel item est posé dans la table de FM vu que seul l'ID unique est mis, ensuite je dois voir les changements entre chaque rune un vrais bordel et si en plus vous êtes en multi compte, c'est le bordel ....

Donc je vais me pencher sur cela et essayer de vous partager une meilleure version :) n'hésitez pas à faire des propositions de tools utile, intelligent sans envoie de packet.
 
Inscrit
14 Mai 2019
Messages
66
Reactions
22
#9
Pour informations, je vais travailler sur une version capable de voir exactement les groupes de packet au lieux de faire manuellement, on à déjà packet par packet bien défini bien propre avec cette méthode au lieux de bytes qu'on doit couper nous même, mais j'ai vu qu'il y à des histoires de segment et après avoir vu sur wireshark (utilisant la même DLL je crois) il y à écrit par exemple "1/2 segment" car c'est envoyer sur 2 packets le premier atteignant les 15XX bytes.

Ensuite je vais voir comment on sait quel est quel compte, actuellement tout est lu, donc que ce soit X ou Y comptes, vous ouvrez 8 fois la banque avec 8 comptes seul le dernier sera pris en compte etc etc...

J'ai bien commencer à décoder les stuff aussi (assez simple on va pas ce le cacher), intéressant à savoir que les items possède un ID unique en plus de l'ID lié à l'item en lui même et d'autres caractéristiques. Je vais devoir lire les stuff à la connexion pour ensuite savoir quel item est posé dans la table de FM vu que seul l'ID unique est mis, ensuite je dois voir les changements entre chaque rune un vrais bordel et si en plus vous êtes en multi compte, c'est le bordel ....

Donc je vais me pencher sur cela et essayer de vous partager une meilleure version :) n'hésitez pas à faire des propositions de tools utile, intelligent sans envoie de packet.
Salut ton premier point m'interesse mais je ne suis pas sur d'avoir compris, lorsque tu parles de segment et 15XX tu veux dire que 1500 est le MTU ? Tu as trouvé un moyen alternatif pour pouvoir reconstruire la data qui serait présent sur "2 paquets et pas 1" si j'ai bien compris ?
 
Inscrit
20 Octobre 2021
Messages
49
Reactions
41
#10
Salut ton premier point m'interesse mais je ne suis pas sur d'avoir compris, lorsque tu parles de segment et 15XX tu veux dire que 1500 est le MTU ? Tu as trouvé un moyen alternatif pour pouvoir reconstruire la data qui serait présent sur "2 paquets et pas 1" si j'ai bien compris ?
Salut j'ai pas compris ce qu'était MTU, mais par exemple quand ils envoient l'inventaire sur rétro je l'ai sur 5 paquets et sur wireshark il y a écrit segment 1/5 qui veut dire c'est le premier packet sur les 5 ensembles.

Je ne sais pas comment il voit ça je sais que quand je faisais du bot moi même je recevais les packets a la suite en devant les découper en 2.0, je n'ai pas vérifié si il découpe tout seul les packets sur cette version mais sur rétro c'est packet par packet et la il fait bien la différence en tout cas.

À tester sur wireshark en 2.0 mais étant donner que sur rétro c'est en "claire" c'est plus facile à voir :)

Car je suis pas sûr que lire les 4 prochains packet pour récupérer un inventaire ou une banque soit très optimisé ^^'

Edit: AAAAH MTU = maximum transfert unite, bah je sais pas, dofus rétro transfert max dans les 1516 après ça il met sur un autre packet j'ai remarqué, juste une remarque, le max je sais pas. Je vais faire des tests je reviendrais montrer :)
 
Dernière édition:
Inscrit
20 Octobre 2021
Messages
49
Reactions
41
#11
Bonne année !

Bon pendant que les gens faisait la fête moi je travail sur le CommunityTools bien plus beau et plus propre. (Déjà en niveau de programmation c'est fait correctement enfin, mieux du moins). Avec des invokes pour le thread au lieux de bypass salement le système.

Après études, Rétro envoie un maximum de 1500 bytes, (1500++ avec les informations de connexion une fois supprimé on est à 1500), cependant des fois comme pour le stuff je sais qu'il envoie 600byte entre 2 fois 1500 bytes et pourtant c'est tout ensemble.

La seule chose que j'ai pu trouvé d'intéressant sur wireshark c'est les n° de packet en gros "le prochain packet est le n° 3, n° 2632, 251" etc etc. Rien avoir avec les n° des packets de la source, donc on peut savoir qui est le suivant, je l'ai pas trouvé sur SharpPcap et puis bon, je ne pense pas que ce soit utile et je pense que ce soit assez linéaire.

J'ai beaucoup travailler sur le logiciel hâte de vous le partager prochainement ! J'ai mis la liste des items directement dans une classe, j'ai mis une petite fenêtre à l'ouverture du logiciel pour choisir le réseau à entendre (comme WireShark avec le choix), choisir un serveur directement ou une ip à entré manuellement.

Des logs, avec d'un côté le reçu de l'autre l'envoie, d'un côté en brute de l'autre en hex :)
Beaucoup plus de souplesse dans l'idée de pouvoir être utilisé sur d'autres jeux, il suffira de dégager ma lecture des packets et de la changer. Puisque j'utilise à présent une fonctionnalité direct de SharpPcap me permettant de récupérer uniquement les bytes reçu en supprimant le header, le header de connexion et en récupérant juste et simplement les bytes. (Les premiers packets à priori vide 0 bytes jusqu'au premier packet de 2+1bytes (2 bytes à lire, 1 de 0x00 qui signe la fin du packet) etc etc.

config.png

logi.png

class.png

Je mettrais à jour le projet GitHub petit à petit :)

Le seul vrais problème que j'ai c'est le multi compte, comment savoir qui envoie quoi à où, puisqu'on regarde la carte réseau uniquement >_>
 
Inscrit
20 Octobre 2021
Messages
49
Reactions
41
#12
La mise à jour est arrivée ! Je n'ai pas encore fini, je vais essayer de créer un auto choix de personnage pour test le MITM dans la prochaine mise à jour, pas plus.
Et je pense faire une pause sur la lecture de Rétro et essayer de faire l'aide chasse aux trésors pour 2.0.

Je comprend mieux les packets de 2.0 que Rétro ironiquement ... Mais cela me prendra bien évidemment bien plus de temps.
test.png
 
Inscrit
20 Octobre 2021
Messages
49
Reactions
41
#13
Salut ! Merci beaucoup pour ton partage ! Ton logiciel est t'il compatible avec le client modern de Rétro ou seulement le legacy ?
Salut, aucun soucis.

Alors la façon de sniffer est compatible avec tout ce que tu veux (similaire à wireshark)

Par contre ma partie de programmation sur la traduction je le fais sur le client modern. Je n'ai pas vraiment fait attention si il y avait une différence entre le legacy et le modern en terme de traduction.

Mais tu peux modifier bien évidemment :)

J'ai pas eu le temps en ce moment mais je travail sur la traduction des FM, il y aura 2 valeurs une qui considère que tout ce qui est retiré est du reliquat en - et une qui considère aucun reliquat en -, on ne peut que faire une fourchette sur la. 1.29 :/

Je vais voir ce que je vais faire et comment je vais faire ^^

Après je passe à la 2.0 plus long et chiant :/

Il faudra que je montre aussi un test d'envoi de packet je pense un choix de personnages sélectionner via le logi pour démontré qu'on peut écrire je me suis pas pencher dessus ^^
 
Inscrit
20 Octobre 2021
Messages
49
Reactions
41
#14
Hey, je suis toujours là, je pense que l'envoie des packets il faut programmer je pense tout le packet complet (ce qu'on voit dans WireShark par exemple) incluant quel IP envoie à qui, etc etc. Cela à l'air super complet et surtout complèxe.

Je travail dessus mais j'ai du mal à tout comprendre, il y à comme sur D2 des calculs le binaire des hex et des joyeusetés du genre pour déclaré l'ip, la taille etc ... J'analyse encore tout ça pour faire un exemple d'envoie :)

Si vous avez des questions ou des améliorations n'hésitez surtout pas :)

Edit: J'ai profondément analyser les packets dans la soirée, beaucoup de zones d'ombres ...
Je vais continuer à étudier cela ... Je vous partage pour le moment mon avancement dans la compréhension du protocol:

Code:
xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx | addresse physique destinataire
xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx | addresse physique source
xxxx xxxx xxxx xxxx | protocole

xxxx | version
xxxx | taille header
xxxx xxxx | fin

xxxx xxxx xxxx xxxx | taille total

xxxx xxxx xxxx xxxx | identification (??)

x x x x xxxx xxxx xxxx | flag (??)

xxxx xxxx | time to live (??)

xxxx xxxx | protocole

xxxx xxxx xxxx xxxx | header checksum (??)

xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx | ipv4 source
xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx | ipv4 destinataire


xxxx xxxx xxxx xxxx | port source
xxxx xxxx xxxx xxxx | port destinataire

xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx | sequence number (??)
xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx | acknowledgment number (??)

xxxx | header flag (??)
xxx x x x x x x x x x | flag (??)

xxxx xxxx xxxx xxxx | Windows (??)

xxxx xxxx xxxx xxxx | checksum (??)

xxxx xxxx xxxx xxxx | urgent pointer (??)


xxxx xxxx xxxx xxxx | données (taille variable)
0000 1010 0000 0000| Fin
Edit 30/01/22: D'après ce que j'ai compris (et je suis pas sûr d'avoir compris) le "Sequence number" est le nombre de "données" reçu et le "acknowledgment number" est le nombre de "données" envoyé. Cela permet au client et au serveur de savoir si tout les packets sont bien arrivés à destination.

Je soupçonne que les bots MITM est un défaut sur le comptage ce qui les rends facilement visible si c'est vérifié. Tout ces protocoles sont bien sûr automatique sur des bots normaux et sur les clients parce que la gestion TCP est tout simplement automatisé sur les logiciels avec les dépendances, ce qui n'est pas le cas ici puisque nous sommes dans le brute.

Je me demande aussi si la valeur "windows" ne fausse pas les bots MITM. Je vais continuer à étudier cela ... Bien sûr une fois bien compris il est possible d'automatiser tout cela à la même manière que les blibliothèques.
 
Dernière édition:
Inscrit
25 Octobre 2022
Messages
1
Reactions
0
#15
Salut tout le monde, déjà un grand merci pour cet utilitaire c'est juste incroyable ! En plus de remplir la fonction d'assistance pour la banque, il permet de visualiser les packets IN/OUT et c'est très utile !

Je voulais savoir s'il était possible de récupérer la position des mobs sur une carte à l'aide des paquets en provenance du serveur ?
En utilisant cet outil, je me disais qu'il "suffisait" d'interpréter les paquets contenant les infos de la map, et récupérer ce qu'il faut, si les positions des mobs y sont renseignées bien évidemment.

Quelqu'un sait-il quels sont les paquets intéressants pour obtenir ces infos ?

EDIT:
Après quelques recherches je sais maintenant que les packet intéressant portent la dénomination "GM".
J'ai pu déduire rapidement quelques infos depuis ce paquet, mais pas dans sa totalité.

Voilà ce que je sais:
GM|+ ou - (spawn ou disparition) Cell ID; Orientation; ? ; ? ; ID Mob 1 ; ... ; ID Mob n ; ? ; ? ; Lvl Mob 1 ; ... ; Lvl Mob n ; ? à propos du Mob 1 ; ... ; ? à propos du Mob n;

C'est pas grand chose je sais... Si quelqu'un passe par là et trimbale avec lui des infos sur les "?" je serait plutôt intéressé ! :D

La bise
 
Dernière édition:
Inscrit
20 Octobre 2021
Messages
49
Reactions
41
#16
Salut tout le monde, déjà un grand merci pour cet utilitaire c'est juste incroyable ! En plus de remplir la fonction d'assistance pour la banque, il permet de visualiser les packets IN/OUT et c'est très utile !

Je voulais savoir s'il était possible de récupérer la position des mobs sur une carte à l'aide des paquets en provenance du serveur ?
En utilisant cet outil, je me disais qu'il "suffisait" d'interpréter les paquets contenant les infos de la map, et récupérer ce qu'il faut, si les positions des mobs y sont renseignées bien évidemment.

Quelqu'un sait-il quels sont les paquets intéressants pour obtenir ces infos ?

EDIT:
Après quelques recherches je sais maintenant que les packet intéressant portent la dénomination "GM".
J'ai pu déduire rapidement quelques infos depuis ce paquet, mais pas dans sa totalité.

Voilà ce que je sais:
GM|+ ou - (spawn ou disparition) Cell ID; Orientation; ? ; ? ; ID Mob 1 ; ... ; ID Mob n ; ? ; ? ; Lvl Mob 1 ; ... ; Lvl Mob n ; ? à propos du Mob 1 ; ... ; ? à propos du Mob n;

C'est pas grand chose je sais... Si quelqu'un passe par là et trimbale avec lui des infos sur les "?" je serait plutôt intéressé ! :D

La bise

Salut, j'ai eu des soucis donc je n'ai plus avancer dedans.
Alors côté 1.29 oui, il suffit de lire les premiers caractères du packet pour savoir les infos et ensuite de déstructurer le texte reçu, attention à bien lire dans le bon format, je crois avoir fais une erreur dans cette version j'avais remis au propre mais pas mis à jour il y à peu et l'avoir mis au propre pour la 1.29 car le découpage était mal fait.

Pour la 2.0 il suffit de découper les packets reçus (récupération de l'id, & taille, si pas intéresser par le packet au lieux de le traduire sauter le nombre de bytes du packet pour passer au suivant) et récupérer le paquet qui nous intéresse.

Après c'est beaucoup de recherche pour traduire, pour 1.29 parfois il y à des commentaires qui peuvent aider dans le code source d'origine, mais compliquer de tout trouver les détails, faut souvent chercher sur google sur certains partage de sources il y à plus d'infos, des commentaires.

Malheureusement sans avoir chercher et tester sois même c'est complique ^^
Test sur les épouventailles, ils ont tous la même direction je crois, tu pourra être sûr de ta valeur orientation, pour l'ID de mob idem tu regardes son ID et si c'est le même bingo ! Idem pour le lvl.

Faut prendre des tests facile et grimper petit à petit :) on peut pas le savoir à l'avancer, il faut tester dans plusieurs situations pour trouver :D
 

AzureHaze

Contributeur
Inscrit
27 Septembre 2019
Messages
47
Reactions
250
#17
Salut tout le monde, déjà un grand merci pour cet utilitaire c'est juste incroyable ! En plus de remplir la fonction d'assistance pour la banque, il permet de visualiser les packets IN/OUT et c'est très utile !

Je voulais savoir s'il était possible de récupérer la position des mobs sur une carte à l'aide des paquets en provenance du serveur ?
En utilisant cet outil, je me disais qu'il "suffisait" d'interpréter les paquets contenant les infos de la map, et récupérer ce qu'il faut, si les positions des mobs y sont renseignées bien évidemment.

Quelqu'un sait-il quels sont les paquets intéressants pour obtenir ces infos ?

EDIT:
Après quelques recherches je sais maintenant que les packet intéressant portent la dénomination "GM".
J'ai pu déduire rapidement quelques infos depuis ce paquet, mais pas dans sa totalité.

Voilà ce que je sais:
GM|+ ou - (spawn ou disparition) Cell ID; Orientation; ? ; ? ; ID Mob 1 ; ... ; ID Mob n ; ? ; ? ; Lvl Mob 1 ; ... ; Lvl Mob n ; ? à propos du Mob 1 ; ... ; ? à propos du Mob n;

C'est pas grand chose je sais... Si quelqu'un passe par là et trimbale avec lui des infos sur les "?" je serait plutôt intéressé ! :D

La bise
Je sais pas si tu as regardé les sources?

onMovement:
                            var34.spriteType = var23;
                            var34.level = var10[7];
                            var34.scaleX = var27;
                            var34.scaleY = var28;
                            var34.noFlip = var18;
                            var34.cell = Number(var11);
                            var34.dir = var12;
                            var var35 = var10[8].split(",");
                            var34.color1 = var35[0];
                            var34.color2 = var35[1];
                            var34.color3 = var35[2];
                            var34.accessories = var10[9];
                            var34.bonusValue = var13;
                            var var36 = this.sliptGfxData(var17);
                            var var37 = var36.gfx;
https://github.com/dofera/dofedex/blob/master/loader/dofus/aks/Game.as#L610
 
Inscrit
28 Janvier 2023
Messages
3
Reactions
0
#18
C'est parfait c'est ce dont j'avais besoin je venais tous juste de créer un sujet sur le forum il y a un instant!
 
Inscrit
20 Octobre 2021
Messages
49
Reactions
41
#19
Salut à tous !

J'ai un peu abandonner le projet je vous avoue, mais des fois je m'ennuie alors je met à jour !
La mise à jour est toujours disponible sur GitHub dites moi si quelque chose ne fonctionne pas j'ai testé avec un lancement à vide pour être sûr que tout fonctionne !

Du coup ... J'ai apporté les modifications suivantes:

• Ajout d'une fenêtre de chargement (car rien ne ce passe au chargement et retrait des erreurs qui faisait crash ^^')
• Modification du système de lecture & trie des paquets, je le fais à présent manuel (maintenant que je sais :D) beaucoup plus rapide et claire.
• Modification de l'IP brute dans la base de donnée, à présent nous avons le DNS qui permet d'obtenir l'IP, on questionne le DNS pour obtenir l'IP actuel du serveur directement.
• Auto sélection de la sortie internet par défaut (par exemple Ethernet pour moi)

Je ne sais plus si c'était dans la dernière version, je ne sais pas si je l'avais mis à jour mais...
Il y à un décompileur pour le DInvoker.swf
Et un collecteur des fichiers lang, j'ai fais un peu à ma sauce, ça télécharge tout puis ensuite ça créer des fichiers texte (par exemple items.txt) qui contient tous les scripts réunis directement sur un seul .txt.

Pareille la base de donnée je sais plus si elle y était ou pas ...

J'ai un peu foutu le bordel dans la lecture des paquets, j'ai fais pas mal de test et j'avais la flemme de nettoyer, n'hésitez pas à remplacer ce que vous avez besoin évidemment ! (Dans "TraitementPackets" puis "TraitementRecu" ce qui vous intéresse notamment).

Il faudra peut être changer la partie qui sert à collecter les envoies. Avec le système de clé peut être qu'il faut les récupérer en tableau de byte directement et pas traduire en ASCII. Dans tous les cas j'ai pas envie de me battre avec ça :(

Le premier lancement peut durée plusieurs minutes pour la création de la base de données. Même si en regardant mon code c'est loin d'être optimisé ...

Il manque des items récent j'ai pas mis à jour la liste !
Édit: J'ai mis à jour les items ;) quand on ajoute des items ça les ajouteras au démarrage dans la BDD.
 
Dernière édition:
Inscrit
20 Octobre 2021
Messages
49
Reactions
41
#20
Salut à tous !

Je sais que certains suivent dans le silence le post et le code, je vous tiens à jour ...

J'ai décidé que Community Tools aura désormais 2 versions.
La version 1 sera pour rétro et la 2 pour 2.0 cela permet d'éviter de tout mélanger, grosse erreur que j'ai commencé à faire !

Je n'ai pas tout de suite envie de travailler sur 2.0, en ce moment je n'ai pas tous le temps que je voudrais autant perso que en programmation.

Je suis en train de réaliser la version 1.1, version dont je repars complètement à 0 sur des bases vierges pour refaire visuellement, structurellement et de façon propre le code.

Plusieurs choses vont être ajoutés et d'autres retirés ...

• Le retraite de la création de la base de donnée au démarrage, une base de donnée à jour au moment de la sortie sera présente.
(Cela retire le délais au chargement, même en ADSL c'est plus rapide de DL la BDD)
• Auto actualisation de la liste des items, qui permettra aux non développeurs de tenir à jour le logiciel.
• De la propreté et de l'organisation dans le code !
• Le choix de sélection de tous les serveurs, l'IP est récupéré dynamiquement donc les rares fois où le serveur change d'IP pas de problèmes!
• L'ajout de l'aide forgemagie (j'ai à peut près une idée ça va être compliqué car si le logiciel n'est pas lancer avant ou autre ça peut ne pas fonctionner comme ça devrait, le client lui est lancer donc suit tout de A a Z mais pas le tools ..)
• Je vais essayer d'améliorer les détections, comme la DD et la Banque qui peuvent être confondus voir si c'est possible ..
• Je vais revoir tout le GUI également, je vais essayer un truc plus esthétique !

J'ai retiré aussi par ailleurs un package inutile .. Du moins vu que je repars sur un projet vierge je suis partie sur l'ajout des 2 packages principaux utilisés (SharpPcap et data.Sqlite) et en plus ils sont à jour comme ça !

Si vous avez des idées d'ajout dites le !

Il faut savoir quand on utilise plusieurs threads ils ne peuvent pas directement gérer l'affichage, il faut passer par un "invoke" pour pouvoir avoir le droit de le gérer, j'ai imaginé une façon simple, efficace et rapide pour gérer tous les contrôleurs sans m'embêter !

J'ai pas testé toute la liste mais seulement 2 ou 3 mais j'imagine que ça devrait fonctionner toutes façons je le verrais pendant le dev:

Invokes:
        #region Invokes
        public void invokeReplace(Control control, string value) {
            if (control.InvokeRequired) {
                MethodInvoker invoker = delegate { invokeReplace(control, value); };
                control.Invoke(invoker);
            } else {
                switch (control.GetType().Name) {
                    case "RichTextBox":
                        ((RichTextBox)control).Text = value;
                        break;
                    case "Label":
                        ((Label)control).Text = value;
                        break;
                    case "TextBox":
                        ((TextBox)control).Text = value;
                        break;
                }
            }
        }
        public void invokeReplace(Control control, int value) {
            if (control.InvokeRequired) {
                MethodInvoker invoker = delegate { invokeReplace(control, value); };
                control.Invoke(invoker);
            } else {
                switch (control.GetType().Name) {
                    case "ProgressBar":
                        ((ProgressBar)control).Value = value;
                        break;
                    case "ComboBox":
                        ((ComboBox)control).SelectedIndex = value;
                        break;
                    case "NumericUpDown":
                        ((NumericUpDown)control).Value = value;
                        break;
                    case "ListBox":
                        ((ListBox)control).SelectedIndex = value;
                        break;
                }
            }
        }
        public void invokeReplace(Control control, bool value) {
            if (control.InvokeRequired) {
                MethodInvoker invoker = delegate { invokeReplace(control, value); };
                control.Invoke(invoker);
            } else {
                switch (control.GetType().Name) {
                    case "CheckBox":
                        ((CheckBox)control).Checked = value;
                        break;
                    case "RadioButton":
                        ((RadioButton)control).Checked = value;
                        break;
                }
            }
        }

        public void invokeAdd(Control control, string value) {
            if (control.InvokeRequired) {
                MethodInvoker invoker = delegate { invokeAdd(control, value); };
                control.Invoke(invoker);
            } else {
                switch (control.GetType().Name) {
                    case "RichTextBox":
                        ((RichTextBox)control).AppendText(value);
                        break;
                }
            }
        }
        public void invokeAdd(Control control, int value) {
            if (control.InvokeRequired) {
                MethodInvoker invoker = delegate { invokeAdd(control, value); };
                control.Invoke(invoker);
            } else {
                switch (control.GetType().Name) {
                    case "ProgressBar":
                        ((ProgressBar)control).Value = ((ProgressBar)control).Value + value;
                        break;
                    case "NumericUpDown":
                        ((NumericUpDown)control).Value = ((NumericUpDown)control).Value + value;
                        break;
                }
            }
        }

        public string invokeGet(Control control, string value) {
            if (control.InvokeRequired) {
                MethodInvoker invoker = delegate { invokeGet(control, value); };
                return (string)control.Invoke(invoker);
            } else {
                switch (control.GetType().Name) {
                    case "RichTextBox":
                        return ((RichTextBox)control).Text;
                        break;
                    case "Label":
                        return ((Label)control).Text;
                        break;
                    case "TextBox":
                        return ((TextBox)control).Text;
                        break;
                    default:
                        return null;
                        break;
                }
            }
        }
        public int invokeGet(Control control, int value) {
            if (control.InvokeRequired) {
                MethodInvoker invoker = delegate { invokeGet(control, value); };
                return (int)control.Invoke(invoker);
            } else {
                switch (control.GetType().Name) {
                    case "ProgressBar":
                        return ((ProgressBar)control).Value;
                        break;
                    case "ComboBox":
                        return ((ComboBox)control).SelectedIndex;
                        break;
                    case "NumericUpDown":
                        return (int)((NumericUpDown)control).Value;
                        break;
                    case "ListBox":
                        return ((ListBox)control).SelectedIndex;
                        break;
                    default:
                        return null;
                        break;
                }
            }
        }
        public bool invokeGet(Control control, bool value) {
            if (control.InvokeRequired) {
                MethodInvoker invoker = delegate { invokeGet(control, value); };
                return (bool)control.Invoke(invoker);
            } else {
                switch (control.GetType().Name) {
                    case "CheckBox":
                        return ((CheckBox)control).Checked;
                        break;
                    case "RadioButton":
                        return ((RadioButton)control).Checked;
                        break;
                    default:
                        return false;
                        break;
                }
            }
        }
        #endregion
 
Dernière édition:
Haut Bas