Développement d'un addon pour irc avec mytcpmon

Développement d'un AddOn MyTCPMON - Un outil de censure IRC !

Préambule

MyTCPMON est un utilitaire réseau gratuit qui permet de se placer entre deux éléments TCP/IP afin d'observer les échanges de flux.
La version 1.1 permet dorénavant de faire des AddOn qui donne la possibilité d'agir sur le trafic réseau qui transite à travers MyTCPMON.
Dans ce tutoriel, nous allons voir ensemble comment développer en quelques heures un AddOn de censure pour IRC en agissant directement sur les trames réseaux qui transitent entre le serveur IRC et les différents clients.

Présentation du besoin

Je vais vous proposer dans cette partie la conception d'un outil de censure pour le protocole IRC, car je pense que c'est un sujet qui sera à même de couvrir un maximum de cas pour prendre conscience des possibilités offertes par un AddOn MyTCPMON.

Pour ceux qui ne connaisse pas IRC, c'est en gros un protocole texte permettant de faire de la discutions en ligne (T'chat pour les intimes). Un serveur IRC permet donc de créer un système ou d'autres personnes vont se connecter, et pourrons créer des salons de discutions.
Pour plus d'information je vous invites à consulter Wikipedia à ce sujet.

Le but de cet AddOn consiste à faire un module qui sera ineffaçable avec n'importe quelle serveur IRC, et qui donnera la possibilité de nourrir un dictionnaire de mot interdit lors d'une discutions. Ces mots seront remplacés par des étoiles (*) lorsqu'ils apparaitront dans une discutions. Au bout d'un certain seuil de mot interdit, les phrases qui les contiennent ne sont plus transmise sur le salon et l'utilisateur sera averti que son comportement lui fait risquer une déconnexion.
Lorsque le seuil du nombre d'avertissement est atteint, l'utilisateur est déconnecté du serveur.
On peut imaginer par la suite que son adresse IP sera placé dans une liste noire pour lui interdire toute discussion pendant un certain temps. Je vous laisserais le soin de développer cette partie ! car il n'y a pas de raison que se soit toujours les mêmes qui bossent

Définition des spécifications

Notre AddOn doit permettre à l'utilisateur final (celui qui paramétrera MyTCPMON pour s'interfacer avec son serveur IRC) de :
- Créer une liste de mot interdit, avec modification, suppression, etc.
- Définir un caractère de remplacement pour ces mots interdits.
- Définir un seuil du nombre de mot interdits qui donneront lieu à un avertissement.
- Définir un texte d'avertissement.
- Définir un nombre d'avertissement au delà duquel l'utilisateur sera déconnecté.

Voici une maquette rapide réalisé avec mockingbird :

Analyse de protocole

Maintenant que nous avons défini ce dont nous avons besoin, attelons-nous à mettre en place un environnement IRC que nous analyserons.

Dans un premier temps, nous allons installer un serveur IRC sur notre machine, puis connecter deux clients. Le serveur IRC que je propose est Wirc développé par John Joseph en 1997. C'est un vieux serveur qui a le mérite d'être très simple à utiliser. Ceci sera parfait pour notre développement.

NB : Vous noterez que Wirc est un produit payant qui doit être soumis à un enregistrement. Pour notre développement cela ne posera pas de problème car Wirc autorise jusqu'à 10 clients dans sa version de démonstration. Si vous voulez par la suite utiliser un vrai serveur IRC gratuit pour l'environnement Windows, je ne serais que vous conseiller l'excellent IRCD-HYBRID qui est le plus stable et le plus complet des serveur IRC pour Windows (et dieu sait que j'en ai essayé un paquet.)

Fermons cette parenthèse, et démarrons notre serveur IRC.

Le port par défaut des serveur IRC est le port 6667. Vous noterez aussi que Wirc a ouvert le port sur l'interface 192.168.0.26. Pas la peine d'essayer de se connecter sur 127.0.0.1 du fait que le serveur est sur notre machine locale, cela ne fonctionnera pas !

