Making network protocols go crazy

Aller au contenu | Aller au menu | Aller à la recherche

samedi, décembre 20 2008

Programmez votre Window Manager en Perl. Oui, je suis fou.

Cédant à la pression de sbz, je vais vous parler d'un Window Manager (WM) qu'il est bien. Je fais également fi de ma ligne éditoriale habituelle (on reste tout de même dans le registre de la folie), étant donné que cela n'a pas grand chose à voir avec le networking.

Ce WM n'est autre que wmii. Il est basé sur la bibliothèque libixp, qui elle-même est grandement inspirée de la bibliothèque Plan 9. Ce WM est "programmable" et "tiled".

Le "programmable" signifie qu'on personnalise le WM en écrivant des lignes de code, dans n'importe quel langage implémentant la bibliothèque libixp. Le "tiled" signifie simplement que chaque fenêtre ouverte prendra le maximum de place de la root Window de votre X display.

Ce WM était "programmable" dans presque tous les langages. Je dis bien presque, car seul un petit village gaulois résistait encore. Mais cette fois, il fut vaincu. Le village CPAN fut ainsi envahi par la libixp. J'ai écris le binding Perl pour la bibliothèque libixp afin de personnaliser mon WM du moment en écrivant des lignes de Perl. Je vous laisse admirer le travail.

Oui, je suis fou.

dimanche, novembre 9 2008

Voilà. Injection de packets 802.11 en Perl.

Il existe depuis près de 2 ans un module Perl[1] pour expédier des packets 802.11 dans les airs. Malheureusement, ce module écrit à l'origine par David Leadbeater est maintenant obsolète par rapport à l'API actuelle de Lorcon[2].

Alors je contacte l'auteur du module, et lui demande si il souhaite garder l'ownership du module, lui disant que ça me plairait bien de reprendre le lead sur ce projet. En effet, j'avais déjà écrit la version 0.02 du module, et n'attendais plus que le feu vert. L'auteur accepte avec joie, n'ayant plus d'intérêt pour l'injection 802.11 pour le moment.

So far, so good, la version actualisée supportant plus de drivers Wi-Fi et fonctionnant avec la dernière version SVN (revision 163)[3] est maintenant dispo sur CPAN[4].

Maintenant un exemple, pour vous montrer a quel point c'est facile à utiliser :

use Net::Lorcon qw(:all);

# Injection pour ma carte Intel 3945. Son device est eth1, et le driver requit est iwlwifi
my $tx = Net::Lorcon->new("eth1", "iwlwifi");

$tx->open or die("Impossible d'ouvrir l'interface");
$tx->setfunctionalmode(1);

# Beacon vers le point d'accès ayant pour SSID "Net::Lorcon"
my $packet = "\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x02\x02\xe2\xc4\xef\x00\x02\x
02\xe2\xc4\xef\xd0\xfe\x37\xe0\xae\x0c\x00\x00\x00\x00\x64\x00\x21\x08\x00\x0b\x4e\x65\x
74\x3a\x3a\x4c\x6f\x72\x63\x6f\x6e\x01\x08\x82\x84\x8b\x96\x0c\x12\x18\x24\x03\x01\x0d\x
05\x04\x00\x01\x00\x00\x2a\x01\x00\x32\x04\x30\x48\x60\x6c";

# Et voilà, un packet dans les airs.
$tx->txpacket($packet);

Bon. Reste plus qu'à ajouter le support injection Wi-Fi dans Net::Write[5].

[1] http://search.cpan.org/~dgl/Net-Lorcon-0.01/

[2] http://802.11ninja.net/lorcon

[3] "svn co http://802.11ninja.net/svn/lorcon/trunk/"

[4] http://search.cpan.org/~gomor/Net-Lorcon/

[5] http://search.cpan.org/~gomor/Net-Write/

UPDATE : mon module compile avec la version suivante du SVN de lorcon : svn co http://802.11ninja.net/svn/lorcon/branch/lorcon-old

Pour une version plus récente de lorcon, j'ai un peu de boulot ^^

dimanche, octobre 26 2008

libdnet, mon amie ... pose ce couteau

En utilisant libdnet (version 1.11, la dernière) sous votre OS préféré (heu ... Linux ?), vous êtes probablement déjà tombé sur ce message :

% dnet intf show
lo: flags=0x3<UP,LOOPBACK> mtu 16436
	inet 127.0.0.1/8
	alias ::1
eth0: flags=0x31<UP,BROADCAST,MULTICAST> mtu 1500
	link 00:13:a9:2c:5b:a3
dnet: intf_loop: Invalid argument

Cette situation ne doit pas être une fatalité. Alors ce dimanche, comme j'avais du temps à perdre, et surtout grâce au droit opposable au code incomplet et/ou vieillissant, j'ai pu chercher d'où venait le problème. Premier élément de réponse : la carte suivante devrait être la carte wireless de mon laptop, étant donné que c'est le cas avec ifconfig. En essayant sur une machine sans carte wireless, pas de problème ; toutes les interfaces sont affichées. Il y a de fortes chances que l'erreur soit provoquée lors de la lecture des informations de ma carte wireless.

Deuxième élément de réponse (je vous passe mes sessions de debug du source de libdnet), je finis par tomber la dessus, dans src/intf.c :

if (addr_ston(&ifr.ifr_addr, &entry->intf_link_addr) < 0)
        return (-1);

La fonction addr_ston() retourne -1 lorsqu'elle tombe sur une interface IEEE 802.11. Le problème est du au fait qu'une interface IEEE 802.11 n'est pas pareil qu'une interface ethernet (doh!), par exemple. En effet, la sa_family pour une interface 802.11 possède sa propre valeur (sous Linux, c'est la valeur 801, alors qu'ethernet possède la valeur 1). Reste plus qu'à patcher addr_ston() dans src/addr.c de la façon suivante :

  case AF_UNSPEC:
  case ARP_HRD_ETH:       /* XXX- Linux arp(7) */
+ /* Also defined in net/if_arp.h as ARPHRD_IEEE80211 */
+ case 801:
      a->addr_type = ADDR_TYPE_ETH;
      a->addr_bits = ETH_ADDR_BITS;
      memcpy(&a->addr_eth, sa->sa_data, ETH_ADDR_LEN);
      break;

On compile, on installe, et voilà :

% dnet intf show
lo: flags=0x3<UP,LOOPBACK> mtu 16436
	inet 127.0.0.1/8
	alias ::1
eth0: flags=0x31<UP,BROADCAST,MULTICAST> mtu 1500
	link 00:13:a9:2c:5b:a3
wmaster0: flags=0x31<UP,BROADCAST,MULTICAST> mtu 1500
	link 00:13:02:44:63:2b
eth1: flags=0x31<UP,BROADCAST,MULTICAST> mtu 1500
	link 00:13:02:44:63:2b
wifi0: flags=0x31<UP,BROADCAST,MULTICAST> mtu 1500
	link 00:1e:2a:02:ea:de
ath0: flags=0x31<UP,BROADCAST,MULTICAST> mtu 1500
	inet 192.168.0.101/24
	link 00:1e:2a:02:ea:de
	alias fe80::21e:2aff:fe02:eade/64