C# CommunityTools sniffer

AzureHaze

Contributeur
Inscrit
27 Septembre 2019
Messages
47
Reactions
250
#21
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
Doit y avoir moyen d'utiliser une méthode générique? ex: InvokeGet<T> ou un genre de pattern visiteur faudrait que je check le repo.
Pour l'UI tu as pensé à passer sous un framework plus moderne du genre Avalonia?
 
Inscrit
20 Octobre 2021
Messages
50
Reactions
42
#22
Doit y avoir moyen d'utiliser une méthode générique? ex: InvokeGet<T> ou un genre de pattern visiteur faudrait que je check le repo.
Pour l'UI tu as pensé à passer sous un framework plus moderne du genre Avalonia?
C'est vrais que j'utilises énormément des fonctions de base simple et peu de fonction un peu plus poussé, pour la simple et bonne raison que je prends 3h pour apprendre une nouvelle méthode là où l'ancienne pas moins rapide pas moins efficace est faite en 2 minutes, c'est juste une histoire de zone de confort :)

Je me suis vaguement renseigner et j'ai du mal à comprendre, j'ai bien vu des exemples mais je n'arrives pas à faire passer de type Control à l'intérieur de T ^^

Pour l'UI Avalonia je vais me renseigner, je ne connais pas du tout et c'est vrais que je satisfait de l'UI d'origine qui est déjà bien quand on la pousse. Mais je doutes toujours pour une question de temps de sortir de ma zone de confort pour cela ...

Merci quand même pour le feedback je gardes de coter !

Edit: En faite j'essaye de mettre deux valeurs <T, U> ce qui est inutile car je peux faire <Control, T>, hors ça ne changera rien puisqu'il faudra que je découpes dans les méthodes de la classe si c'est un string, int ou bool pour savoir comment je dois géré la valeur sans m'emmerder à le passer d'un à l'autre alors qu'on peut s'en passer largement.

De plus les éléments d'UI ne sont pas des variables, donc on ne peut pas bêtement faire un get / set, obligé de passer par une lecture de l'UI .text/.value etc ... Au final je ne vois pas à quel moment ce serait plus rapide, mieux ou plus pratique, je vois surtout moins de lisibilité.

L'idée est intéressante pour des variables qu'on peut get/set comme une clé et une valeur dans un tableau etc ..
Mais là ...

Ici la méthode interagis avec des éléments de l'UI, elle doit demandée à chaque fois l'autorisation et selon l'origine du contrôle (label par exemple) je récupères le string pour le remplacer, je ne veux ni int, ni bool.


1683246993299.png


Edit2: J'ai compris l'histoire du T mais ça ne fait que réduire le nombre de fonctions et ne simplifie pas le code:

T:
public T invokeGet<T>(Control control) {
            if (control.InvokeRequired) {
                MethodInvoker invoker = delegate { invokeGet<T>(control); };
                return (T)control.Invoke(invoker);
            } else {
                switch (control.GetType().Name) {
                    case "RichTextBox":
                        return (T)(object)((RichTextBox)control).Text;
                        break;
                    case "Label":
                        return (T)(object)((Label)control).Text;
                        break;
                    case "TextBox":
                        return (T)(object)((TextBox)control).Text;
                        break;
                    case "ProgressBar":
                        return (T)(object)((ProgressBar)control).Value;
                        break;
                    case "ComboBox":
                        return (T)(object)((ComboBox)control).SelectedIndex;
                        break;
                    case "NumericUpDown":
                        return (T)(object)((NumericUpDown)control).Value;
                        break;
                    case "ListBox":
                        return (T)(object)((ListBox)control).SelectedIndex;
                        break;
                    case "CheckBox":
                        return (T)(object)((CheckBox)control).Checked;
                        break;
                    case "RadioButton":
                        return (T)(object)((RadioButton)control).Checked;
                        break;
                    default:
                        return default(T);
                        break;
                }
            }
        }
Du coup je dois faire invokeGet<string>(control) mais bon .. On va faire ça car pour le get sans value la delegate à du mal..
 