Téléchargeons un client IRC pour nous connecter à notre serveur. Mon choix se porte sur HidraIRC qui est un client complet et gratuit, mais vous pouvez parfaitement passer par un autre client (comme MIRC). cela n'a pas d'importance pour le développement.

Une fois HydraIRC installé, créez une identité, puis demandez la connexion à un serveur.

Ensuite, nous allons nous connecter tout simplement à notre serveur local pour vérifier que tout fonctionne correctement. Indiquez l'adresse IP sur laquelle le serveur est ouvert, puis cliquez sur OK.

Le client demande à rejoindre un channel, ce qui correspond à un salon de discussion. Fermer cette fenêtre pour vous retrouver devant la fenêtre principale de l'application.

Sur le serveur, on peut observer la chose suivante :

Comme vous pouvez le constater, tout fonctionne à merveille. Nous allons maintenant utiliser MyTCPMON pour faire une analyse de protocole lors d'une discussion entre deux personnes sur le même salon.

MyTCPMON

Observation avec MyTCPMON

Pour cette session d'observation, configurez MyTCPMON de la façon suivante :

Source : Serveur TCP/IP en écoute sur le port 111
Destination : Client TCP/IP à destination de 192.168.0.26 sur le port 6667 (qui correspond à notre serveur IRC)

Cliquez ensuite sur "Démarrer".