Dernière édition:
Inscrit
20 Octobre 2021
Messages
50
Reactions
42
#23
Doit y avoir moyen d'utiliser une méthode générique? ex: InvokeGet<T> ou un genre de pattern visiteur faudrait que je check le repo.
Pour l'UI tu as pensé à passer sous un framework plus moderne du genre Avalonia?
Hello, 6 mois après j'ai toujours pas avancé dessus ... J'ai une idée d'un projet un peu plus clean et sympa à faire pour reprendre d'une autre façon.

Avec une programmation plus haut niveau, tu avais complètement raison sur la dynamique des variables, je ne maîtriser pas du tout, cela permet de réduire considérablement les fonctions.

Je travail pour une boite pour laquelle je dev pas mal même si cela n'a rien avoir avec le poste que j'occupe. J'ai automatisé pas mal de choses qui me prenait du temps et j'ai fais une V2 du logiciel avec des variables utilisant T et cela à été plus rapide à construire, plus propre, plus simple d'utilisation et surtout fonctionnelle :D

Je vais surement reprendre un petit projet, je ne suis pas dans l'idée de finir le projet ici (du moins dans l'immédiat, je n'ai plus de temps ...).
Mais un truc qui pourra peut être aider les débutants. A voir ... Dans tous les cas je ne bot pas, donc, je n'ai pas de délais à tenir ou autre :)
 
Inscrit
20 Octobre 2021
Messages
50
Reactions
42
#24
Hello ! J'ai finalement débuté une nouvelle version du Community Tools, une version 2.0 bien plus réfléchis même si on est surement loin de la meilleure opti.

Je vous partage les images:


1706480824353.png
Choix des serveurs par liste (à configurer dans la base de donnée directement), j'utilise les URL des serveurs qui permettent de récupérer l'IP actuel du serveur, même après un changement d'IP suite à une mise à jour par exemple !

Les cartes réseaux sont aussi automatiquement chargé et celle utilisée par défaut est sélectionnée.

1706481389619.png

Plus aucune variable pour contenir des immense listes d'items, j'utilise depuis le début une base de donnée, donc je ne vois pas l'utilité de l'utiliser dans le code, plutôt qu'une liste énorme des items et peu lisible une simple liste en sélectionnant un item les informations sont chargés directement via la base de donnée ! Chargement rapide et fluide.

1706481404792.png

Je ne sais pas pourquoi je charge tous les éléments pour décompiler les SWF dans les précédentes versions plutôt que de laisser le choix surtout qu'actuellement le logiciel ne prend que les infos basic des items donc en soit il suffit que du fichier "items" ... Donc en cliquant sur "Charger les LANG" cela va sur la page qui contient la liste des LANG et affiche ici par des cases.
Une fois sélectionnée une ou plusieurs on clique sur "Mettre à jour" cela décompile les fichiers sélectionnés, si le fichier "items" est présent alors il met également la liste à jour dans la base de donnée en la vidant puis en ajoutant tous les items à nouveau.

Bien plus rapide pour mettre à jour ce que nous utilisons.

J'ai également modifié les endroits des Threads, j'utilise beaucoup de Task en Async sur cette nouvelle version, cela me permet par exemple d'avoir une boucle en pause tant qu'il n'y à pas de packets à lire sans boucler inutilement !

Je fournirais les sources prochainement. Je vais avancer petit à petit chaque jours j'ai trouvé du temps dans mes journées pour pouvoir avancer sur la programmation puisque c'est ce que j'aime ! :)

Le visuel sera à améliorer aussi, je suis mauvais en GUI, je dois ajouter plus d'infos sur les items, les stats aussi à l'avenir.
Je vais beaucoup bosser sur le lecteur de packets, j'ai vu que l'officiel gère lettres par lettres, donc je vais voir.

Une gestion de tous les packets existant ! :)
1707168161337.png

1707168716349.png

Un travail en cours sur les packets (merci à triconix555 pour son partage sur le forum), bien évidemment il y à les nouveaux paquets que j'ai pas encore géré, je m'en occuperais assez rapidement, mais maintenant que j'ai ceci comme base ça ira bien plus vite !

Je travail actuellement sur l'affichage, ce qui est nécessaire, détection de spawn, de personnes sur la map etc etc, pleins de trucs utiles (ou pas) faisable juste en lisant les packets sans jamais associer une écriture ou du botting !
 
Dernière édition:
Haut Bas