Ré ouvrez votre client IRC et paramétrez le pour se connecter sur la source de MyTCPMON. (Comme tout à l'heure, mais sur le port 111)

Cliquez sur "OK". Vous observez de l'activité réseau dans MyTCPMON

Très bien ! Connectons nous une nouvelle fois, mais avec un autre utilisateur sur le même serveur. L'objectif étant d'avoir deux clients IRC qui peuvent discuter sur un canal.

Comme vous le voyez dans la capture d'écran, je suis connecté deux fois au serveur avec deux utilisateurs différent : aurelien et aurelien2. je vais maintenant demander à ces deux utilisateur de rejoindre le canal #test

Très bien, maintenant que j'ai join deux utilisateurs au même canal, observons comment se comporte le protocol IRC. je vais envoyer une phrase avec l'utilisateur "aurelien2" et regarder ce que ça génére dans MyTCPMON.

Lorsque j'ai envoyé la phrase "Bonjour !" avec l'utilisateur "aurelien2", une commande "PRIVMSG #test :Bonjour !" a été envoyé au serveur. Ensuite, le serveur a répondu ":aurelien2!aurelien@192.168.0.26 PRIVMSG #test :Bonjour !" ce qui correspond à l'acheminement de la phrase vers l'utilisateur "aurelien".

Si j'envoi maintenant un message privé depuis "aurelien" à "aurelien2", voyons ce que ça donne :

Lors de cet échange, on observe maintenant que la commande "PRIVMSG aurelien2 : coucou" a été envoyé au serveur lorsque l'utilisateur "aurelien" à envoyé un message privé à "aurelien2", en retour le serveur en envoyé une commande ":aurelien!aurelien@192.168.0.26 PRIVMSG aurelien2 :coucou" à destination de l'utilisateur "aurelien2"

Stratégie de mise en oeuvre

Fort de toutes ces observations, nous pouvons faire le constat suivant :

- Lorsque un utilisateur veut discuter sur IRC, une commande PRIVMSG [destination] :[message] est envoyé sur le serveur.[destination] étant soit un cannal de discution (commençant par un #) soit un nom d'utilisateur, et [message] le message a délivrer.
- Une fois la commande reçu, le serveur achemine la commande [utilisateur source]![identification source] PRIVMSG [utilisateur destination] : [message] vers le destinataire du message.

Une observation supplémentaire est à souligner. chaque commande se termine par les caractères 0x0D, 0xOA ce qui correspond à un retour chariot (\r\n pour les intimes)

Pour notre filtrage, il suffit donc d'analyser chaque commande qui commence par le mot clé "PRIVMSG" et d'appliquer notre algorithme de filtrage tel que défini dans les spécifications.

Création de notre AddOn

Il est maintenant temps de passer à la réalisation de notre outil. Pour cela nous allons créer un nouveau projet Visual Studio, et le préparer comme défini dans la page expliquant comment préparer une extension MyTCPMON jusqu'à arriver à ceci :

Préparons notre interface graphique comme défini dans notre spécification.

Passons maintenant au code !

En pseudo UML, voici en gros comment nous allons architecturer notre AddOn

La classe IRCDemo qui contient notre interface graphique communiquera avec une classe UISynchronizedData qui aura pour responsabilité d'enregistrer et restituer les données entrées par l'utilisateur de manière synchronisé.

Pourquoi synchroniser les données ?

Car chaque appel à la fonction ReceivePaquet provient d'un Thread différent ! Dans ce contexte nous ne pouvons pas nous permettre d'aller taper dans des données partagées comme bon nous semble !

La classe UISynchronizedData sera aussi connu d'une autre classe nommé PacketDataManager. Cette classe sera une classe static contenant plusieurs méthodes d'extension qui permettrons de manipuler les paquets reçus depuis MyTCPMON. Ce manager gérera aussi une notion de session afin de mémoriser les compteurs de seuil pour chaque utilisateur qui communique sur le serveur IRC.

OK, en premier lieu, nous allons finaliser l'interface graphique en implémentant sont comportement.


Vous remarquerez que le bouton Apply fait appel à une instance de UISynchronizedData nommé GUIData. Nous enregistrons tous naturellement les éléments fournis par l'utilisateur dans notre gestionnaire de données synchronisé (Thread Safe)

Nous attaquerons ensuite la classe PacketDataManager dont voici les fonctionnalités (allez voir dans le code source du projet pour plus de détail)

Vous remarquerez plusieurs méthodes d'extensions qui permettent de manipuler les données qui transitent à travers l'AddOn, et aussi d'alimenter les informations de session afin d'incrémenter les compteurs de nombre de mots interdits et de nombre d'avertissement délivré à chaque utilisateur.

Une fois ceci fait, il ne reste plus qu'à implémenter les fonctions à redéfinir pour notre AddOn.

L'algorithme est très simple. Lorsque l'on reçoit un paquet, on vérifie si c'est un PRIVMSG, et si le message contient au moins un mot interdit.
Si oui, on test si la source à atteins le seuil d'avertissement. Si c'est le cas, on la déconnecte du serveur.
Si non, on test si la source à atteins le seuil de mots interdits. Si c'est le cas, on ne transfert pas la phrase sur le serveur (Forward = False) et nous renvoyons un paquet de données à l'emetteur du message (ReturnToSender = true).
Les données renvoyé correspondes à un NOTICE qui aura pour effet d'afficher dans la console de l'utilisateur un message spécifique comme s'il venais d'un IRCop.
Et enfin, si aucun seuil n'a été atteins, on cache tous les mots interdits de la phrase en modifiant directement le buffer, puis on transfert à la destination.

Voici ce que ça donne :

Après avoir lancé MyTCPMON et chargé notre AddOn, on ajoute quelques mots dans le dictionnaire, et on clique sur le bouton "Apply"

On se connecte avec deux clients sur le serveur, puis on s'échange quelques mots doux :)

Comme vous pouvez le constater, tous nos mots interdits parviennent au destinataire avec des "*", c'est parce que notre AddOn a modifié le flux de données en temps réel !

Comme prévue dans notre protocole, au bout de 10 gros mots, un message de type NOTICE apparaît :

et les phrases contenant ces mots interdit ne sont plus transmis de l'autre coté.

Lorsque le seuil du nombre d'avertissement, l'utilisateur "aurelien" est déconnecté du serveur :

Et voila !

Grace à MyTCPMON, nous avons étendu les fonctionnalités d'un serveur IRC dont nous n'avons pas le code source, et ce en quelques heures de développement. De plus, notre fonctionnalité est compatible avec tous les serveurs IRC qui respecte la norme. N'est ce pas merveilleux ?

Maintenant que vous avez vu comment faire un AddOn, il n'y a plus qu'a compter sur votre créativité !

Ce document intitulé « Développement d'un addon pour irc avec mytcpmon » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous